blob: d37919e76360f598f2b91fe33bacf29be681ccc4 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600341#ifdef _DEBUG
342 char embedded_code_string[2048];
343 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
344 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
345#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600346 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600347#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600348 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600349 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600350}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700353 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
355 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700356 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600357 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
358 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 }
Tony Barbour300a6082015-04-07 13:44:53 -0600360
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
362 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700363 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600364 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700365 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600366 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700367 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
369 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
370 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700371 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
372 }
373 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
374 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
375 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600376 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
378 InitState(features, flags);
379 }
380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700381 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700382 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600384 std::vector<const char *> instance_layer_names;
385 std::vector<const char *> instance_extension_names;
386 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600387
388 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700389 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600390 /*
391 * Since CreateDbgMsgCallback is an instance level extension call
392 * any extension / layer that utilizes that feature also needs
393 * to be enabled at create instance time.
394 */
Karl Schultz6addd812016-02-02 17:17:23 -0700395 // Use Threading layer first to protect others from
396 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700397 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800399 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700400 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600401 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700402 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600403
Ian Elliott2c1daf52016-05-12 09:41:46 -0600404 if (m_enableWSI) {
405 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
406 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
407#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
408#if defined(VK_USE_PLATFORM_ANDROID_KHR)
409 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_MIR_KHR)
412 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
415 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600417#if defined(VK_USE_PLATFORM_WIN32_KHR)
418 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_WIN32_KHR
420#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600421#if defined(VK_USE_PLATFORM_XCB_KHR)
422 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
423#elif defined(VK_USE_PLATFORM_XLIB_KHR)
424 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700425#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600426 }
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800430 this->app_info.pApplicationName = "layer_tests";
431 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600432 this->app_info.pEngineName = "unittest";
433 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600434 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600435
Tony Barbour15524c32015-04-29 17:34:29 -0600436 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
438
439 virtual void TearDown() {
440 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600441 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600442 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600443 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600446};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600448void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449 // Create identity matrix
450 int i;
451 struct vktriangle_vs_uniform data;
452
453 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700454 glm::mat4 View = glm::mat4(1.0f);
455 glm::mat4 Model = glm::mat4(1.0f);
456 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700458 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
460 memcpy(&data.mvp, &MVP[0][0], matrixSize);
461
Karl Schultz6addd812016-02-02 17:17:23 -0700462 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600463 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464 };
465
Karl Schultz6addd812016-02-02 17:17:23 -0700466 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 data.position[i][0] = tri_data[i].posX;
468 data.position[i][1] = tri_data[i].posY;
469 data.position[i][2] = tri_data[i].posZ;
470 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700471 data.color[i][0] = tri_data[i].r;
472 data.color[i][1] = tri_data[i].g;
473 data.color[i][2] = tri_data[i].b;
474 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475 }
476
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477 ASSERT_NO_FATAL_FAILURE(InitViewport());
478
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200479 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
480 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Karl Schultz6addd812016-02-02 17:17:23 -0700482 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800486 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487 pipelineobj.AddShader(&vs);
488 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 if (failMask & BsoFailLineWidth) {
490 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600492 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
494 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600495 }
496 if (failMask & BsoFailDepthBias) {
497 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600498 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600499 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600500 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600501 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600502 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700504 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700505 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600506 if (failMask & BsoFailViewport) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
508 }
509 if (failMask & BsoFailScissor) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
511 }
512 if (failMask & BsoFailBlend) {
513 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600514 VkPipelineColorBlendAttachmentState att_state = {};
515 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
516 att_state.blendEnable = VK_TRUE;
517 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 }
519 if (failMask & BsoFailDepthBounds) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
521 }
522 if (failMask & BsoFailStencilReadMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
524 }
525 if (failMask & BsoFailStencilWriteMask) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
527 }
528 if (failMask & BsoFailStencilReference) {
529 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
530 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600533 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700536 m_commandBuffer->BeginCommandBuffer();
537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538
Tony Barbourfe3351b2015-07-28 10:17:20 -0600539 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500540
541 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600542 if (failMask & BsoFailIndexBuffer) {
543 // Use DrawIndexed w/o an index buffer bound
544 DrawIndexed(3, 1, 0, 0, 0);
545 } else {
546 Draw(3, 1, 0, 0);
547 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500548
Mark Muellerd4914412016-06-13 17:52:06 -0600549 if (failMask & BsoFailCmdClearAttachments) {
550 VkClearAttachment color_attachment = {};
551 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700552 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600553 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
554
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600555 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600556 }
557
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500558 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700559 m_commandBuffer->EndRenderPass();
560 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600561 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562}
563
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
565 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500568 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600569 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500570 }
571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700573 // Make sure depthWriteEnable is set so that Depth fail test will work
574 // correctly
575 // Make sure stencilTestEnable is set so that Stencil fail test will work
576 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600577 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800578 stencil.failOp = VK_STENCIL_OP_KEEP;
579 stencil.passOp = VK_STENCIL_OP_KEEP;
580 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
581 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600582
583 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
584 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600585 ds_ci.pNext = NULL;
586 ds_ci.depthTestEnable = VK_FALSE;
587 ds_ci.depthWriteEnable = VK_TRUE;
588 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
589 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600590 if (failMask & BsoFailDepthBounds) {
591 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600592 ds_ci.maxDepthBounds = 0.0f;
593 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600594 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600595 ds_ci.stencilTestEnable = VK_TRUE;
596 ds_ci.front = stencil;
597 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600598
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600599 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600600 pipelineobj.SetViewport(m_viewports);
601 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600603 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 commandBuffer->BindPipeline(pipelineobj);
606 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500607}
608
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700610 public:
611 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600612};
613
Ian Elliott2c1daf52016-05-12 09:41:46 -0600614class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
616 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600617 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600618};
619
Mark Muellerdfe37552016-07-07 14:47:42 -0600620class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700621 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600622 enum eTestEnFlags {
623 eDoubleDelete,
624 eInvalidDeviceOffset,
625 eInvalidMemoryOffset,
626 eBindNullBuffer,
627 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600628 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 };
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
634 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635 return true;
636 }
637 VkDeviceSize offset_limit = 0;
638 if (eInvalidMemoryOffset == aTestFlag) {
639 VkBuffer vulkanBuffer;
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600646 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
650 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
652 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600654 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600656 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 }
658 if (eOffsetAlignment < offset_limit) {
659 return true;
660 }
661 return false;
662 }
663
664 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
666 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (eBindNullBuffer == aTestFlag) {
668 VulkanMemory = 0;
669 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
670 } else {
671 VkBufferCreateInfo buffer_create_info = {};
672 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
673 buffer_create_info.size = 32;
674 buffer_create_info.usage = aBufferUsage;
675
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600676 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677
678 CreateCurrent = true;
679
680 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 VkMemoryAllocateInfo memory_allocate_info = {};
684 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800685 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600686 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
687 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 if (!pass) {
689 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
690 return;
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 AllocateCurrent = true;
695 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600696 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
697 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 BoundCurrent = true;
699
700 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
701 }
702 }
703
704 ~VkBufferTest() {
705 if (CreateCurrent) {
706 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
707 }
708 if (AllocateCurrent) {
709 if (InvalidDeleteEn) {
710 union {
711 VkDeviceMemory device_memory;
712 unsigned long long index_access;
713 } bad_index;
714
715 bad_index.device_memory = VulkanMemory;
716 bad_index.index_access++;
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 }
720 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
721 }
722 }
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600725
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600727
728 void TestDoubleDestroy() {
729 // Destroy the buffer but leave the flag set, which will cause
730 // the buffer to be destroyed again in the destructor.
731 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
732 }
733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700734 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600735 bool AllocateCurrent;
736 bool BoundCurrent;
737 bool CreateCurrent;
738 bool InvalidDeleteEn;
739
740 VkBuffer VulkanBuffer;
741 VkDevice VulkanDevice;
742 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600743};
744
745class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600748 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700749 : BoundCurrent(false),
750 AttributeCount(aAttributeCount),
751 BindingCount(aBindingCount),
752 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600754 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
755 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700756 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
759 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
762 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
763 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
764 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
765 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600766
767 unsigned i = 0;
768 do {
769 VertexInputAttributeDescription[i].binding = BindId;
770 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
772 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 i++;
774 } while (AttributeCount < i);
775
776 i = 0;
777 do {
778 VertexInputBindingDescription[i].binding = BindId;
779 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600780 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600781 i++;
782 } while (BindingCount < i);
783 }
784
785 ~VkVerticesObj() {
786 if (VertexInputAttributeDescription) {
787 delete[] VertexInputAttributeDescription;
788 }
789 if (VertexInputBindingDescription) {
790 delete[] VertexInputBindingDescription;
791 }
792 }
793
794 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
796 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 return true;
798 }
799
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600800 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600801 VkDeviceSize *offsetList;
802 unsigned offsetCount;
803
804 if (aOffsetCount) {
805 offsetList = aOffsetList;
806 offsetCount = aOffsetCount;
807 } else {
808 offsetList = new VkDeviceSize[1]();
809 offsetCount = 1;
810 }
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600813 BoundCurrent = true;
814
815 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600817 }
818 }
819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700820 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600821 static uint32_t BindIdGenerator;
822
823 bool BoundCurrent;
824 unsigned AttributeCount;
825 unsigned BindingCount;
826 uint32_t BindId;
827
828 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
829 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
830 VkVertexInputBindingDescription *VertexInputBindingDescription;
831 VkConstantBufferObj VulkanMemoryBuffer;
832};
833
834uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500835// ********************************************************************************************************************
836// ********************************************************************************************************************
837// ********************************************************************************************************************
838// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700840 TEST_DESCRIPTION(
841 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
842 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600843
Tony Barbour1fa09702017-03-16 12:09:08 -0600844 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a pointer to a handle
848 // Expected to trigger an error with
849 // parameter_validation::validate_required_pointer
850 vkGetPhysicalDeviceFeatures(gpu(), NULL);
851 m_errorMonitor->VerifyFound();
852
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
854 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify NULL for pointer to array count
856 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600857 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify 0 for a required array count
862 // Expected to trigger an error with parameter_validation::validate_array
863 VkViewport view_port = {};
864 m_commandBuffer->SetViewport(0, 0, &view_port);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify NULL for a required array
869 // Expected to trigger an error with parameter_validation::validate_array
870 m_commandBuffer->SetViewport(0, 1, NULL);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify VK_NULL_HANDLE for a required handle
875 // Expected to trigger an error with
876 // parameter_validation::validate_required_handle
877 vkUnmapMemory(device(), VK_NULL_HANDLE);
878 m_errorMonitor->VerifyFound();
879
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
881 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882 // Specify VK_NULL_HANDLE for a required handle array entry
883 // Expected to trigger an error with
884 // parameter_validation::validate_required_handle_array
885 VkFence fence = VK_NULL_HANDLE;
886 vkResetFences(device(), 1, &fence);
887 m_errorMonitor->VerifyFound();
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags parameter
899 // Expected to trigger an error with parameter_validation::validate_flags
900 m_commandBuffer->SetStencilReference(0, 0);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600904 // Specify 0 for a required VkFlags array entry
905 // Expected to trigger an error with
906 // parameter_validation::validate_flags_array
907 VkSemaphore semaphore = VK_NULL_HANDLE;
908 VkPipelineStageFlags stageFlags = 0;
909 VkSubmitInfo submitInfo = {};
910 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
911 submitInfo.waitSemaphoreCount = 1;
912 submitInfo.pWaitSemaphores = &semaphore;
913 submitInfo.pWaitDstStageMask = &stageFlags;
914 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600917
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918TEST_F(VkLayerTest, ReservedParameter) {
919 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
920
Tony Barbour1fa09702017-03-16 12:09:08 -0600921 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600922
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600924 // Specify 0 for a reserved VkFlags parameter
925 // Expected to trigger an error with
926 // parameter_validation::validate_reserved_flags
927 VkEvent event_handle = VK_NULL_HANDLE;
928 VkEventCreateInfo event_info = {};
929 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
930 event_info.flags = 1;
931 vkCreateEvent(device(), &event_info, NULL, &event_handle);
932 m_errorMonitor->VerifyFound();
933}
934
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700936 TEST_DESCRIPTION(
937 "Specify an invalid VkStructureType for a Vulkan "
938 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939
Tony Barbour1fa09702017-03-16 12:09:08 -0600940 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600941
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943 // Zero struct memory, effectively setting sType to
944 // VK_STRUCTURE_TYPE_APPLICATION_INFO
945 // Expected to trigger an error with
946 // parameter_validation::validate_struct_type
947 VkMemoryAllocateInfo alloc_info = {};
948 VkDeviceMemory memory = VK_NULL_HANDLE;
949 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
950 m_errorMonitor->VerifyFound();
951
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600953 // Zero struct memory, effectively setting sType to
954 // VK_STRUCTURE_TYPE_APPLICATION_INFO
955 // Expected to trigger an error with
956 // parameter_validation::validate_struct_type_array
957 VkSubmitInfo submit_info = {};
958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
959 m_errorMonitor->VerifyFound();
960}
961
962TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600963 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600964
Tony Barbour1fa09702017-03-16 12:09:08 -0600965 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600966
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600968 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600969 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600970 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600971 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600972 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600973 // Zero-initialization will provide the correct sType
974 VkApplicationInfo app_info = {};
975 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
976 event_alloc_info.pNext = &app_info;
977 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
978 m_errorMonitor->VerifyFound();
979
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
981 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
983 // a function that has allowed pNext structure types and specify
984 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600985 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600987 VkMemoryAllocateInfo memory_alloc_info = {};
988 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
989 memory_alloc_info.pNext = &app_info;
990 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600991 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600992}
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
994TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600995 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600996
Tony Barbour1fa09702017-03-16 12:09:08 -0600997 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "does not fall within the begin..end "
1001 "range of the core VkFormat "
1002 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 // Specify an invalid VkFormat value
1004 // Expected to trigger an error with
1005 // parameter_validation::validate_ranged_enum
1006 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001008 m_errorMonitor->VerifyFound();
1009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001011 // Specify an invalid VkFlags bitmask value
1012 // Expected to trigger an error with parameter_validation::validate_flags
1013 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1015 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001016 m_errorMonitor->VerifyFound();
1017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001019 // Specify an invalid VkFlags array entry
1020 // Expected to trigger an error with
1021 // parameter_validation::validate_flags_array
1022 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001024 VkSubmitInfo submit_info = {};
1025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1026 submit_info.waitSemaphoreCount = 1;
1027 submit_info.pWaitSemaphores = &semaphore;
1028 submit_info.pWaitDstStageMask = &stage_flags;
1029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1030 m_errorMonitor->VerifyFound();
1031
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 // Specify an invalid VkBool32 value
1034 // Expected to trigger a warning with
1035 // parameter_validation::validate_bool32
1036 VkSampler sampler = VK_NULL_HANDLE;
1037 VkSamplerCreateInfo sampler_info = {};
1038 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1039 sampler_info.pNext = NULL;
1040 sampler_info.magFilter = VK_FILTER_NEAREST;
1041 sampler_info.minFilter = VK_FILTER_NEAREST;
1042 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1043 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1044 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1045 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1046 sampler_info.mipLodBias = 1.0;
1047 sampler_info.maxAnisotropy = 1;
1048 sampler_info.compareEnable = VK_FALSE;
1049 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1050 sampler_info.minLod = 1.0;
1051 sampler_info.maxLod = 1.0;
1052 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1053 sampler_info.unnormalizedCoordinates = VK_FALSE;
1054 // Not VK_TRUE or VK_FALSE
1055 sampler_info.anisotropyEnable = 3;
1056 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1057 m_errorMonitor->VerifyFound();
1058}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001059
1060TEST_F(VkLayerTest, FailedReturnValue) {
1061 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1062
Tony Barbour1fa09702017-03-16 12:09:08 -06001063 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001064
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 // Find an unsupported image format
1066 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1067 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1068 VkFormat format = static_cast<VkFormat>(f);
1069 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001070 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001071 unsupported = format;
1072 break;
1073 }
1074 }
1075
1076 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1078 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001079 // Specify an unsupported VkFormat value to generate a
1080 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1081 // Expected to trigger a warning from
1082 // parameter_validation::validate_result
1083 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001084 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1085 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001086 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1087 m_errorMonitor->VerifyFound();
1088 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001089}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090
1091TEST_F(VkLayerTest, UpdateBufferAlignment) {
1092 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094
Tony Barbour1fa09702017-03-16 12:09:08 -06001095 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096
1097 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1098 vk_testing::Buffer buffer;
1099 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1100
Tony Barbour552f6c02016-12-21 14:34:07 -07001101 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001102 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using dataSize that is < 0
1113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001114 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1116 m_errorMonitor->VerifyFound();
1117
1118 // Introduce failure by using dataSize that is > 65536
1119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001120 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001121 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1122 m_errorMonitor->VerifyFound();
1123
Tony Barbour552f6c02016-12-21 14:34:07 -07001124 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125}
1126
1127TEST_F(VkLayerTest, FillBufferAlignment) {
1128 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1129
Tony Barbour1fa09702017-03-16 12:09:08 -06001130 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001131
1132 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1133 vk_testing::Buffer buffer;
1134 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1135
Tony Barbour552f6c02016-12-21 14:34:07 -07001136 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001137
1138 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001140 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1141 m_errorMonitor->VerifyFound();
1142
1143 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001145 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1146 m_errorMonitor->VerifyFound();
1147
1148 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001150 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1151 m_errorMonitor->VerifyFound();
1152
Tony Barbour552f6c02016-12-21 14:34:07 -07001153 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001154}
Dustin Graves40f35822016-06-23 11:12:53 -06001155
Cortd889ff92016-07-27 09:51:27 -07001156TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1157 VkResult err;
1158
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001159 TEST_DESCRIPTION(
1160 "Attempt to use a non-solid polygon fill mode in a "
1161 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001162
Tony Barbour1fa09702017-03-16 12:09:08 -06001163 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1165
1166 std::vector<const char *> device_extension_names;
1167 auto features = m_device->phy().features();
1168 // Artificially disable support for non-solid fill modes
1169 features.fillModeNonSolid = false;
1170 // The sacrificial device object
1171 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1172
1173 VkRenderpassObj render_pass(&test_device);
1174
1175 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1176 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1177 pipeline_layout_ci.setLayoutCount = 0;
1178 pipeline_layout_ci.pSetLayouts = NULL;
1179
1180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001181 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001182 ASSERT_VK_SUCCESS(err);
1183
1184 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1185 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1186 rs_ci.pNext = nullptr;
1187 rs_ci.lineWidth = 1.0f;
1188 rs_ci.rasterizerDiscardEnable = true;
1189
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001190 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1191 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001192
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001193 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1195 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001196 {
1197 VkPipelineObj pipe(&test_device);
1198 pipe.AddShader(&vs);
1199 pipe.AddShader(&fs);
1200 pipe.AddColorAttachment();
1201 // Introduce failure by setting unsupported polygon mode
1202 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1203 pipe.SetRasterization(&rs_ci);
1204 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1205 }
1206 m_errorMonitor->VerifyFound();
1207
1208 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1210 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001211 {
1212 VkPipelineObj pipe(&test_device);
1213 pipe.AddShader(&vs);
1214 pipe.AddShader(&fs);
1215 pipe.AddColorAttachment();
1216 // Introduce failure by setting unsupported polygon mode
1217 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1218 pipe.SetRasterization(&rs_ci);
1219 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1220 }
1221 m_errorMonitor->VerifyFound();
1222
Cortd889ff92016-07-27 09:51:27 -07001223 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1224}
1225
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001226#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001228{
1229 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001230 VkFenceCreateInfo fenceInfo = {};
1231 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1232 fenceInfo.pNext = NULL;
1233 fenceInfo.flags = 0;
1234
Mike Weiblencce7ec72016-10-17 19:33:05 -06001235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001236
Tony Barbour1fa09702017-03-16 12:09:08 -06001237 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001238
1239 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1240 vk_testing::Buffer buffer;
1241 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242
Tony Barbourfe3351b2015-07-28 10:17:20 -06001243 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001244 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001245 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
1247 testFence.init(*m_device, fenceInfo);
1248
1249 // Bypass framework since it does the waits automatically
1250 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001251 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001252 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1253 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001254 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001255 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001256 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001257 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001258 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001259 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001260 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001261
1262 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263 ASSERT_VK_SUCCESS( err );
1264
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001265 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001266 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001268 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001269}
1270
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001271TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001272{
1273 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 VkFenceCreateInfo fenceInfo = {};
1275 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1276 fenceInfo.pNext = NULL;
1277 fenceInfo.flags = 0;
1278
Mike Weiblencce7ec72016-10-17 19:33:05 -06001279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001280
Tony Barbour1fa09702017-03-16 12:09:08 -06001281 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001282 ASSERT_NO_FATAL_FAILURE(InitViewport());
1283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1284
Tony Barbourfe3351b2015-07-28 10:17:20 -06001285 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001286 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001287 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001288
1289 testFence.init(*m_device, fenceInfo);
1290
1291 // Bypass framework since it does the waits automatically
1292 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001293 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001294 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1295 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001296 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001297 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001298 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001299 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001300 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001301 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001302 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001303
1304 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001305 ASSERT_VK_SUCCESS( err );
1306
Jon Ashburnf19916e2016-01-11 13:12:43 -07001307 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001308 VkCommandBufferBeginInfo info = {};
1309 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1310 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001311 info.renderPass = VK_NULL_HANDLE;
1312 info.subpass = 0;
1313 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001314 info.occlusionQueryEnable = VK_FALSE;
1315 info.queryFlags = 0;
1316 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001317
1318 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001319 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001320
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001321 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001322}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001323#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001324
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001325TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1326 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1327
Tony Barbour1fa09702017-03-16 12:09:08 -06001328 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001329
1330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1331 VkBuffer buffer;
1332 VkBufferCreateInfo buf_info = {};
1333 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1334 buf_info.pNext = NULL;
1335 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1336 buf_info.size = 2048;
1337 buf_info.queueFamilyIndexCount = 0;
1338 buf_info.pQueueFamilyIndices = NULL;
1339 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1340 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1341 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1342 m_errorMonitor->VerifyFound();
1343
1344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1345 VkImage image;
1346 VkImageCreateInfo image_create_info = {};
1347 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1348 image_create_info.pNext = NULL;
1349 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1350 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1351 image_create_info.extent.width = 512;
1352 image_create_info.extent.height = 64;
1353 image_create_info.extent.depth = 1;
1354 image_create_info.mipLevels = 1;
1355 image_create_info.arrayLayers = 1;
1356 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1357 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1358 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1359 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1360 image_create_info.queueFamilyIndexCount = 0;
1361 image_create_info.pQueueFamilyIndices = NULL;
1362 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1363 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1364 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1365 m_errorMonitor->VerifyFound();
1366}
1367
Dave Houlton829c0d82017-01-24 15:09:17 -07001368TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1369 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1370
1371 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001372 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001373 ASSERT_NO_FATAL_FAILURE(
1374 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001375 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001376
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001377 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001378 device_features.sparseResidencyImage2D = VK_FALSE;
1379 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001380 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001381
1382 VkImage image = VK_NULL_HANDLE;
1383 VkResult result = VK_RESULT_MAX_ENUM;
1384 VkImageCreateInfo image_create_info = {};
1385 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1386 image_create_info.pNext = NULL;
1387 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1388 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1389 image_create_info.extent.width = 512;
1390 image_create_info.extent.height = 1;
1391 image_create_info.extent.depth = 1;
1392 image_create_info.mipLevels = 1;
1393 image_create_info.arrayLayers = 1;
1394 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1395 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1396 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1397 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1398 image_create_info.queueFamilyIndexCount = 0;
1399 image_create_info.pQueueFamilyIndices = NULL;
1400 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1401 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1402
1403 // 1D image w/ sparse residency is an error
1404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1405 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1406 m_errorMonitor->VerifyFound();
1407 if (VK_SUCCESS == result) {
1408 vkDestroyImage(m_device->device(), image, NULL);
1409 image = VK_NULL_HANDLE;
1410 }
1411
1412 // 2D image w/ sparse residency when feature isn't available
1413 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1414 image_create_info.extent.height = 64;
1415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1416 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1417 m_errorMonitor->VerifyFound();
1418 if (VK_SUCCESS == result) {
1419 vkDestroyImage(m_device->device(), image, NULL);
1420 image = VK_NULL_HANDLE;
1421 }
1422
1423 // 3D image w/ sparse residency when feature isn't available
1424 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1425 image_create_info.extent.depth = 8;
1426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1427 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1428 m_errorMonitor->VerifyFound();
1429 if (VK_SUCCESS == result) {
1430 vkDestroyImage(m_device->device(), image, NULL);
1431 image = VK_NULL_HANDLE;
1432 }
1433}
1434
1435TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1436 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1437
1438 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001439 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001440 ASSERT_NO_FATAL_FAILURE(
1441 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001442 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001443
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001444 // These tests require that the device support sparse residency for 2D images
1445 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1446 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001447 return;
1448 }
1449
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001450 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001451 device_features.sparseResidency2Samples = VK_FALSE;
1452 device_features.sparseResidency4Samples = VK_FALSE;
1453 device_features.sparseResidency8Samples = VK_FALSE;
1454 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001455 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001456
1457 VkImage image = VK_NULL_HANDLE;
1458 VkResult result = VK_RESULT_MAX_ENUM;
1459 VkImageCreateInfo image_create_info = {};
1460 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1461 image_create_info.pNext = NULL;
1462 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1463 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1464 image_create_info.extent.width = 64;
1465 image_create_info.extent.height = 64;
1466 image_create_info.extent.depth = 1;
1467 image_create_info.mipLevels = 1;
1468 image_create_info.arrayLayers = 1;
1469 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1470 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1471 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1472 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1473 image_create_info.queueFamilyIndexCount = 0;
1474 image_create_info.pQueueFamilyIndices = NULL;
1475 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1476 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1477
1478 // 2D image w/ sparse residency and linear tiling is an error
1479 m_errorMonitor->SetDesiredFailureMsg(
1480 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1481 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1482 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1483 m_errorMonitor->VerifyFound();
1484 if (VK_SUCCESS == result) {
1485 vkDestroyImage(m_device->device(), image, NULL);
1486 image = VK_NULL_HANDLE;
1487 }
1488 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1489
1490 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1491 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1493 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1494 m_errorMonitor->VerifyFound();
1495 if (VK_SUCCESS == result) {
1496 vkDestroyImage(m_device->device(), image, NULL);
1497 image = VK_NULL_HANDLE;
1498 }
1499
1500 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1502 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1503 m_errorMonitor->VerifyFound();
1504 if (VK_SUCCESS == result) {
1505 vkDestroyImage(m_device->device(), image, NULL);
1506 image = VK_NULL_HANDLE;
1507 }
1508
1509 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1511 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1512 m_errorMonitor->VerifyFound();
1513 if (VK_SUCCESS == result) {
1514 vkDestroyImage(m_device->device(), image, NULL);
1515 image = VK_NULL_HANDLE;
1516 }
1517
1518 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1520 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1521 m_errorMonitor->VerifyFound();
1522 if (VK_SUCCESS == result) {
1523 vkDestroyImage(m_device->device(), image, NULL);
1524 image = VK_NULL_HANDLE;
1525 }
1526}
1527
Tobin Ehlisf11be982016-05-11 13:52:53 -06001528TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001529 TEST_DESCRIPTION(
1530 "Create a buffer and image, allocate memory, and bind the "
1531 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001532 VkResult err;
1533 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001534 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
Tobin Ehlis077ded32016-05-12 17:39:13 -06001536 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001537 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001538 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001539 VkDeviceMemory mem; // buffer will be bound first
1540 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001541 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001542 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001543
1544 VkBufferCreateInfo buf_info = {};
1545 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1546 buf_info.pNext = NULL;
1547 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1548 buf_info.size = 256;
1549 buf_info.queueFamilyIndexCount = 0;
1550 buf_info.pQueueFamilyIndices = NULL;
1551 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1552 buf_info.flags = 0;
1553 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1554 ASSERT_VK_SUCCESS(err);
1555
Tobin Ehlis077ded32016-05-12 17:39:13 -06001556 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001557
1558 VkImageCreateInfo image_create_info = {};
1559 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1560 image_create_info.pNext = NULL;
1561 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1562 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1563 image_create_info.extent.width = 64;
1564 image_create_info.extent.height = 64;
1565 image_create_info.extent.depth = 1;
1566 image_create_info.mipLevels = 1;
1567 image_create_info.arrayLayers = 1;
1568 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001569 // Image tiling must be optimal to trigger error when aliasing linear buffer
1570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1572 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1573 image_create_info.queueFamilyIndexCount = 0;
1574 image_create_info.pQueueFamilyIndices = NULL;
1575 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1576 image_create_info.flags = 0;
1577
Tobin Ehlisf11be982016-05-11 13:52:53 -06001578 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1579 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1581 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001582
Tobin Ehlis077ded32016-05-12 17:39:13 -06001583 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1584
1585 VkMemoryAllocateInfo alloc_info = {};
1586 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1587 alloc_info.pNext = NULL;
1588 alloc_info.memoryTypeIndex = 0;
1589 // Ensure memory is big enough for both bindings
1590 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001591 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1592 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 return;
1598 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1600 ASSERT_VK_SUCCESS(err);
1601 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1602 ASSERT_VK_SUCCESS(err);
1603
Rene Lindsayd14f5572016-12-16 14:57:18 -07001604 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1605
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001607 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001608 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1609 m_errorMonitor->VerifyFound();
1610
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001611 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001612 // aliasing buffer2
1613 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1614 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001615 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1616 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001617 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001618 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001620 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001621 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001622 m_errorMonitor->VerifyFound();
1623
1624 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001625 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001626 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001627 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001628 vkFreeMemory(m_device->device(), mem, NULL);
1629 vkFreeMemory(m_device->device(), mem_img, NULL);
1630}
1631
Tobin Ehlis35372522016-05-12 08:32:31 -06001632TEST_F(VkLayerTest, InvalidMemoryMapping) {
1633 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1634 VkResult err;
1635 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001636 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001637
1638 VkBuffer buffer;
1639 VkDeviceMemory mem;
1640 VkMemoryRequirements mem_reqs;
1641
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001642 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1643
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 VkBufferCreateInfo buf_info = {};
1645 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1646 buf_info.pNext = NULL;
1647 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1648 buf_info.size = 256;
1649 buf_info.queueFamilyIndexCount = 0;
1650 buf_info.pQueueFamilyIndices = NULL;
1651 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1652 buf_info.flags = 0;
1653 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1654 ASSERT_VK_SUCCESS(err);
1655
1656 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1657 VkMemoryAllocateInfo alloc_info = {};
1658 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1659 alloc_info.pNext = NULL;
1660 alloc_info.memoryTypeIndex = 0;
1661
1662 // Ensure memory is big enough for both bindings
1663 static const VkDeviceSize allocation_size = 0x10000;
1664 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001665 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001666 if (!pass) {
1667 vkDestroyBuffer(m_device->device(), buffer, NULL);
1668 return;
1669 }
1670 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1671 ASSERT_VK_SUCCESS(err);
1672
1673 uint8_t *pData;
1674 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1677 m_errorMonitor->VerifyFound();
1678 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001679 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1682 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1683 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001684 m_errorMonitor->VerifyFound();
1685
1686 // Unmap the memory to avoid re-map error
1687 vkUnmapMemory(m_device->device(), mem);
1688 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1690 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1691 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001692 m_errorMonitor->VerifyFound();
1693 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1695 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001696 m_errorMonitor->VerifyFound();
1697 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkUnmapMemory(m_device->device(), mem);
1700 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001701
Tobin Ehlis35372522016-05-12 08:32:31 -06001702 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001704 ASSERT_VK_SUCCESS(err);
1705 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001706 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001707 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001708 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001710 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1711 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001712
Tobin Ehlis35372522016-05-12 08:32:31 -06001713 // Now flush range that oversteps mapped range
1714 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001715 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001716 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001717 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001718 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1720 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1721 m_errorMonitor->VerifyFound();
1722
1723 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1724 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001725 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001726 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001727 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001728 mmr.size = VK_WHOLE_SIZE;
1729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001730 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1731 m_errorMonitor->VerifyFound();
1732
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001733#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001734 // Some platforms have an atomsize of 1 which makes the test meaningless
1735 if (atom_size > 3) {
1736 // Now with an offset NOT a multiple of the device limit
1737 vkUnmapMemory(m_device->device(), mem);
1738 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1739 ASSERT_VK_SUCCESS(err);
1740 mmr.offset = 3; // Not a multiple of atom_size
1741 mmr.size = VK_WHOLE_SIZE;
1742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1743 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1744 m_errorMonitor->VerifyFound();
1745
1746 // Now with a size NOT a multiple of the device limit
1747 vkUnmapMemory(m_device->device(), mem);
1748 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1749 ASSERT_VK_SUCCESS(err);
1750 mmr.offset = atom_size;
1751 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1753 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1754 m_errorMonitor->VerifyFound();
1755 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001756#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001757 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1758 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001759 if (!pass) {
1760 vkFreeMemory(m_device->device(), mem, NULL);
1761 vkDestroyBuffer(m_device->device(), buffer, NULL);
1762 return;
1763 }
1764 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1765 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1766
1767 vkDestroyBuffer(m_device->device(), buffer, NULL);
1768 vkFreeMemory(m_device->device(), mem, NULL);
1769}
1770
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001771#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001772TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1773 VkResult err;
1774 bool pass;
1775
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001776 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1777 // following declaration (which is temporarily being moved below):
1778 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001779 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001780 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001781 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001782 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001783 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001784 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001785
Tony Barbour1fa09702017-03-16 12:09:08 -06001786 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001787
Ian Elliott3f06ce52016-04-29 14:46:21 -06001788#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1789#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1790 // Use the functions from the VK_KHR_android_surface extension without
1791 // enabling that extension:
1792
1793 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001794 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1796 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001797 pass = (err != VK_SUCCESS);
1798 ASSERT_TRUE(pass);
1799 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001800#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001801
Ian Elliott3f06ce52016-04-29 14:46:21 -06001802#if defined(VK_USE_PLATFORM_MIR_KHR)
1803 // Use the functions from the VK_KHR_mir_surface extension without enabling
1804 // that extension:
1805
1806 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001807 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1810 pass = (err != VK_SUCCESS);
1811 ASSERT_TRUE(pass);
1812 m_errorMonitor->VerifyFound();
1813
1814 // Tell whether an mir_connection supports presentation:
1815 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1817 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001819#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001820
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1822 // Use the functions from the VK_KHR_wayland_surface extension without
1823 // enabling that extension:
1824
1825 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001826 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1828 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001829 pass = (err != VK_SUCCESS);
1830 ASSERT_TRUE(pass);
1831 m_errorMonitor->VerifyFound();
1832
1833 // Tell whether an wayland_display supports presentation:
1834 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1836 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001838#endif // VK_USE_PLATFORM_WAYLAND_KHR
1839#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001840
Ian Elliott3f06ce52016-04-29 14:46:21 -06001841#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001845 // Use the functions from the VK_KHR_win32_surface extension without
1846 // enabling that extension:
1847
1848 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001849 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1851 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001852 pass = (err != VK_SUCCESS);
1853 ASSERT_TRUE(pass);
1854 m_errorMonitor->VerifyFound();
1855
1856 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001858 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001860// Set this (for now, until all platforms are supported and tested):
1861#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001862#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001863#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001864 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1865 // TO NON-LINUX PLATFORMS:
1866 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001867#endif
1868#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001869 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001875 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001881 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001882 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1884 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001889
Ian Elliott12630812016-04-29 14:35:43 -06001890#if defined(VK_USE_PLATFORM_XLIB_KHR)
1891 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1892 // that extension:
1893
1894 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001895 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001897 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1898 pass = (err != VK_SUCCESS);
1899 ASSERT_TRUE(pass);
1900 m_errorMonitor->VerifyFound();
1901
1902 // Tell whether an Xlib VisualID supports presentation:
1903 Display *dpy = NULL;
1904 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001906 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1907 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001908// Set this (for now, until all platforms are supported and tested):
1909#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001910#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001911
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001912// Use the functions from the VK_KHR_surface extension without enabling
1913// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001914
Ian Elliott489eec02016-05-05 14:12:44 -06001915#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001916 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001918 vkDestroySurfaceKHR(instance(), surface, NULL);
1919 m_errorMonitor->VerifyFound();
1920
1921 // Check if surface supports presentation:
1922 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001924 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1925 pass = (err != VK_SUCCESS);
1926 ASSERT_TRUE(pass);
1927 m_errorMonitor->VerifyFound();
1928
1929 // Check surface capabilities:
1930 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1932 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Check surface formats:
1938 uint32_t format_count = 0;
1939 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1941 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Check surface present modes:
1947 uint32_t present_mode_count = 0;
1948 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1950 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001951 pass = (err != VK_SUCCESS);
1952 ASSERT_TRUE(pass);
1953 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001954#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001955
Ian Elliott1c32c772016-04-28 14:47:13 -06001956 // Use the functions from the VK_KHR_swapchain extension without enabling
1957 // that extension:
1958
1959 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1962 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001963 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001964 pass = (err != VK_SUCCESS);
1965 ASSERT_TRUE(pass);
1966 m_errorMonitor->VerifyFound();
1967
1968 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1970 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001971 pass = (err != VK_SUCCESS);
1972 ASSERT_TRUE(pass);
1973 m_errorMonitor->VerifyFound();
1974
Chris Forbeseb7d5502016-09-13 18:19:21 +12001975 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1976 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1977 VkFence fence;
1978 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1979
Ian Elliott1c32c772016-04-28 14:47:13 -06001980 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001982 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001983 pass = (err != VK_SUCCESS);
1984 ASSERT_TRUE(pass);
1985 m_errorMonitor->VerifyFound();
1986
Chris Forbeseb7d5502016-09-13 18:19:21 +12001987 vkDestroyFence(m_device->device(), fence, nullptr);
1988
Ian Elliott1c32c772016-04-28 14:47:13 -06001989 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001990 //
1991 // NOTE: Currently can't test this because a real swapchain is needed (as
1992 // opposed to the fake one we created) in order for the layer to lookup the
1993 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001994
1995 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001997 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1998 m_errorMonitor->VerifyFound();
1999}
Chris Forbes09368e42016-10-13 11:59:22 +13002000#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06002001
Karl Schultz6addd812016-02-02 17:17:23 -07002002TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2003 VkResult err;
2004 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002005
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2007 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002008
Tony Barbour1fa09702017-03-16 12:09:08 -06002009 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002010
2011 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002012 VkImage image;
2013 VkDeviceMemory mem;
2014 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002015
Karl Schultz6addd812016-02-02 17:17:23 -07002016 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2017 const int32_t tex_width = 32;
2018 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002019
Tony Barboureb254902015-07-15 12:50:33 -06002020 VkImageCreateInfo image_create_info = {};
2021 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002022 image_create_info.pNext = NULL;
2023 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2024 image_create_info.format = tex_format;
2025 image_create_info.extent.width = tex_width;
2026 image_create_info.extent.height = tex_height;
2027 image_create_info.extent.depth = 1;
2028 image_create_info.mipLevels = 1;
2029 image_create_info.arrayLayers = 1;
2030 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2031 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2032 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2033 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002034 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002035
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002036 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002037 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002038 mem_alloc.pNext = NULL;
2039 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040
Chia-I Wuf7458c52015-10-26 21:10:41 +08002041 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002042 ASSERT_VK_SUCCESS(err);
2043
Karl Schultz6addd812016-02-02 17:17:23 -07002044 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002045
Mark Lobodzinski23065352015-05-29 09:32:35 -05002046 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002047
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002048 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002049 if (!pass) { // If we can't find any unmappable memory this test doesn't
2050 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002051 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002052 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002053 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002054
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002055 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002056 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002057 ASSERT_VK_SUCCESS(err);
2058
2059 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002060 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002061 ASSERT_VK_SUCCESS(err);
2062
2063 // Map memory as if to initialize the image
2064 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002065 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002066
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002067 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002068
Chia-I Wuf7458c52015-10-26 21:10:41 +08002069 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002070 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002071}
2072
Karl Schultz6addd812016-02-02 17:17:23 -07002073TEST_F(VkLayerTest, RebindMemory) {
2074 VkResult err;
2075 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002078
Tony Barbour1fa09702017-03-16 12:09:08 -06002079 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002080
2081 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002082 VkImage image;
2083 VkDeviceMemory mem1;
2084 VkDeviceMemory mem2;
2085 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2088 const int32_t tex_width = 32;
2089 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002090
Tony Barboureb254902015-07-15 12:50:33 -06002091 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002092 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2093 image_create_info.pNext = NULL;
2094 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2095 image_create_info.format = tex_format;
2096 image_create_info.extent.width = tex_width;
2097 image_create_info.extent.height = tex_height;
2098 image_create_info.extent.depth = 1;
2099 image_create_info.mipLevels = 1;
2100 image_create_info.arrayLayers = 1;
2101 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2102 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2103 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2104 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002105
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002106 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002107 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2108 mem_alloc.pNext = NULL;
2109 mem_alloc.allocationSize = 0;
2110 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce failure, do NOT set memProps to
2113 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002114 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002115 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002116 ASSERT_VK_SUCCESS(err);
2117
Karl Schultz6addd812016-02-02 17:17:23 -07002118 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002119
2120 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002121 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002122 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002123
2124 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002125 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002126 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002127 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002128 ASSERT_VK_SUCCESS(err);
2129
2130 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002131 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002132 ASSERT_VK_SUCCESS(err);
2133
Karl Schultz6addd812016-02-02 17:17:23 -07002134 // Introduce validation failure, try to bind a different memory object to
2135 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002136 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002137
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002138 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002139
Chia-I Wuf7458c52015-10-26 21:10:41 +08002140 vkDestroyImage(m_device->device(), image, NULL);
2141 vkFreeMemory(m_device->device(), mem1, NULL);
2142 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002143}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002144
Karl Schultz6addd812016-02-02 17:17:23 -07002145TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002146 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002147
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2149 "submitted in SIGNALED state. Fences "
2150 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002151
2152 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002153 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2154 fenceInfo.pNext = NULL;
2155 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002156
Tony Barbour1fa09702017-03-16 12:09:08 -06002157 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002158 ASSERT_NO_FATAL_FAILURE(InitViewport());
2159 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2160
Tony Barbour552f6c02016-12-21 14:34:07 -07002161 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002163 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002164
2165 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002166
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002167 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002168 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2169 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002170 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002171 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002172 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002173 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002174 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002175 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002176 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002177
2178 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002179 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002180
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002181 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002182}
Chris Forbes4e44c912016-06-16 10:20:00 +12002183
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002184TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002185 TEST_DESCRIPTION(
2186 "Specify wrong usage for image then create conflicting view of image "
2187 "Initialize buffer with wrong usage then perform copy expecting errors "
2188 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002190
Tony Barbour1fa09702017-03-16 12:09:08 -06002191 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002192 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002193 if (!format) {
2194 printf(" No Depth + Stencil format found. Skipped.\n");
2195 return;
2196 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002197
Tony Barbourf92621a2016-05-02 14:28:12 -06002198 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002199 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002200 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002201 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002202
Tony Barbourf92621a2016-05-02 14:28:12 -06002203 VkImageView dsv;
2204 VkImageViewCreateInfo dsvci = {};
2205 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2206 dsvci.image = image.handle();
2207 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002208 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002209 dsvci.subresourceRange.layerCount = 1;
2210 dsvci.subresourceRange.baseMipLevel = 0;
2211 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002212 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002213
Tony Barbourf92621a2016-05-02 14:28:12 -06002214 // Create a view with depth / stencil aspect for image with different usage
2215 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002217 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002218
2219 // Initialize buffer with TRANSFER_DST usage
2220 vk_testing::Buffer buffer;
2221 VkMemoryPropertyFlags reqs = 0;
2222 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2223 VkBufferImageCopy region = {};
2224 region.bufferRowLength = 128;
2225 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002226 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002227 region.imageSubresource.layerCount = 1;
2228 region.imageExtent.height = 16;
2229 region.imageExtent.width = 16;
2230 region.imageExtent.depth = 1;
2231
Mark Lobodzinski80871462017-02-16 10:37:27 -07002232 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002233 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002234
Chris Forbesda581202016-10-06 18:25:26 +13002235 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Chris Forbesda581202016-10-06 18:25:26 +13002238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002239 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2240 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002241 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002242}
Tony Barbour75d79f02016-08-30 09:39:07 -06002243
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002244TEST_F(VkLayerTest, LeakAnObject) {
2245 VkResult err;
2246
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002247 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002248
2249 // Note that we have to create a new device since destroying the
2250 // framework's device causes Teardown() to fail and just calling Teardown
2251 // will destroy the errorMonitor.
2252
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002254
Tony Barbour1fa09702017-03-16 12:09:08 -06002255 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002256
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002257 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002258 std::vector<VkDeviceQueueCreateInfo> queue_info;
2259 queue_info.reserve(queue_props.size());
2260 std::vector<std::vector<float>> queue_priorities;
2261 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2262 VkDeviceQueueCreateInfo qi = {};
2263 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2264 qi.pNext = NULL;
2265 qi.queueFamilyIndex = i;
2266 qi.queueCount = queue_props[i].queueCount;
2267 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2268 qi.pQueuePriorities = queue_priorities[i].data();
2269 queue_info.push_back(qi);
2270 }
2271
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002272 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002273
2274 // The sacrificial device object
2275 VkDevice testDevice;
2276 VkDeviceCreateInfo device_create_info = {};
2277 auto features = m_device->phy().features();
2278 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2279 device_create_info.pNext = NULL;
2280 device_create_info.queueCreateInfoCount = queue_info.size();
2281 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002282 device_create_info.enabledLayerCount = 0;
2283 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284 device_create_info.pEnabledFeatures = &features;
2285 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2286 ASSERT_VK_SUCCESS(err);
2287
2288 VkFence fence;
2289 VkFenceCreateInfo fence_create_info = {};
2290 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2291 fence_create_info.pNext = NULL;
2292 fence_create_info.flags = 0;
2293 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2294 ASSERT_VK_SUCCESS(err);
2295
2296 // Induce failure by not calling vkDestroyFence
2297 vkDestroyDevice(testDevice, NULL);
2298 m_errorMonitor->VerifyFound();
2299}
2300
2301TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002302 TEST_DESCRIPTION(
2303 "Allocate command buffers from one command pool and "
2304 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Tony Barbour1fa09702017-03-16 12:09:08 -06002308 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309 VkCommandPool command_pool_one;
2310 VkCommandPool command_pool_two;
2311
2312 VkCommandPoolCreateInfo pool_create_info{};
2313 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2314 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2315 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2316
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002317 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002318
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002319 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002320
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002321 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002325 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002327 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002328
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002329 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002330
2331 m_errorMonitor->VerifyFound();
2332
2333 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2334 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2335}
2336
2337TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2338 VkResult err;
2339
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002340 TEST_DESCRIPTION(
2341 "Allocate descriptor sets from one DS pool and "
2342 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002343
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002345
Tony Barbour1fa09702017-03-16 12:09:08 -06002346 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2348
2349 VkDescriptorPoolSize ds_type_count = {};
2350 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2351 ds_type_count.descriptorCount = 1;
2352
2353 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2354 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2355 ds_pool_ci.pNext = NULL;
2356 ds_pool_ci.flags = 0;
2357 ds_pool_ci.maxSets = 1;
2358 ds_pool_ci.poolSizeCount = 1;
2359 ds_pool_ci.pPoolSizes = &ds_type_count;
2360
2361 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 // Create a second descriptor pool
2366 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002367 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002368 ASSERT_VK_SUCCESS(err);
2369
2370 VkDescriptorSetLayoutBinding dsl_binding = {};
2371 dsl_binding.binding = 0;
2372 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2373 dsl_binding.descriptorCount = 1;
2374 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2375 dsl_binding.pImmutableSamplers = NULL;
2376
2377 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2378 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2379 ds_layout_ci.pNext = NULL;
2380 ds_layout_ci.bindingCount = 1;
2381 ds_layout_ci.pBindings = &dsl_binding;
2382
2383 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002385 ASSERT_VK_SUCCESS(err);
2386
2387 VkDescriptorSet descriptorSet;
2388 VkDescriptorSetAllocateInfo alloc_info = {};
2389 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2390 alloc_info.descriptorSetCount = 1;
2391 alloc_info.descriptorPool = ds_pool_one;
2392 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002394 ASSERT_VK_SUCCESS(err);
2395
2396 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2397
2398 m_errorMonitor->VerifyFound();
2399
2400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2401 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2402 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2403}
2404
2405TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002407
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002408 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002409
Tony Barbour1fa09702017-03-16 12:09:08 -06002410 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002411
2412 // Pass bogus handle into GetImageMemoryRequirements
2413 VkMemoryRequirements mem_reqs;
2414 uint64_t fakeImageHandle = 0xCADECADE;
2415 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2416
2417 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2418
2419 m_errorMonitor->VerifyFound();
2420}
2421
Mike Schuchardt17838902017-02-21 09:48:06 -07002422TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2423 TEST_DESCRIPTION(
2424 "Try to destroy a render pass object using a device other than the one it was created on. "
2425 "This should generate a distinct error from the invalid handle error.");
2426 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002427 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2429
2430 // Create second device
2431 float priorities[] = {1.0f};
2432 VkDeviceQueueCreateInfo queue_info{};
2433 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2434 queue_info.pNext = NULL;
2435 queue_info.flags = 0;
2436 queue_info.queueFamilyIndex = 0;
2437 queue_info.queueCount = 1;
2438 queue_info.pQueuePriorities = &priorities[0];
2439
2440 VkDeviceCreateInfo device_create_info = {};
2441 auto features = m_device->phy().features();
2442 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2443 device_create_info.pNext = NULL;
2444 device_create_info.queueCreateInfoCount = 1;
2445 device_create_info.pQueueCreateInfos = &queue_info;
2446 device_create_info.enabledLayerCount = 0;
2447 device_create_info.ppEnabledLayerNames = NULL;
2448 device_create_info.pEnabledFeatures = &features;
2449
2450 VkDevice second_device;
2451 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2452
2453 // Try to destroy the renderpass from the first device using the second device
2454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2455 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2456 m_errorMonitor->VerifyFound();
2457
2458 vkDestroyDevice(second_device, NULL);
2459}
2460
Karl Schultz6addd812016-02-02 17:17:23 -07002461TEST_F(VkLayerTest, PipelineNotBound) {
2462 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002464 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002465
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002467
Tony Barbour1fa09702017-03-16 12:09:08 -06002468 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002471 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002472 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2473 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002474
2475 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002476 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2477 ds_pool_ci.pNext = NULL;
2478 ds_pool_ci.maxSets = 1;
2479 ds_pool_ci.poolSizeCount = 1;
2480 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002481
2482 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002483 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002484 ASSERT_VK_SUCCESS(err);
2485
2486 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002487 dsl_binding.binding = 0;
2488 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2489 dsl_binding.descriptorCount = 1;
2490 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2491 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
2493 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002494 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2495 ds_layout_ci.pNext = NULL;
2496 ds_layout_ci.bindingCount = 1;
2497 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002498
2499 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002500 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002501 ASSERT_VK_SUCCESS(err);
2502
2503 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002504 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002505 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002506 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002507 alloc_info.descriptorPool = ds_pool;
2508 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002509 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002510 ASSERT_VK_SUCCESS(err);
2511
2512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2514 pipeline_layout_ci.pNext = NULL;
2515 pipeline_layout_ci.setLayoutCount = 1;
2516 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002517
2518 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002519 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002520 ASSERT_VK_SUCCESS(err);
2521
Mark Youngad779052016-01-06 14:26:04 -07002522 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002523
Tony Barbour552f6c02016-12-21 14:34:07 -07002524 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002525 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002526
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002527 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002528
Chia-I Wuf7458c52015-10-26 21:10:41 +08002529 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2531 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002532}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002533
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002534TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2535 VkResult err;
2536
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002537 TEST_DESCRIPTION(
2538 "Test validation check for an invalid memory type index "
2539 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002540
Tony Barbour1fa09702017-03-16 12:09:08 -06002541 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002542
2543 // Create an image, allocate memory, set a bad typeIndex and then try to
2544 // bind it
2545 VkImage image;
2546 VkDeviceMemory mem;
2547 VkMemoryRequirements mem_reqs;
2548 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2549 const int32_t tex_width = 32;
2550 const int32_t tex_height = 32;
2551
2552 VkImageCreateInfo image_create_info = {};
2553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2554 image_create_info.pNext = NULL;
2555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2556 image_create_info.format = tex_format;
2557 image_create_info.extent.width = tex_width;
2558 image_create_info.extent.height = tex_height;
2559 image_create_info.extent.depth = 1;
2560 image_create_info.mipLevels = 1;
2561 image_create_info.arrayLayers = 1;
2562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2563 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2564 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2565 image_create_info.flags = 0;
2566
2567 VkMemoryAllocateInfo mem_alloc = {};
2568 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2569 mem_alloc.pNext = NULL;
2570 mem_alloc.allocationSize = 0;
2571 mem_alloc.memoryTypeIndex = 0;
2572
2573 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2574 ASSERT_VK_SUCCESS(err);
2575
2576 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2577 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
2579 // Introduce Failure, select invalid TypeIndex
2580 VkPhysicalDeviceMemoryProperties memory_info;
2581
2582 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2583 unsigned int i;
2584 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2585 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2586 mem_alloc.memoryTypeIndex = i;
2587 break;
2588 }
2589 }
2590 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002591 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002592 vkDestroyImage(m_device->device(), image, NULL);
2593 return;
2594 }
2595
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002597
2598 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2599 ASSERT_VK_SUCCESS(err);
2600
2601 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2602 (void)err;
2603
2604 m_errorMonitor->VerifyFound();
2605
2606 vkDestroyImage(m_device->device(), image, NULL);
2607 vkFreeMemory(m_device->device(), mem, NULL);
2608}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002609
Karl Schultz6addd812016-02-02 17:17:23 -07002610TEST_F(VkLayerTest, BindInvalidMemory) {
2611 VkResult err;
2612 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Tony Barbour1fa09702017-03-16 12:09:08 -06002614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002615
Cortf801b982017-01-17 18:10:21 -08002616 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002617 const int32_t tex_width = 256;
2618 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002619
2620 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002621 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2622 image_create_info.pNext = NULL;
2623 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2624 image_create_info.format = tex_format;
2625 image_create_info.extent.width = tex_width;
2626 image_create_info.extent.height = tex_height;
2627 image_create_info.extent.depth = 1;
2628 image_create_info.mipLevels = 1;
2629 image_create_info.arrayLayers = 1;
2630 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002631 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002632 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2633 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002634
Cortf801b982017-01-17 18:10:21 -08002635 VkBufferCreateInfo buffer_create_info = {};
2636 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2637 buffer_create_info.pNext = NULL;
2638 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002639 buffer_create_info.size = 4 * 1024 * 1024;
2640 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002641 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 // Create an image/buffer, allocate memory, free it, and then try to bind it
2644 {
2645 VkImage image = VK_NULL_HANDLE;
2646 VkBuffer buffer = VK_NULL_HANDLE;
2647 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2648 ASSERT_VK_SUCCESS(err);
2649 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2650 ASSERT_VK_SUCCESS(err);
2651 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2652 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2653 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002654
Cortf801b982017-01-17 18:10:21 -08002655 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2656 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2657 image_mem_alloc.allocationSize = image_mem_reqs.size;
2658 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2659 ASSERT_TRUE(pass);
2660 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2661 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2662 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2663 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002664
Cortf801b982017-01-17 18:10:21 -08002665 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2666 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2667 ASSERT_VK_SUCCESS(err);
2668 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2669 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002670
Cortf801b982017-01-17 18:10:21 -08002671 vkFreeMemory(device(), image_mem, NULL);
2672 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002673
Cortf801b982017-01-17 18:10:21 -08002674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2675 err = vkBindImageMemory(device(), image, image_mem, 0);
2676 (void)err; // This may very well return an error.
2677 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002678
Cortf801b982017-01-17 18:10:21 -08002679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2680 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2681 (void)err; // This may very well return an error.
2682 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002683
Cortf801b982017-01-17 18:10:21 -08002684 vkDestroyImage(m_device->device(), image, NULL);
2685 vkDestroyBuffer(m_device->device(), buffer, NULL);
2686 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002687
2688 // Try to bind memory to an object that already has a memory binding
2689 {
2690 VkImage image = VK_NULL_HANDLE;
2691 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2692 ASSERT_VK_SUCCESS(err);
2693 VkBuffer buffer = VK_NULL_HANDLE;
2694 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2695 ASSERT_VK_SUCCESS(err);
2696 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2697 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2698 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2699 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2700 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2701 image_alloc_info.allocationSize = image_mem_reqs.size;
2702 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2703 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2704 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2705 ASSERT_TRUE(pass);
2706 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2707 ASSERT_TRUE(pass);
2708 VkDeviceMemory image_mem, buffer_mem;
2709 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2710 ASSERT_VK_SUCCESS(err);
2711 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2712 ASSERT_VK_SUCCESS(err);
2713
2714 err = vkBindImageMemory(device(), image, image_mem, 0);
2715 ASSERT_VK_SUCCESS(err);
2716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2717 err = vkBindImageMemory(device(), image, image_mem, 0);
2718 (void)err; // This may very well return an error.
2719 m_errorMonitor->VerifyFound();
2720
2721 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2722 ASSERT_VK_SUCCESS(err);
2723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2724 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2725 (void)err; // This may very well return an error.
2726 m_errorMonitor->VerifyFound();
2727
2728 vkFreeMemory(device(), image_mem, NULL);
2729 vkFreeMemory(device(), buffer_mem, NULL);
2730 vkDestroyImage(device(), image, NULL);
2731 vkDestroyBuffer(device(), buffer, NULL);
2732 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002733
Cort Strattonde748202017-02-17 12:50:01 -08002734 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002735 {
2736 VkImage image = VK_NULL_HANDLE;
2737 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2738 ASSERT_VK_SUCCESS(err);
2739 VkBuffer buffer = VK_NULL_HANDLE;
2740 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2741 ASSERT_VK_SUCCESS(err);
2742 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2743 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2744 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2745 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2746 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002747 // Leave some extra space for alignment wiggle room
2748 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002749 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002750 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002751 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2752 ASSERT_TRUE(pass);
2753 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2754 ASSERT_TRUE(pass);
2755 VkDeviceMemory image_mem, buffer_mem;
2756 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2757 ASSERT_VK_SUCCESS(err);
2758 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2759 ASSERT_VK_SUCCESS(err);
2760
Cort Strattonde748202017-02-17 12:50:01 -08002761 // Test unaligned memory offset
2762 {
2763 if (image_mem_reqs.alignment > 1) {
2764 VkDeviceSize image_offset = 1;
2765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2766 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2767 (void)err; // This may very well return an error.
2768 m_errorMonitor->VerifyFound();
2769 }
Cort6c7dff72017-01-27 18:34:50 -08002770
Cort Strattonde748202017-02-17 12:50:01 -08002771 if (buffer_mem_reqs.alignment > 1) {
2772 VkDeviceSize buffer_offset = 1;
2773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2774 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2775 (void)err; // This may very well return an error.
2776 m_errorMonitor->VerifyFound();
2777 }
2778 }
2779
2780 // Test memory offsets outside the memory allocation
2781 {
2782 VkDeviceSize image_offset =
2783 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2785 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2786 (void)err; // This may very well return an error.
2787 m_errorMonitor->VerifyFound();
2788
2789 VkDeviceSize buffer_offset =
2790 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2792 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2793 (void)err; // This may very well return an error.
2794 m_errorMonitor->VerifyFound();
2795 }
2796
2797 // Test memory offsets within the memory allocation, but which leave too little memory for
2798 // the resource.
2799 {
2800 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002801 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2803 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2804 (void)err; // This may very well return an error.
2805 m_errorMonitor->VerifyFound();
2806 }
2807
2808 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2809 if (buffer_offset > 0) {
2810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2811 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2812 (void)err; // This may very well return an error.
2813 m_errorMonitor->VerifyFound();
2814 }
2815 }
Cort6c7dff72017-01-27 18:34:50 -08002816
2817 vkFreeMemory(device(), image_mem, NULL);
2818 vkFreeMemory(device(), buffer_mem, NULL);
2819 vkDestroyImage(device(), image, NULL);
2820 vkDestroyBuffer(device(), buffer, NULL);
2821 }
2822
Cort Stratton4c38bb52017-01-28 13:33:10 -08002823 // Try to bind memory to an object with an invalid memory type
2824 {
2825 VkImage image = VK_NULL_HANDLE;
2826 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2827 ASSERT_VK_SUCCESS(err);
2828 VkBuffer buffer = VK_NULL_HANDLE;
2829 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2830 ASSERT_VK_SUCCESS(err);
2831 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2832 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2833 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2834 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2835 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2836 image_alloc_info.allocationSize = image_mem_reqs.size;
2837 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2838 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 // Create a mask of available memory types *not* supported by these resources,
2840 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 VkPhysicalDeviceMemoryProperties memory_properties = {};
2842 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002843 VkDeviceMemory image_mem, buffer_mem;
2844
Cort Stratton4c38bb52017-01-28 13:33:10 -08002845 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002846 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002847 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2848 ASSERT_TRUE(pass);
2849 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2850 ASSERT_VK_SUCCESS(err);
2851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2852 err = vkBindImageMemory(device(), image, image_mem, 0);
2853 (void)err; // This may very well return an error.
2854 m_errorMonitor->VerifyFound();
2855 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002856 }
2857
Cort Stratton4c38bb52017-01-28 13:33:10 -08002858 uint32_t buffer_unsupported_mem_type_bits =
2859 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002860 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002861 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2862 ASSERT_TRUE(pass);
2863 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2864 ASSERT_VK_SUCCESS(err);
2865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2866 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2867 (void)err; // This may very well return an error.
2868 m_errorMonitor->VerifyFound();
2869 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002870 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002871
Cort Stratton4c38bb52017-01-28 13:33:10 -08002872 vkDestroyImage(device(), image, NULL);
2873 vkDestroyBuffer(device(), buffer, NULL);
2874 }
2875
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002876 // Try to bind memory to an image created with sparse memory flags
2877 {
2878 VkImageCreateInfo sparse_image_create_info = image_create_info;
2879 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2880 VkImageFormatProperties image_format_properties = {};
2881 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2882 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2883 sparse_image_create_info.usage, sparse_image_create_info.flags,
2884 &image_format_properties);
2885 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2886 // most likely means sparse formats aren't supported here; skip this test.
2887 } else {
2888 ASSERT_VK_SUCCESS(err);
2889 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002890 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002891 return;
2892 } else {
2893 VkImage sparse_image = VK_NULL_HANDLE;
2894 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2895 ASSERT_VK_SUCCESS(err);
2896 VkMemoryRequirements sparse_mem_reqs = {};
2897 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2898 if (sparse_mem_reqs.memoryTypeBits != 0) {
2899 VkMemoryAllocateInfo sparse_mem_alloc = {};
2900 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2901 sparse_mem_alloc.pNext = NULL;
2902 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2903 sparse_mem_alloc.memoryTypeIndex = 0;
2904 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2905 ASSERT_TRUE(pass);
2906 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2907 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2908 ASSERT_VK_SUCCESS(err);
2909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2910 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2911 // This may very well return an error.
2912 (void)err;
2913 m_errorMonitor->VerifyFound();
2914 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2915 }
2916 vkDestroyImage(m_device->device(), sparse_image, NULL);
2917 }
2918 }
2919 }
2920
2921 // Try to bind memory to a buffer created with sparse memory flags
2922 {
2923 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2924 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2925 if (!m_device->phy().features().sparseResidencyBuffer) {
2926 // most likely means sparse formats aren't supported here; skip this test.
2927 } else {
2928 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2929 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2930 ASSERT_VK_SUCCESS(err);
2931 VkMemoryRequirements sparse_mem_reqs = {};
2932 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2933 if (sparse_mem_reqs.memoryTypeBits != 0) {
2934 VkMemoryAllocateInfo sparse_mem_alloc = {};
2935 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2936 sparse_mem_alloc.pNext = NULL;
2937 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2938 sparse_mem_alloc.memoryTypeIndex = 0;
2939 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2940 ASSERT_TRUE(pass);
2941 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2942 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2943 ASSERT_VK_SUCCESS(err);
2944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2945 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2946 // This may very well return an error.
2947 (void)err;
2948 m_errorMonitor->VerifyFound();
2949 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2950 }
2951 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2952 }
2953 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002954}
2955
Karl Schultz6addd812016-02-02 17:17:23 -07002956TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2957 VkResult err;
2958 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002959
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002961
Tony Barbour1fa09702017-03-16 12:09:08 -06002962 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 // Create an image object, allocate memory, destroy the object and then try
2965 // to bind it
2966 VkImage image;
2967 VkDeviceMemory mem;
2968 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002969
Karl Schultz6addd812016-02-02 17:17:23 -07002970 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2971 const int32_t tex_width = 32;
2972 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
2974 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002975 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2976 image_create_info.pNext = NULL;
2977 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2978 image_create_info.format = tex_format;
2979 image_create_info.extent.width = tex_width;
2980 image_create_info.extent.height = tex_height;
2981 image_create_info.extent.depth = 1;
2982 image_create_info.mipLevels = 1;
2983 image_create_info.arrayLayers = 1;
2984 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2985 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2986 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2987 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002988
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002989 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002990 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2991 mem_alloc.pNext = NULL;
2992 mem_alloc.allocationSize = 0;
2993 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002994
Chia-I Wuf7458c52015-10-26 21:10:41 +08002995 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002996 ASSERT_VK_SUCCESS(err);
2997
Karl Schultz6addd812016-02-02 17:17:23 -07002998 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002999
3000 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003001 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003002 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003003
3004 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003005 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003006 ASSERT_VK_SUCCESS(err);
3007
3008 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003009 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003010 ASSERT_VK_SUCCESS(err);
3011
3012 // Now Try to bind memory to this destroyed object
3013 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3014 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003015 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003017 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003018
Chia-I Wuf7458c52015-10-26 21:10:41 +08003019 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003020}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003021
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003022TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3023 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3024
Tony Barbour1fa09702017-03-16 12:09:08 -06003025 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3027
3028 VkVertexInputBindingDescription input_binding;
3029 memset(&input_binding, 0, sizeof(input_binding));
3030
3031 VkVertexInputAttributeDescription input_attribs;
3032 memset(&input_attribs, 0, sizeof(input_attribs));
3033
3034 // Pick a really bad format for this purpose and make sure it should fail
3035 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3036 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3037 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003038 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003039 return;
3040 }
3041
3042 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003043 char const *vsSource =
3044 "#version 450\n"
3045 "\n"
3046 "out gl_PerVertex {\n"
3047 " vec4 gl_Position;\n"
3048 "};\n"
3049 "void main(){\n"
3050 " gl_Position = vec4(1);\n"
3051 "}\n";
3052 char const *fsSource =
3053 "#version 450\n"
3054 "\n"
3055 "layout(location=0) out vec4 color;\n"
3056 "void main(){\n"
3057 " color = vec4(1);\n"
3058 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003059
3060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3061 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3062 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3063
3064 VkPipelineObj pipe(m_device);
3065 pipe.AddColorAttachment();
3066 pipe.AddShader(&vs);
3067 pipe.AddShader(&fs);
3068
3069 pipe.AddVertexInputBindings(&input_binding, 1);
3070 pipe.AddVertexInputAttribs(&input_attribs, 1);
3071
3072 VkDescriptorSetObj descriptorSet(m_device);
3073 descriptorSet.AppendDummy();
3074 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3075
3076 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3077
3078 m_errorMonitor->VerifyFound();
3079}
3080
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003081TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003082 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003083 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003084
3085 VkMemoryPropertyFlags reqs = 0;
3086 VkImageCreateInfo image_create_info = {};
3087 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3088 image_create_info.pNext = NULL;
3089 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3090 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3091 image_create_info.extent.width = 256;
3092 image_create_info.extent.height = 256;
3093 image_create_info.extent.depth = 1;
3094 image_create_info.mipLevels = 1;
3095 image_create_info.arrayLayers = 1;
3096 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3097 image_create_info.flags = 0;
3098
3099 VkImageBlit blit_region = {};
3100 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3101 blit_region.srcSubresource.baseArrayLayer = 0;
3102 blit_region.srcSubresource.layerCount = 1;
3103 blit_region.srcSubresource.mipLevel = 0;
3104 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3105 blit_region.dstSubresource.baseArrayLayer = 0;
3106 blit_region.dstSubresource.layerCount = 1;
3107 blit_region.dstSubresource.mipLevel = 0;
3108
3109 // Create two images, the source with sampleCount = 2, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 // Create two images, the dest with sampleCount = 4, and attempt to blit
3131 // between them
3132 {
3133 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003134 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003135 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003136 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003137 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003138 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003139 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003140 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003141 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003142 m_errorMonitor->SetDesiredFailureMsg(
3143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3144 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003145 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3146 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003147 m_errorMonitor->VerifyFound();
3148 m_commandBuffer->EndCommandBuffer();
3149 }
3150
3151 VkBufferImageCopy copy_region = {};
3152 copy_region.bufferRowLength = 128;
3153 copy_region.bufferImageHeight = 128;
3154 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3155 copy_region.imageSubresource.layerCount = 1;
3156 copy_region.imageExtent.height = 64;
3157 copy_region.imageExtent.width = 64;
3158 copy_region.imageExtent.depth = 1;
3159
3160 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3161 // buffer to image
3162 {
3163 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003164 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3165 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003168 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003169 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003170 m_errorMonitor->SetDesiredFailureMsg(
3171 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3172 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003173 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3174 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003175 m_errorMonitor->VerifyFound();
3176 m_commandBuffer->EndCommandBuffer();
3177 }
3178
3179 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3180 // image to buffer
3181 {
3182 vk_testing::Buffer dst_buffer;
3183 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3184 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003185 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003186 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003187 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003188 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003189 m_errorMonitor->SetDesiredFailureMsg(
3190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3191 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003192 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003193 dst_buffer.handle(), 1, &copy_region);
3194 m_errorMonitor->VerifyFound();
3195 m_commandBuffer->EndCommandBuffer();
3196 }
3197}
3198
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003199TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003200 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003201
3202 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003203 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003204 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003206 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003207 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003208
3209 VkImageBlit blitRegion = {};
3210 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3211 blitRegion.srcSubresource.baseArrayLayer = 0;
3212 blitRegion.srcSubresource.layerCount = 1;
3213 blitRegion.srcSubresource.mipLevel = 0;
3214 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3215 blitRegion.dstSubresource.baseArrayLayer = 0;
3216 blitRegion.dstSubresource.layerCount = 1;
3217 blitRegion.dstSubresource.mipLevel = 0;
3218
Dave Houlton34df4cb2016-12-01 16:43:06 -07003219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3220
3221 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3222 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223
3224 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003225 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003226 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003227 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003228
3229 m_errorMonitor->VerifyFound();
3230
Dave Houlton34df4cb2016-12-01 16:43:06 -07003231 // Test should generate 2 VU failures
3232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003234
3235 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003236 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003237 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003238
Dave Houlton34df4cb2016-12-01 16:43:06 -07003239 // TODO: Note that this only verifies that at least one of the VU enums was found
3240 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003241 m_errorMonitor->VerifyFound();
3242
Tony Barbour552f6c02016-12-21 14:34:07 -07003243 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003244}
3245
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003246TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3247 VkResult err;
3248 bool pass;
3249
3250 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003251 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003252
3253 // If w/d/h granularity is 1, test is not meaningful
3254 // TODO: When virtual device limits are available, create a set of limits for this test that
3255 // will always have a granularity of > 1 for w, h, and d
3256 auto index = m_device->graphics_queue_node_index_;
3257 auto queue_family_properties = m_device->phy().queue_properties();
3258
3259 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3260 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3261 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3262 return;
3263 }
3264
3265 // Create two images of different types and try to copy between them
3266 VkImage srcImage;
3267 VkImage dstImage;
3268 VkDeviceMemory srcMem;
3269 VkDeviceMemory destMem;
3270 VkMemoryRequirements memReqs;
3271
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 VkImageCreateInfo image_create_info = {};
3273 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3274 image_create_info.pNext = NULL;
3275 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3276 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3277 image_create_info.extent.width = 32;
3278 image_create_info.extent.height = 32;
3279 image_create_info.extent.depth = 1;
3280 image_create_info.mipLevels = 1;
3281 image_create_info.arrayLayers = 4;
3282 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3283 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3284 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3285 image_create_info.flags = 0;
3286
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003287 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003288 ASSERT_VK_SUCCESS(err);
3289
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003290 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003291 ASSERT_VK_SUCCESS(err);
3292
3293 // Allocate memory
3294 VkMemoryAllocateInfo memAlloc = {};
3295 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3296 memAlloc.pNext = NULL;
3297 memAlloc.allocationSize = 0;
3298 memAlloc.memoryTypeIndex = 0;
3299
3300 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3301 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003302 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003303 ASSERT_TRUE(pass);
3304 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3305 ASSERT_VK_SUCCESS(err);
3306
3307 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3308 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003309 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003310 ASSERT_VK_SUCCESS(err);
3311 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3312 ASSERT_VK_SUCCESS(err);
3313
3314 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3315 ASSERT_VK_SUCCESS(err);
3316 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3317 ASSERT_VK_SUCCESS(err);
3318
Tony Barbour552f6c02016-12-21 14:34:07 -07003319 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003320 VkImageCopy copyRegion;
3321 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3322 copyRegion.srcSubresource.mipLevel = 0;
3323 copyRegion.srcSubresource.baseArrayLayer = 0;
3324 copyRegion.srcSubresource.layerCount = 1;
3325 copyRegion.srcOffset.x = 0;
3326 copyRegion.srcOffset.y = 0;
3327 copyRegion.srcOffset.z = 0;
3328 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3329 copyRegion.dstSubresource.mipLevel = 0;
3330 copyRegion.dstSubresource.baseArrayLayer = 0;
3331 copyRegion.dstSubresource.layerCount = 1;
3332 copyRegion.dstOffset.x = 0;
3333 copyRegion.dstOffset.y = 0;
3334 copyRegion.dstOffset.z = 0;
3335 copyRegion.extent.width = 1;
3336 copyRegion.extent.height = 1;
3337 copyRegion.extent.depth = 1;
3338
3339 // Introduce failure by setting srcOffset to a bad granularity value
3340 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3342 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344
3345 // Introduce failure by setting extent to a bad granularity value
3346 copyRegion.srcOffset.y = 0;
3347 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003350 m_errorMonitor->VerifyFound();
3351
3352 // Now do some buffer/image copies
3353 vk_testing::Buffer buffer;
3354 VkMemoryPropertyFlags reqs = 0;
3355 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3356 VkBufferImageCopy region = {};
3357 region.bufferOffset = 0;
3358 region.bufferRowLength = 3;
3359 region.bufferImageHeight = 128;
3360 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3361 region.imageSubresource.layerCount = 1;
3362 region.imageExtent.height = 16;
3363 region.imageExtent.width = 16;
3364 region.imageExtent.depth = 1;
3365 region.imageOffset.x = 0;
3366 region.imageOffset.y = 0;
3367 region.imageOffset.z = 0;
3368
3369 // Introduce failure by setting bufferRowLength to a bad granularity value
3370 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3372 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3373 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003374 m_errorMonitor->VerifyFound();
3375 region.bufferRowLength = 128;
3376
3377 // Introduce failure by setting bufferOffset to a bad granularity value
3378 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3381 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003382 m_errorMonitor->VerifyFound();
3383 region.bufferOffset = 0;
3384
3385 // Introduce failure by setting bufferImageHeight to a bad granularity value
3386 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3389 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003390 m_errorMonitor->VerifyFound();
3391 region.bufferImageHeight = 128;
3392
3393 // Introduce failure by setting imageExtent to a bad granularity value
3394 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3396 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3397 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003398 m_errorMonitor->VerifyFound();
3399 region.imageExtent.width = 16;
3400
3401 // Introduce failure by setting imageOffset to a bad granularity value
3402 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3404 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3405 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003406 m_errorMonitor->VerifyFound();
3407
Tony Barbour552f6c02016-12-21 14:34:07 -07003408 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003409
3410 vkDestroyImage(m_device->device(), srcImage, NULL);
3411 vkDestroyImage(m_device->device(), dstImage, NULL);
3412 vkFreeMemory(m_device->device(), srcMem, NULL);
3413 vkFreeMemory(m_device->device(), destMem, NULL);
3414}
3415
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003417 TEST_DESCRIPTION(
3418 "Submit command buffer created using one queue family and "
3419 "attempt to submit them on a queue created in a different "
3420 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003421
Tony Barbour1fa09702017-03-16 12:09:08 -06003422 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003423
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003424 // This test is meaningless unless we have multiple queue families
3425 auto queue_family_properties = m_device->phy().queue_properties();
3426 if (queue_family_properties.size() < 2) {
3427 return;
3428 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430 // Get safe index of another queue family
3431 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003432 VkQueue other_queue;
3433 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3434
3435 // Record an empty cmd buffer
3436 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3437 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3438 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3439 vkEndCommandBuffer(m_commandBuffer->handle());
3440
3441 // And submit on the wrong queue
3442 VkSubmitInfo submit_info = {};
3443 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3444 submit_info.commandBufferCount = 1;
3445 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003446 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003447
3448 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003449}
3450
Chris Forbes4c24a922016-11-16 08:59:10 +13003451TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003453
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003454 // There are no attachments, but refer to attachment 0.
3455 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003456 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003457 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003458 };
3459
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003461 VkRenderPass rp;
3462
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003463 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003465 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3466 m_errorMonitor->VerifyFound();
3467}
3468
Chris Forbesa58c4522016-09-28 15:19:39 +13003469TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3470 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003471 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003472
3473 // A renderpass with two subpasses, both writing the same attachment.
3474 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003475 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3476 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3477 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003478 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003479 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003480 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3482 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003483 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003484 VkSubpassDependency dep = {0,
3485 1,
3486 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3487 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3488 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3489 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3490 VK_DEPENDENCY_BY_REGION_BIT};
3491 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003492 VkRenderPass rp;
3493 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3494 ASSERT_VK_SUCCESS(err);
3495
3496 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003497 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003498 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3499
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003500 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003501 VkFramebuffer fb;
3502 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3503 ASSERT_VK_SUCCESS(err);
3504
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003505 char const *vsSource =
3506 "#version 450\n"
3507 "void main() { gl_Position = vec4(1); }\n";
3508 char const *fsSource =
3509 "#version 450\n"
3510 "layout(location=0) out vec4 color;\n"
3511 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003512
3513 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3514 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3515 VkPipelineObj pipe(m_device);
3516 pipe.AddColorAttachment();
3517 pipe.AddShader(&vs);
3518 pipe.AddShader(&fs);
3519 VkViewport view_port = {};
3520 m_viewports.push_back(view_port);
3521 pipe.SetViewport(m_viewports);
3522 VkRect2D rect = {};
3523 m_scissors.push_back(rect);
3524 pipe.SetScissor(m_scissors);
3525
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003526 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003527 VkPipelineLayout pl;
3528 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3529 ASSERT_VK_SUCCESS(err);
3530 pipe.CreateVKPipeline(pl, rp);
3531
Tony Barbour552f6c02016-12-21 14:34:07 -07003532 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003533
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003534 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3535 nullptr,
3536 rp,
3537 fb,
3538 {{
3539 0, 0,
3540 },
3541 {32, 32}},
3542 0,
3543 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003544
3545 // subtest 1: bind in the wrong subpass
3546 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3547 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003549 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3550 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3551 m_errorMonitor->VerifyFound();
3552
3553 vkCmdEndRenderPass(m_commandBuffer->handle());
3554
3555 // subtest 2: bind in correct subpass, then transition to next subpass
3556 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3557 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3558 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003560 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3561 m_errorMonitor->VerifyFound();
3562
3563 vkCmdEndRenderPass(m_commandBuffer->handle());
3564
Tony Barbour552f6c02016-12-21 14:34:07 -07003565 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003566
3567 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3568 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3569 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3570}
3571
Tony Barbour4e919972016-08-09 13:27:40 -06003572TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3575 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003576 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3578
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3580 "Cannot execute a render pass with renderArea "
3581 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003582
3583 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3584 m_renderPassBeginInfo.renderArea.extent.width = 257;
3585 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003586 m_commandBuffer->BeginCommandBuffer();
3587 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003588 m_errorMonitor->VerifyFound();
3589}
3590
3591TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003592 TEST_DESCRIPTION(
3593 "Generate INDEPENDENT_BLEND by disabling independent "
3594 "blend and then specifying different blend states for two "
3595 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003596 VkPhysicalDeviceFeatures features = {};
3597 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003598 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003599
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3601 "Invalid Pipeline CreateInfo: If independent blend feature not "
3602 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003603
Cody Northropc31a84f2016-08-22 10:41:47 -06003604 VkDescriptorSetObj descriptorSet(m_device);
3605 descriptorSet.AppendDummy();
3606 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003607
Cody Northropc31a84f2016-08-22 10:41:47 -06003608 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003609 // Create a renderPass with two color attachments
3610 VkAttachmentReference attachments[2] = {};
3611 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003612 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003613 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3614
3615 VkSubpassDescription subpass = {};
3616 subpass.pColorAttachments = attachments;
3617 subpass.colorAttachmentCount = 2;
3618
3619 VkRenderPassCreateInfo rpci = {};
3620 rpci.subpassCount = 1;
3621 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003622 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003623
Tony Barbourffd60bd2017-03-09 12:04:55 -07003624 VkAttachmentDescription attach_desc[2] = {};
3625 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3626 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3627 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3628 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3629 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3630 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3631 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3632 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003633
Tony Barbourffd60bd2017-03-09 12:04:55 -07003634 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003635 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3636
3637 VkRenderPass renderpass;
3638 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003639 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003640 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003641
Cody Northropc31a84f2016-08-22 10:41:47 -06003642 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3643 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3644 att_state1.blendEnable = VK_TRUE;
3645 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3646 att_state2.blendEnable = VK_FALSE;
3647 pipeline.AddColorAttachment(0, &att_state1);
3648 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003649 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003650 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003651 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003652}
3653
Mike Weiblen40b160e2017-02-06 19:21:52 -07003654// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3655TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3656 TEST_DESCRIPTION(
3657 "Create a graphics pipeline that is incompatible with the requirements "
3658 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003659 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003660
3661 VkDescriptorSetObj ds_obj(m_device);
3662 ds_obj.AppendDummy();
3663 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3664
3665 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3666
3667 VkPipelineColorBlendAttachmentState att_state1 = {};
3668 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3669 att_state1.blendEnable = VK_TRUE;
3670
3671 VkRenderpassObj rp_obj(m_device);
3672
3673 {
3674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3675 VkPipelineObj pipeline(m_device);
3676 pipeline.AddShader(&vs_obj);
3677 pipeline.AddColorAttachment(0, &att_state1);
3678
3679 VkGraphicsPipelineCreateInfo info = {};
3680 pipeline.InitGraphicsPipelineCreateInfo(&info);
3681 info.pColorBlendState = nullptr;
3682
3683 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3684 m_errorMonitor->VerifyFound();
3685 }
3686}
3687
Chris Forbes26ec2122016-11-29 08:58:33 +13003688#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003689TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3690 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3691 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003692 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003693
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3695 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003696
3697 // Create a renderPass with a single color attachment
3698 VkAttachmentReference attach = {};
3699 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3700 VkSubpassDescription subpass = {};
3701 VkRenderPassCreateInfo rpci = {};
3702 rpci.subpassCount = 1;
3703 rpci.pSubpasses = &subpass;
3704 rpci.attachmentCount = 1;
3705 VkAttachmentDescription attach_desc = {};
3706 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3707 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3708 rpci.pAttachments = &attach_desc;
3709 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3710 VkRenderPass rp;
3711 subpass.pDepthStencilAttachment = &attach;
3712 subpass.pColorAttachments = NULL;
3713 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3714 m_errorMonitor->VerifyFound();
3715}
Chris Forbes26ec2122016-11-29 08:58:33 +13003716#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003717
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003718TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003719 TEST_DESCRIPTION(
3720 "Create a framebuffer where a subpass has a preserve "
3721 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003722
Tony Barbour1fa09702017-03-16 12:09:08 -06003723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3725
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003727
3728 VkAttachmentReference color_attach = {};
3729 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3730 color_attach.attachment = 0;
3731 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3732 VkSubpassDescription subpass = {};
3733 subpass.colorAttachmentCount = 1;
3734 subpass.pColorAttachments = &color_attach;
3735 subpass.preserveAttachmentCount = 1;
3736 subpass.pPreserveAttachments = &preserve_attachment;
3737
3738 VkRenderPassCreateInfo rpci = {};
3739 rpci.subpassCount = 1;
3740 rpci.pSubpasses = &subpass;
3741 rpci.attachmentCount = 1;
3742 VkAttachmentDescription attach_desc = {};
3743 attach_desc.format = VK_FORMAT_UNDEFINED;
3744 rpci.pAttachments = &attach_desc;
3745 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3746 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003747 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003748
3749 m_errorMonitor->VerifyFound();
3750
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003751 if (result == VK_SUCCESS) {
3752 vkDestroyRenderPass(m_device->device(), rp, NULL);
3753 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003754}
3755
Chris Forbesc5389742016-06-29 11:49:23 +12003756TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003757 TEST_DESCRIPTION(
3758 "Ensure that CreateRenderPass produces a validation error "
3759 "when the source of a subpass multisample resolve "
3760 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003761
Tony Barbour1fa09702017-03-16 12:09:08 -06003762 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003763
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3765 "Subpass 0 requests multisample resolve from attachment 0 which has "
3766 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003767
3768 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003769 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3770 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3771 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3772 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3773 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3774 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003775 };
3776
3777 VkAttachmentReference color = {
3778 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3779 };
3780
3781 VkAttachmentReference resolve = {
3782 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3783 };
3784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003785 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003788
3789 VkRenderPass rp;
3790 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3791
3792 m_errorMonitor->VerifyFound();
3793
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003794 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003795}
3796
3797TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003798 TEST_DESCRIPTION(
3799 "Ensure CreateRenderPass produces a validation error "
3800 "when a subpass multisample resolve operation is "
3801 "requested, and the destination of that resolve has "
3802 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003803
Tony Barbour1fa09702017-03-16 12:09:08 -06003804 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003805
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3807 "Subpass 0 requests multisample resolve into attachment 1, which "
3808 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003809
3810 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003811 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3812 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3813 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3814 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3815 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3816 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003817 };
3818
3819 VkAttachmentReference color = {
3820 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3821 };
3822
3823 VkAttachmentReference resolve = {
3824 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3825 };
3826
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003827 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003828
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003829 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003830
3831 VkRenderPass rp;
3832 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3833
3834 m_errorMonitor->VerifyFound();
3835
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003836 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003837}
3838
Chris Forbes3f128ef2016-06-29 14:58:53 +12003839TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003840 TEST_DESCRIPTION(
3841 "Ensure CreateRenderPass produces a validation error "
3842 "when the color and depth attachments used by a subpass "
3843 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003844
Tony Barbour1fa09702017-03-16 12:09:08 -06003845 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003846
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3848 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003849
3850 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3852 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3853 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3854 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3855 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3856 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003857 };
3858
3859 VkAttachmentReference color[] = {
3860 {
3861 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3862 },
3863 {
3864 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3865 },
3866 };
3867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003868 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003869
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003870 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003871
3872 VkRenderPass rp;
3873 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3874
3875 m_errorMonitor->VerifyFound();
3876
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003877 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003878}
3879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003881 TEST_DESCRIPTION(
3882 "Hit errors when attempting to create a framebuffer :\n"
3883 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3884 " 2. Use a color image as depthStencil attachment\n"
3885 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3886 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3887 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3888 " 6. Framebuffer attachment where dimensions don't match\n"
3889 " 7. Framebuffer attachment w/o identity swizzle\n"
3890 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003891
Tony Barbour1fa09702017-03-16 12:09:08 -06003892 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3894
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003895 m_errorMonitor->SetDesiredFailureMsg(
3896 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3897 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003898
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003899 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003900 VkAttachmentReference attach = {};
3901 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3902 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003903 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003904 VkRenderPassCreateInfo rpci = {};
3905 rpci.subpassCount = 1;
3906 rpci.pSubpasses = &subpass;
3907 rpci.attachmentCount = 1;
3908 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003909 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003910 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003911 rpci.pAttachments = &attach_desc;
3912 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3913 VkRenderPass rp;
3914 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3915 ASSERT_VK_SUCCESS(err);
3916
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003917 VkImageView ivs[2];
3918 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3919 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003920 VkFramebufferCreateInfo fb_info = {};
3921 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3922 fb_info.pNext = NULL;
3923 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003924 // Set mis-matching attachmentCount
3925 fb_info.attachmentCount = 2;
3926 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003927 fb_info.width = 100;
3928 fb_info.height = 100;
3929 fb_info.layers = 1;
3930
3931 VkFramebuffer fb;
3932 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3933
3934 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003935 if (err == VK_SUCCESS) {
3936 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3937 }
3938 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003939
3940 // Create a renderPass with a depth-stencil attachment created with
3941 // IMAGE_USAGE_COLOR_ATTACHMENT
3942 // Add our color attachment to pDepthStencilAttachment
3943 subpass.pDepthStencilAttachment = &attach;
3944 subpass.pColorAttachments = NULL;
3945 VkRenderPass rp_ds;
3946 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3947 ASSERT_VK_SUCCESS(err);
3948 // Set correct attachment count, but attachment has COLOR usage bit set
3949 fb_info.attachmentCount = 1;
3950 fb_info.renderPass = rp_ds;
3951
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003953 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3954
3955 m_errorMonitor->VerifyFound();
3956 if (err == VK_SUCCESS) {
3957 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3958 }
3959 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003960
3961 // Create new renderpass with alternate attachment format from fb
3962 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3963 subpass.pDepthStencilAttachment = NULL;
3964 subpass.pColorAttachments = &attach;
3965 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3966 ASSERT_VK_SUCCESS(err);
3967
3968 // Cause error due to mis-matched formats between rp & fb
3969 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3970 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3972 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003973 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3974
3975 m_errorMonitor->VerifyFound();
3976 if (err == VK_SUCCESS) {
3977 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3978 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003979 vkDestroyRenderPass(m_device->device(), rp, NULL);
3980
3981 // Create new renderpass with alternate sample count from fb
3982 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3983 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3984 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3985 ASSERT_VK_SUCCESS(err);
3986
3987 // Cause error due to mis-matched sample count between rp & fb
3988 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003990 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003991 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3992
3993 m_errorMonitor->VerifyFound();
3994 if (err == VK_SUCCESS) {
3995 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3996 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003997
3998 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003999
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004000 {
4001 // Create an image with 2 mip levels.
4002 VkImageObj image(m_device);
4003 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4004 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004005
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004006 // Create a image view with two mip levels.
4007 VkImageView view;
4008 VkImageViewCreateInfo ivci = {};
4009 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4010 ivci.image = image.handle();
4011 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4012 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4013 ivci.subresourceRange.layerCount = 1;
4014 ivci.subresourceRange.baseMipLevel = 0;
4015 // Set level count to 2 (only 1 is allowed for FB attachment)
4016 ivci.subresourceRange.levelCount = 2;
4017 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4018 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4019 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004020
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004021 // Re-create renderpass to have matching sample count
4022 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4023 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4024 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004025
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004026 fb_info.renderPass = rp;
4027 fb_info.pAttachments = &view;
4028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
4029 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4030
4031 m_errorMonitor->VerifyFound();
4032 if (err == VK_SUCCESS) {
4033 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4034 }
4035 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004036 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004037
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004038 // Update view to original color buffer and grow FB dimensions too big
4039 fb_info.pAttachments = ivs;
4040 fb_info.height = 1024;
4041 fb_info.width = 1024;
4042 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004044 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4045
4046 m_errorMonitor->VerifyFound();
4047 if (err == VK_SUCCESS) {
4048 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4049 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004050
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004051 {
4052 // Create an image with one mip level.
4053 VkImageObj image(m_device);
4054 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4055 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004056
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004057 // Create view attachment with non-identity swizzle
4058 VkImageView view;
4059 VkImageViewCreateInfo ivci = {};
4060 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4061 ivci.image = image.handle();
4062 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4063 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4064 ivci.subresourceRange.layerCount = 1;
4065 ivci.subresourceRange.baseMipLevel = 0;
4066 ivci.subresourceRange.levelCount = 1;
4067 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4068 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4069 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4070 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4071 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4072 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4073 ASSERT_VK_SUCCESS(err);
4074
4075 fb_info.pAttachments = &view;
4076 fb_info.height = 100;
4077 fb_info.width = 100;
4078 fb_info.layers = 1;
4079
4080 m_errorMonitor->SetDesiredFailureMsg(
4081 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4082 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
4083 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4084
4085 m_errorMonitor->VerifyFound();
4086 if (err == VK_SUCCESS) {
4087 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4088 }
4089 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004090 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004091
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004092 // reset attachment to color attachment
4093 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004094
4095 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004096 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004097 fb_info.height = 100;
4098 fb_info.layers = 1;
4099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004100 m_errorMonitor->SetDesiredFailureMsg(
4101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004102 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4103 "Here are the respective dimensions for attachment");
4104
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004105 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4106
4107 m_errorMonitor->VerifyFound();
4108 if (err == VK_SUCCESS) {
4109 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4110 }
4111
4112 // Request fb that exceeds max height
4113 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004114 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004115 fb_info.layers = 1;
4116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004117 m_errorMonitor->SetDesiredFailureMsg(
4118 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004119 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4120 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004121 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4122
4123 m_errorMonitor->VerifyFound();
4124 if (err == VK_SUCCESS) {
4125 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4126 }
4127
4128 // Request fb that exceeds max layers
4129 fb_info.width = 100;
4130 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004131 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004133 m_errorMonitor->SetDesiredFailureMsg(
4134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004135 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4136 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004137 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4138
4139 m_errorMonitor->VerifyFound();
4140 if (err == VK_SUCCESS) {
4141 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4142 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004143
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004144 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004145}
4146
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004147TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004148 TEST_DESCRIPTION(
4149 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4150 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004151
Tony Barbour1fa09702017-03-16 12:09:08 -06004152 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004153 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4155 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004156 m_errorMonitor->VerifyFound();
4157}
4158
4159TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004160 TEST_DESCRIPTION(
4161 "Run a simple draw calls to validate failure when Line Width dynamic "
4162 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004163
Tony Barbour1fa09702017-03-16 12:09:08 -06004164 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004165 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4167 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004168 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004169}
4170
4171TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004172 TEST_DESCRIPTION(
4173 "Run a simple draw calls to validate failure when Viewport dynamic "
4174 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004175
Tony Barbour1fa09702017-03-16 12:09:08 -06004176 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004177 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4179 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004180 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004181 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004182}
4183
4184TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004185 TEST_DESCRIPTION(
4186 "Run a simple draw calls to validate failure when Scissor dynamic "
4187 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004188
Tony Barbour1fa09702017-03-16 12:09:08 -06004189 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004190 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4192 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004193 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004194 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004195}
4196
Cortd713fe82016-07-27 09:51:27 -07004197TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004198 TEST_DESCRIPTION(
4199 "Run a simple draw calls to validate failure when Blend Constants "
4200 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004201
Tony Barbour1fa09702017-03-16 12:09:08 -06004202 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004203 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4205 "Dynamic blend constants state not set for this command buffer");
4206 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004207 m_errorMonitor->VerifyFound();
4208}
4209
4210TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004211 TEST_DESCRIPTION(
4212 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4213 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004214
Tony Barbour1fa09702017-03-16 12:09:08 -06004215 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004216 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004217 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004218 return;
4219 }
4220 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4222 "Dynamic depth bounds state not set for this command buffer");
4223 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004224 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004225}
4226
4227TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004228 TEST_DESCRIPTION(
4229 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4230 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004231
Tony Barbour1fa09702017-03-16 12:09:08 -06004232 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004233 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Dynamic stencil read mask state not set for this command buffer");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004237 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004238}
4239
4240TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004241 TEST_DESCRIPTION(
4242 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4243 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004246 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4248 "Dynamic stencil write mask state not set for this command buffer");
4249 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004250 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004251}
4252
4253TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004254 TEST_DESCRIPTION(
4255 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4256 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004257
Tony Barbour1fa09702017-03-16 12:09:08 -06004258 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004259 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4261 "Dynamic stencil reference state not set for this command buffer");
4262 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004263 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004264}
4265
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004266TEST_F(VkLayerTest, IndexBufferNotBound) {
4267 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004268
Tony Barbour1fa09702017-03-16 12:09:08 -06004269 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4271 "Index buffer object not bound to this command buffer when Indexed ");
4272 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004273 m_errorMonitor->VerifyFound();
4274}
4275
Karl Schultz6addd812016-02-02 17:17:23 -07004276TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4278 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4279 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004280
Tony Barbour1fa09702017-03-16 12:09:08 -06004281 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004282 ASSERT_NO_FATAL_FAILURE(InitViewport());
4283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4284
Karl Schultz6addd812016-02-02 17:17:23 -07004285 // We luck out b/c by default the framework creates CB w/ the
4286 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004287 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004288 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004289 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004290
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004291 // Bypass framework since it does the waits automatically
4292 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004293 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004294 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4295 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004296 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004297 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004298 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004299 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004300 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004301 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004302 submit_info.pSignalSemaphores = NULL;
4303
Chris Forbes40028e22016-06-13 09:59:34 +12004304 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004305 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004306 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004307
Karl Schultz6addd812016-02-02 17:17:23 -07004308 // Cause validation error by re-submitting cmd buffer that should only be
4309 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004310 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004311 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004312
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004313 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004314}
4315
Karl Schultz6addd812016-02-02 17:17:23 -07004316TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004317 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004318 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004319
Tony Barbour1fa09702017-03-16 12:09:08 -06004320 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004322
Karl Schultz6addd812016-02-02 17:17:23 -07004323 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4324 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004325 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004326 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004327 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004328
4329 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004330 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4331 ds_pool_ci.pNext = NULL;
4332 ds_pool_ci.flags = 0;
4333 ds_pool_ci.maxSets = 1;
4334 ds_pool_ci.poolSizeCount = 1;
4335 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336
4337 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004338 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004339 ASSERT_VK_SUCCESS(err);
4340
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004341 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4342 dsl_binding_samp.binding = 0;
4343 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4344 dsl_binding_samp.descriptorCount = 1;
4345 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4346 dsl_binding_samp.pImmutableSamplers = NULL;
4347
4348 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4349 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4350 ds_layout_ci.pNext = NULL;
4351 ds_layout_ci.bindingCount = 1;
4352 ds_layout_ci.pBindings = &dsl_binding_samp;
4353
4354 VkDescriptorSetLayout ds_layout_samp;
4355 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4356 ASSERT_VK_SUCCESS(err);
4357
4358 // Try to allocate 2 sets when pool only has 1 set
4359 VkDescriptorSet descriptor_sets[2];
4360 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4361 VkDescriptorSetAllocateInfo alloc_info = {};
4362 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4363 alloc_info.descriptorSetCount = 2;
4364 alloc_info.descriptorPool = ds_pool;
4365 alloc_info.pSetLayouts = set_layouts;
4366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4367 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4368 m_errorMonitor->VerifyFound();
4369
4370 alloc_info.descriptorSetCount = 1;
4371 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004372 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004373 dsl_binding.binding = 0;
4374 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4375 dsl_binding.descriptorCount = 1;
4376 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4377 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004378
Karl Schultz6addd812016-02-02 17:17:23 -07004379 ds_layout_ci.bindingCount = 1;
4380 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004381
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004382 VkDescriptorSetLayout ds_layout_ub;
4383 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004384 ASSERT_VK_SUCCESS(err);
4385
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004386 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004387 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004388 alloc_info.pSetLayouts = &ds_layout_ub;
4389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4390 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004392 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004393
Karl Schultz2825ab92016-12-02 08:23:14 -07004394 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004397}
4398
Karl Schultz6addd812016-02-02 17:17:23 -07004399TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4400 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004403
Tony Barbour1fa09702017-03-16 12:09:08 -06004404 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004406
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004407 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004408 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4409 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004410
4411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4413 ds_pool_ci.pNext = NULL;
4414 ds_pool_ci.maxSets = 1;
4415 ds_pool_ci.poolSizeCount = 1;
4416 ds_pool_ci.flags = 0;
4417 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4418 // app can only call vkResetDescriptorPool on this pool.;
4419 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004420
4421 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004422 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004423 ASSERT_VK_SUCCESS(err);
4424
4425 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004426 dsl_binding.binding = 0;
4427 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4428 dsl_binding.descriptorCount = 1;
4429 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4430 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004431
4432 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004433 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4434 ds_layout_ci.pNext = NULL;
4435 ds_layout_ci.bindingCount = 1;
4436 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004437
4438 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004439 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004440 ASSERT_VK_SUCCESS(err);
4441
4442 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004443 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004444 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004445 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004446 alloc_info.descriptorPool = ds_pool;
4447 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004448 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004449 ASSERT_VK_SUCCESS(err);
4450
4451 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004452 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004453
Chia-I Wuf7458c52015-10-26 21:10:41 +08004454 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4455 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004456}
4457
Karl Schultz6addd812016-02-02 17:17:23 -07004458TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004459 // Attempt to clear Descriptor Pool with bad object.
4460 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004461
Tony Barbour1fa09702017-03-16 12:09:08 -06004462 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004464 uint64_t fake_pool_handle = 0xbaad6001;
4465 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4466 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004467 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004468}
4469
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004470TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004471 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4472 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004473 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004474 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004475
4476 uint64_t fake_set_handle = 0xbaad6001;
4477 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004478 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004480
Tony Barbour1fa09702017-03-16 12:09:08 -06004481 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004482
4483 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4484 layout_bindings[0].binding = 0;
4485 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4486 layout_bindings[0].descriptorCount = 1;
4487 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4488 layout_bindings[0].pImmutableSamplers = NULL;
4489
4490 VkDescriptorSetLayout descriptor_set_layout;
4491 VkDescriptorSetLayoutCreateInfo dslci = {};
4492 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4493 dslci.pNext = NULL;
4494 dslci.bindingCount = 1;
4495 dslci.pBindings = layout_bindings;
4496 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004497 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004498
4499 VkPipelineLayout pipeline_layout;
4500 VkPipelineLayoutCreateInfo plci = {};
4501 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4502 plci.pNext = NULL;
4503 plci.setLayoutCount = 1;
4504 plci.pSetLayouts = &descriptor_set_layout;
4505 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004506 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004507
Tony Barbour552f6c02016-12-21 14:34:07 -07004508 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004509 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4510 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004511 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004512 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004513 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4514 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004515}
4516
Karl Schultz6addd812016-02-02 17:17:23 -07004517TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004518 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4519 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004520 uint64_t fake_layout_handle = 0xbaad6001;
4521 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004523 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004524 VkPipelineLayout pipeline_layout;
4525 VkPipelineLayoutCreateInfo plci = {};
4526 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4527 plci.pNext = NULL;
4528 plci.setLayoutCount = 1;
4529 plci.pSetLayouts = &bad_layout;
4530 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4531
4532 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004533}
4534
Mark Muellerd4914412016-06-13 17:52:06 -06004535TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004536 TEST_DESCRIPTION(
4537 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4538 "1) A uniform buffer update must have a valid buffer index."
4539 "2) When using an array of descriptors in a single WriteDescriptor,"
4540 " the descriptor types and stageflags must all be the same."
4541 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004542
Mike Weiblena6666382017-01-05 15:16:11 -07004543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004544
Tony Barbour1fa09702017-03-16 12:09:08 -06004545 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004546 VkDescriptorPoolSize ds_type_count[4] = {};
4547 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4548 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004549 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004550 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004551 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004552 ds_type_count[2].descriptorCount = 1;
4553 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4554 ds_type_count[3].descriptorCount = 1;
4555
4556 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4557 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4558 ds_pool_ci.maxSets = 1;
4559 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4560 ds_pool_ci.pPoolSizes = ds_type_count;
4561
4562 VkDescriptorPool ds_pool;
4563 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4564 ASSERT_VK_SUCCESS(err);
4565
Mark Muellerb9896722016-06-16 09:54:29 -06004566 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004567 layout_binding[0].binding = 0;
4568 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4569 layout_binding[0].descriptorCount = 1;
4570 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4571 layout_binding[0].pImmutableSamplers = NULL;
4572
4573 layout_binding[1].binding = 1;
4574 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4575 layout_binding[1].descriptorCount = 1;
4576 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4577 layout_binding[1].pImmutableSamplers = NULL;
4578
4579 VkSamplerCreateInfo sampler_ci = {};
4580 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4581 sampler_ci.pNext = NULL;
4582 sampler_ci.magFilter = VK_FILTER_NEAREST;
4583 sampler_ci.minFilter = VK_FILTER_NEAREST;
4584 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4585 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4586 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4587 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4588 sampler_ci.mipLodBias = 1.0;
4589 sampler_ci.anisotropyEnable = VK_FALSE;
4590 sampler_ci.maxAnisotropy = 1;
4591 sampler_ci.compareEnable = VK_FALSE;
4592 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4593 sampler_ci.minLod = 1.0;
4594 sampler_ci.maxLod = 1.0;
4595 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4596 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4597 VkSampler sampler;
4598
4599 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4600 ASSERT_VK_SUCCESS(err);
4601
4602 layout_binding[2].binding = 2;
4603 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4604 layout_binding[2].descriptorCount = 1;
4605 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4606 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4607
Mark Muellerd4914412016-06-13 17:52:06 -06004608 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4609 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4610 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4611 ds_layout_ci.pBindings = layout_binding;
4612 VkDescriptorSetLayout ds_layout;
4613 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4614 ASSERT_VK_SUCCESS(err);
4615
4616 VkDescriptorSetAllocateInfo alloc_info = {};
4617 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4618 alloc_info.descriptorSetCount = 1;
4619 alloc_info.descriptorPool = ds_pool;
4620 alloc_info.pSetLayouts = &ds_layout;
4621 VkDescriptorSet descriptorSet;
4622 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4623 ASSERT_VK_SUCCESS(err);
4624
4625 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4626 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4627 pipeline_layout_ci.pNext = NULL;
4628 pipeline_layout_ci.setLayoutCount = 1;
4629 pipeline_layout_ci.pSetLayouts = &ds_layout;
4630
4631 VkPipelineLayout pipeline_layout;
4632 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4633 ASSERT_VK_SUCCESS(err);
4634
Mark Mueller5c838ce2016-06-16 09:54:29 -06004635 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004636 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4637 descriptor_write.dstSet = descriptorSet;
4638 descriptor_write.dstBinding = 0;
4639 descriptor_write.descriptorCount = 1;
4640 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4641
Mark Mueller5c838ce2016-06-16 09:54:29 -06004642 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004643 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4644 m_errorMonitor->VerifyFound();
4645
4646 // Create a buffer to update the descriptor with
4647 uint32_t qfi = 0;
4648 VkBufferCreateInfo buffCI = {};
4649 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4650 buffCI.size = 1024;
4651 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4652 buffCI.queueFamilyIndexCount = 1;
4653 buffCI.pQueueFamilyIndices = &qfi;
4654
4655 VkBuffer dyub;
4656 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4657 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004658
Tony Barboure132c5f2016-12-12 11:50:20 -07004659 VkDeviceMemory mem;
4660 VkMemoryRequirements mem_reqs;
4661 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4662
4663 VkMemoryAllocateInfo mem_alloc_info = {};
4664 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4665 mem_alloc_info.allocationSize = mem_reqs.size;
4666 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4667 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4668 ASSERT_VK_SUCCESS(err);
4669
4670 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4671 ASSERT_VK_SUCCESS(err);
4672
4673 VkDescriptorBufferInfo buffInfo[2] = {};
4674 buffInfo[0].buffer = dyub;
4675 buffInfo[0].offset = 0;
4676 buffInfo[0].range = 1024;
4677 buffInfo[1].buffer = dyub;
4678 buffInfo[1].offset = 0;
4679 buffInfo[1].range = 1024;
4680 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004681 descriptor_write.descriptorCount = 2;
4682
Mark Mueller5c838ce2016-06-16 09:54:29 -06004683 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004685 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4686 m_errorMonitor->VerifyFound();
4687
Mark Mueller5c838ce2016-06-16 09:54:29 -06004688 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4689 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004690 descriptor_write.dstBinding = 1;
4691 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004692
Mark Mueller5c838ce2016-06-16 09:54:29 -06004693 // Make pImageInfo index non-null to avoid complaints of it missing
4694 VkDescriptorImageInfo imageInfo = {};
4695 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4696 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004698 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4699 m_errorMonitor->VerifyFound();
4700
Mark Muellerd4914412016-06-13 17:52:06 -06004701 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004702 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004703 vkDestroySampler(m_device->device(), sampler, NULL);
4704 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4707}
4708
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004709TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004710 TEST_DESCRIPTION(
4711 "Attempt to draw with a command buffer that is invalid "
4712 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004713 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004714
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004715 VkBuffer buffer;
4716 VkDeviceMemory mem;
4717 VkMemoryRequirements mem_reqs;
4718
4719 VkBufferCreateInfo buf_info = {};
4720 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004721 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004722 buf_info.size = 256;
4723 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4724 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4725 ASSERT_VK_SUCCESS(err);
4726
4727 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4728
4729 VkMemoryAllocateInfo alloc_info = {};
4730 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4731 alloc_info.allocationSize = 256;
4732 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004733 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004734 if (!pass) {
4735 vkDestroyBuffer(m_device->device(), buffer, NULL);
4736 return;
4737 }
4738 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4739 ASSERT_VK_SUCCESS(err);
4740
4741 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4742 ASSERT_VK_SUCCESS(err);
4743
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004744 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004745 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004746 m_commandBuffer->EndCommandBuffer();
4747
Mark Lobodzinski33826372017-04-13 11:10:11 -06004748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004749 // Destroy buffer dependency prior to submit to cause ERROR
4750 vkDestroyBuffer(m_device->device(), buffer, NULL);
4751
4752 VkSubmitInfo submit_info = {};
4753 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4754 submit_info.commandBufferCount = 1;
4755 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4756 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4757
4758 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004759 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004760 vkFreeMemory(m_device->handle(), mem, NULL);
4761}
4762
Tobin Ehlisea413442016-09-28 10:23:59 -06004763TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4764 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4765
Tony Barbour1fa09702017-03-16 12:09:08 -06004766 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004767 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4768
4769 VkDescriptorPoolSize ds_type_count;
4770 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4771 ds_type_count.descriptorCount = 1;
4772
4773 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4775 ds_pool_ci.maxSets = 1;
4776 ds_pool_ci.poolSizeCount = 1;
4777 ds_pool_ci.pPoolSizes = &ds_type_count;
4778
4779 VkDescriptorPool ds_pool;
4780 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4781 ASSERT_VK_SUCCESS(err);
4782
4783 VkDescriptorSetLayoutBinding layout_binding;
4784 layout_binding.binding = 0;
4785 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4786 layout_binding.descriptorCount = 1;
4787 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4788 layout_binding.pImmutableSamplers = NULL;
4789
4790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4791 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4792 ds_layout_ci.bindingCount = 1;
4793 ds_layout_ci.pBindings = &layout_binding;
4794 VkDescriptorSetLayout ds_layout;
4795 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4796 ASSERT_VK_SUCCESS(err);
4797
4798 VkDescriptorSetAllocateInfo alloc_info = {};
4799 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4800 alloc_info.descriptorSetCount = 1;
4801 alloc_info.descriptorPool = ds_pool;
4802 alloc_info.pSetLayouts = &ds_layout;
4803 VkDescriptorSet descriptor_set;
4804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4805 ASSERT_VK_SUCCESS(err);
4806
4807 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4808 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4809 pipeline_layout_ci.pNext = NULL;
4810 pipeline_layout_ci.setLayoutCount = 1;
4811 pipeline_layout_ci.pSetLayouts = &ds_layout;
4812
4813 VkPipelineLayout pipeline_layout;
4814 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4815 ASSERT_VK_SUCCESS(err);
4816
4817 VkBuffer buffer;
4818 uint32_t queue_family_index = 0;
4819 VkBufferCreateInfo buffer_create_info = {};
4820 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4821 buffer_create_info.size = 1024;
4822 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4823 buffer_create_info.queueFamilyIndexCount = 1;
4824 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4825
4826 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4827 ASSERT_VK_SUCCESS(err);
4828
4829 VkMemoryRequirements memory_reqs;
4830 VkDeviceMemory buffer_memory;
4831
4832 VkMemoryAllocateInfo memory_info = {};
4833 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4834 memory_info.allocationSize = 0;
4835 memory_info.memoryTypeIndex = 0;
4836
4837 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4838 memory_info.allocationSize = memory_reqs.size;
4839 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4840 ASSERT_TRUE(pass);
4841
4842 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4843 ASSERT_VK_SUCCESS(err);
4844 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4845 ASSERT_VK_SUCCESS(err);
4846
4847 VkBufferView view;
4848 VkBufferViewCreateInfo bvci = {};
4849 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4850 bvci.buffer = buffer;
4851 bvci.format = VK_FORMAT_R8_UNORM;
4852 bvci.range = VK_WHOLE_SIZE;
4853
4854 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4855 ASSERT_VK_SUCCESS(err);
4856
4857 VkWriteDescriptorSet descriptor_write = {};
4858 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4859 descriptor_write.dstSet = descriptor_set;
4860 descriptor_write.dstBinding = 0;
4861 descriptor_write.descriptorCount = 1;
4862 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4863 descriptor_write.pTexelBufferView = &view;
4864
4865 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004867 char const *vsSource =
4868 "#version 450\n"
4869 "\n"
4870 "out gl_PerVertex { \n"
4871 " vec4 gl_Position;\n"
4872 "};\n"
4873 "void main(){\n"
4874 " gl_Position = vec4(1);\n"
4875 "}\n";
4876 char const *fsSource =
4877 "#version 450\n"
4878 "\n"
4879 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4880 "layout(location=0) out vec4 x;\n"
4881 "void main(){\n"
4882 " x = imageLoad(s, 0);\n"
4883 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004884 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4885 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4886 VkPipelineObj pipe(m_device);
4887 pipe.AddShader(&vs);
4888 pipe.AddShader(&fs);
4889 pipe.AddColorAttachment();
4890 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4891
Mark Lobodzinski33826372017-04-13 11:10:11 -06004892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004893
Tony Barbour552f6c02016-12-21 14:34:07 -07004894 m_commandBuffer->BeginCommandBuffer();
4895 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4896
Tobin Ehlisea413442016-09-28 10:23:59 -06004897 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4898 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4899 VkRect2D scissor = {{0, 0}, {16, 16}};
4900 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4901 // Bind pipeline to cmd buffer
4902 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4903 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4904 &descriptor_set, 0, nullptr);
4905 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004906 m_commandBuffer->EndRenderPass();
4907 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004908
4909 // Delete BufferView in order to invalidate cmd buffer
4910 vkDestroyBufferView(m_device->device(), view, NULL);
4911 // Now attempt submit of cmd buffer
4912 VkSubmitInfo submit_info = {};
4913 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4914 submit_info.commandBufferCount = 1;
4915 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4916 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4917 m_errorMonitor->VerifyFound();
4918
4919 // Clean-up
4920 vkDestroyBuffer(m_device->device(), buffer, NULL);
4921 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4922 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4923 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4924 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4925}
4926
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004927TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004928 TEST_DESCRIPTION(
4929 "Attempt to draw with a command buffer that is invalid "
4930 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004931 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932
4933 VkImage image;
4934 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4935 VkImageCreateInfo image_create_info = {};
4936 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4937 image_create_info.pNext = NULL;
4938 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4939 image_create_info.format = tex_format;
4940 image_create_info.extent.width = 32;
4941 image_create_info.extent.height = 32;
4942 image_create_info.extent.depth = 1;
4943 image_create_info.mipLevels = 1;
4944 image_create_info.arrayLayers = 1;
4945 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4946 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004947 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004949 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004950 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004951 // Have to bind memory to image before recording cmd in cmd buffer using it
4952 VkMemoryRequirements mem_reqs;
4953 VkDeviceMemory image_mem;
4954 bool pass;
4955 VkMemoryAllocateInfo mem_alloc = {};
4956 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4957 mem_alloc.pNext = NULL;
4958 mem_alloc.memoryTypeIndex = 0;
4959 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4960 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004961 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004962 ASSERT_TRUE(pass);
4963 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4964 ASSERT_VK_SUCCESS(err);
4965 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4966 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004967
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004968 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004969 VkClearColorValue ccv;
4970 ccv.float32[0] = 1.0f;
4971 ccv.float32[1] = 1.0f;
4972 ccv.float32[2] = 1.0f;
4973 ccv.float32[3] = 1.0f;
4974 VkImageSubresourceRange isr = {};
4975 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004976 isr.baseArrayLayer = 0;
4977 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004978 isr.layerCount = 1;
4979 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004980 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004981 m_commandBuffer->EndCommandBuffer();
4982
Mark Lobodzinski33826372017-04-13 11:10:11 -06004983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004984 // Destroy image dependency prior to submit to cause ERROR
4985 vkDestroyImage(m_device->device(), image, NULL);
4986
4987 VkSubmitInfo submit_info = {};
4988 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4989 submit_info.commandBufferCount = 1;
4990 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4991 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4992
4993 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004994 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004995}
4996
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004997TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004998 TEST_DESCRIPTION(
4999 "Attempt to draw with a command buffer that is invalid "
5000 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005001 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005002 VkFormatProperties format_properties;
5003 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005004 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5005 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 return;
5007 }
5008
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5010
5011 VkImageCreateInfo image_ci = {};
5012 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5013 image_ci.pNext = NULL;
5014 image_ci.imageType = VK_IMAGE_TYPE_2D;
5015 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5016 image_ci.extent.width = 32;
5017 image_ci.extent.height = 32;
5018 image_ci.extent.depth = 1;
5019 image_ci.mipLevels = 1;
5020 image_ci.arrayLayers = 1;
5021 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5022 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005023 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005024 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5025 image_ci.flags = 0;
5026 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005027 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005028
5029 VkMemoryRequirements memory_reqs;
5030 VkDeviceMemory image_memory;
5031 bool pass;
5032 VkMemoryAllocateInfo memory_info = {};
5033 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5034 memory_info.pNext = NULL;
5035 memory_info.allocationSize = 0;
5036 memory_info.memoryTypeIndex = 0;
5037 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5038 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005039 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005040 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005041 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 ASSERT_VK_SUCCESS(err);
5043 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5044 ASSERT_VK_SUCCESS(err);
5045
5046 VkImageViewCreateInfo ivci = {
5047 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5048 nullptr,
5049 0,
5050 image,
5051 VK_IMAGE_VIEW_TYPE_2D,
5052 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005053 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005054 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5055 };
5056 VkImageView view;
5057 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5058 ASSERT_VK_SUCCESS(err);
5059
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005060 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005061 VkFramebuffer fb;
5062 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5063 ASSERT_VK_SUCCESS(err);
5064
5065 // Just use default renderpass with our framebuffer
5066 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005067 m_renderPassBeginInfo.renderArea.extent.width = 32;
5068 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005069 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005070 m_commandBuffer->BeginCommandBuffer();
5071 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5072 m_commandBuffer->EndRenderPass();
5073 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005074 // Destroy image attached to framebuffer to invalidate cmd buffer
5075 vkDestroyImage(m_device->device(), image, NULL);
5076 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005078 QueueCommandBuffer(false);
5079 m_errorMonitor->VerifyFound();
5080
5081 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5082 vkDestroyImageView(m_device->device(), view, nullptr);
5083 vkFreeMemory(m_device->device(), image_memory, nullptr);
5084}
5085
Tobin Ehlisb329f992016-10-12 13:20:29 -06005086TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5087 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005088 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005089 VkFormatProperties format_properties;
5090 VkResult err = VK_SUCCESS;
5091 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5092
Tobin Ehlisb329f992016-10-12 13:20:29 -06005093 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5094
5095 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005096 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005097 ASSERT_TRUE(image.initialized());
5098 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5099
5100 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5101 VkFramebuffer fb;
5102 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5103 ASSERT_VK_SUCCESS(err);
5104
5105 // Just use default renderpass with our framebuffer
5106 m_renderPassBeginInfo.framebuffer = fb;
5107 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005108 m_commandBuffer->BeginCommandBuffer();
5109 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5110 m_commandBuffer->EndRenderPass();
5111 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005112 // Submit cmd buffer to put it in-flight
5113 VkSubmitInfo submit_info = {};
5114 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5115 submit_info.commandBufferCount = 1;
5116 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5117 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5118 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005120 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5121 m_errorMonitor->VerifyFound();
5122 // Wait for queue to complete so we can safely destroy everything
5123 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005124 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5125 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005126 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5127}
5128
Tobin Ehlis88becd72016-09-21 14:33:41 -06005129TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5130 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005131 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005132 VkFormatProperties format_properties;
5133 VkResult err = VK_SUCCESS;
5134 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005135
Tobin Ehlis88becd72016-09-21 14:33:41 -06005136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5137
5138 VkImageCreateInfo image_ci = {};
5139 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5140 image_ci.pNext = NULL;
5141 image_ci.imageType = VK_IMAGE_TYPE_2D;
5142 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5143 image_ci.extent.width = 256;
5144 image_ci.extent.height = 256;
5145 image_ci.extent.depth = 1;
5146 image_ci.mipLevels = 1;
5147 image_ci.arrayLayers = 1;
5148 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5149 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005150 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005151 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5152 image_ci.flags = 0;
5153 VkImage image;
5154 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5155
5156 VkMemoryRequirements memory_reqs;
5157 VkDeviceMemory image_memory;
5158 bool pass;
5159 VkMemoryAllocateInfo memory_info = {};
5160 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5161 memory_info.pNext = NULL;
5162 memory_info.allocationSize = 0;
5163 memory_info.memoryTypeIndex = 0;
5164 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5165 memory_info.allocationSize = memory_reqs.size;
5166 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5167 ASSERT_TRUE(pass);
5168 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5169 ASSERT_VK_SUCCESS(err);
5170 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5171 ASSERT_VK_SUCCESS(err);
5172
5173 VkImageViewCreateInfo ivci = {
5174 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5175 nullptr,
5176 0,
5177 image,
5178 VK_IMAGE_VIEW_TYPE_2D,
5179 VK_FORMAT_B8G8R8A8_UNORM,
5180 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5181 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5182 };
5183 VkImageView view;
5184 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5185 ASSERT_VK_SUCCESS(err);
5186
5187 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5188 VkFramebuffer fb;
5189 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5190 ASSERT_VK_SUCCESS(err);
5191
5192 // Just use default renderpass with our framebuffer
5193 m_renderPassBeginInfo.framebuffer = fb;
5194 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005195 m_commandBuffer->BeginCommandBuffer();
5196 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5197 m_commandBuffer->EndRenderPass();
5198 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005199 // Submit cmd buffer to put it (and attached imageView) in-flight
5200 VkSubmitInfo submit_info = {};
5201 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5202 submit_info.commandBufferCount = 1;
5203 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5204 // Submit cmd buffer to put framebuffer and children in-flight
5205 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5206 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005208 vkDestroyImage(m_device->device(), image, NULL);
5209 m_errorMonitor->VerifyFound();
5210 // Wait for queue to complete so we can safely destroy image and other objects
5211 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005212 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5213 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005214 vkDestroyImage(m_device->device(), image, NULL);
5215 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5216 vkDestroyImageView(m_device->device(), view, nullptr);
5217 vkFreeMemory(m_device->device(), image_memory, nullptr);
5218}
5219
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005220TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5221 TEST_DESCRIPTION("Delete in-use renderPass.");
5222
Tony Barbour1fa09702017-03-16 12:09:08 -06005223 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5225
5226 // Create simple renderpass
5227 VkAttachmentReference attach = {};
5228 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5229 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005230 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005231 subpass.pColorAttachments = &attach;
5232 VkRenderPassCreateInfo rpci = {};
5233 rpci.subpassCount = 1;
5234 rpci.pSubpasses = &subpass;
5235 rpci.attachmentCount = 1;
5236 VkAttachmentDescription attach_desc = {};
5237 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5238 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5239 rpci.pAttachments = &attach_desc;
5240 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5241 VkRenderPass rp;
5242 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5243 ASSERT_VK_SUCCESS(err);
5244
5245 // Create a pipeline that uses the given renderpass
5246 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5247 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5248
5249 VkPipelineLayout pipeline_layout;
5250 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5251 ASSERT_VK_SUCCESS(err);
5252
5253 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5254 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5255 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005256 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005257 vp_state_ci.pViewports = &vp;
5258 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005259 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005260 vp_state_ci.pScissors = &scissors;
5261
5262 VkPipelineShaderStageCreateInfo shaderStages[2];
5263 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5264
5265 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005266 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005267 // but add it to be able to run on more devices
5268 shaderStages[0] = vs.GetStageCreateInfo();
5269 shaderStages[1] = fs.GetStageCreateInfo();
5270
5271 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5272 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5273
5274 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5275 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5276 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5277
5278 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5279 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5280 rs_ci.rasterizerDiscardEnable = true;
5281 rs_ci.lineWidth = 1.0f;
5282
5283 VkPipelineColorBlendAttachmentState att = {};
5284 att.blendEnable = VK_FALSE;
5285 att.colorWriteMask = 0xf;
5286
5287 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5288 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5289 cb_ci.attachmentCount = 1;
5290 cb_ci.pAttachments = &att;
5291
5292 VkGraphicsPipelineCreateInfo gp_ci = {};
5293 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5294 gp_ci.stageCount = 2;
5295 gp_ci.pStages = shaderStages;
5296 gp_ci.pVertexInputState = &vi_ci;
5297 gp_ci.pInputAssemblyState = &ia_ci;
5298 gp_ci.pViewportState = &vp_state_ci;
5299 gp_ci.pRasterizationState = &rs_ci;
5300 gp_ci.pColorBlendState = &cb_ci;
5301 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5302 gp_ci.layout = pipeline_layout;
5303 gp_ci.renderPass = rp;
5304
5305 VkPipelineCacheCreateInfo pc_ci = {};
5306 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5307
Dave Houlton756e6742017-03-23 14:33:22 -06005308 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005309 VkPipeline pipeline;
5310 VkPipelineCache pipe_cache;
5311 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5312 ASSERT_VK_SUCCESS(err);
5313
5314 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5315 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005316
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005317 // Bind pipeline to cmd buffer, will also bind renderpass
5318 m_commandBuffer->BeginCommandBuffer();
5319 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5320 m_commandBuffer->EndCommandBuffer();
5321
5322 VkSubmitInfo submit_info = {};
5323 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5324 submit_info.commandBufferCount = 1;
5325 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5326 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005327 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005328
5329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5330 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5331 m_errorMonitor->VerifyFound();
5332
5333 // Wait for queue to complete so we can safely destroy everything
5334 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005335 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005336 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005337 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5338 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5339 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5340 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5341}
5342
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005343TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005344 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005345 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005346
5347 VkImage image;
5348 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5349 VkImageCreateInfo image_create_info = {};
5350 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5351 image_create_info.pNext = NULL;
5352 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5353 image_create_info.format = tex_format;
5354 image_create_info.extent.width = 32;
5355 image_create_info.extent.height = 32;
5356 image_create_info.extent.depth = 1;
5357 image_create_info.mipLevels = 1;
5358 image_create_info.arrayLayers = 1;
5359 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5360 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005361 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005362 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005363 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005364 ASSERT_VK_SUCCESS(err);
5365 // Have to bind memory to image before recording cmd in cmd buffer using it
5366 VkMemoryRequirements mem_reqs;
5367 VkDeviceMemory image_mem;
5368 bool pass;
5369 VkMemoryAllocateInfo mem_alloc = {};
5370 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5371 mem_alloc.pNext = NULL;
5372 mem_alloc.memoryTypeIndex = 0;
5373 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5374 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005375 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005376 ASSERT_TRUE(pass);
5377 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5378 ASSERT_VK_SUCCESS(err);
5379
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005380 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005382 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005383
5384 m_commandBuffer->BeginCommandBuffer();
5385 VkClearColorValue ccv;
5386 ccv.float32[0] = 1.0f;
5387 ccv.float32[1] = 1.0f;
5388 ccv.float32[2] = 1.0f;
5389 ccv.float32[3] = 1.0f;
5390 VkImageSubresourceRange isr = {};
5391 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5392 isr.baseArrayLayer = 0;
5393 isr.baseMipLevel = 0;
5394 isr.layerCount = 1;
5395 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005396 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005397 m_commandBuffer->EndCommandBuffer();
5398
5399 m_errorMonitor->VerifyFound();
5400 vkDestroyImage(m_device->device(), image, NULL);
5401 vkFreeMemory(m_device->device(), image_mem, nullptr);
5402}
5403
5404TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005405 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005406 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005407
5408 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005409 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005410 VK_IMAGE_TILING_OPTIMAL, 0);
5411 ASSERT_TRUE(image.initialized());
5412
5413 VkBuffer buffer;
5414 VkDeviceMemory mem;
5415 VkMemoryRequirements mem_reqs;
5416
5417 VkBufferCreateInfo buf_info = {};
5418 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005419 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005420 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005421 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5422 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5423 ASSERT_VK_SUCCESS(err);
5424
5425 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5426
5427 VkMemoryAllocateInfo alloc_info = {};
5428 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005429 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005430 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005431 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005432 if (!pass) {
5433 vkDestroyBuffer(m_device->device(), buffer, NULL);
5434 return;
5435 }
5436 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5437 ASSERT_VK_SUCCESS(err);
5438
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005439 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005441 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005442 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005443 region.bufferRowLength = 16;
5444 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005445 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5446
5447 region.imageSubresource.layerCount = 1;
5448 region.imageExtent.height = 4;
5449 region.imageExtent.width = 4;
5450 region.imageExtent.depth = 1;
5451 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005452 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5453 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005454 m_commandBuffer->EndCommandBuffer();
5455
5456 m_errorMonitor->VerifyFound();
5457
5458 vkDestroyBuffer(m_device->device(), buffer, NULL);
5459 vkFreeMemory(m_device->handle(), mem, NULL);
5460}
5461
Tobin Ehlis85940f52016-07-07 16:57:21 -06005462TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005463 TEST_DESCRIPTION(
5464 "Attempt to draw with a command buffer that is invalid "
5465 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005466 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005467
5468 VkEvent event;
5469 VkEventCreateInfo evci = {};
5470 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5471 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5472 ASSERT_VK_SUCCESS(result);
5473
5474 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005475 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005476 m_commandBuffer->EndCommandBuffer();
5477
Mark Lobodzinski33826372017-04-13 11:10:11 -06005478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005479 // Destroy event dependency prior to submit to cause ERROR
5480 vkDestroyEvent(m_device->device(), event, NULL);
5481
5482 VkSubmitInfo submit_info = {};
5483 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5484 submit_info.commandBufferCount = 1;
5485 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5486 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5487
5488 m_errorMonitor->VerifyFound();
5489}
5490
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005491TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005492 TEST_DESCRIPTION(
5493 "Attempt to draw with a command buffer that is invalid "
5494 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005495 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005496
5497 VkQueryPool query_pool;
5498 VkQueryPoolCreateInfo qpci{};
5499 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5500 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5501 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005502 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005503 ASSERT_VK_SUCCESS(result);
5504
5505 m_commandBuffer->BeginCommandBuffer();
5506 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5507 m_commandBuffer->EndCommandBuffer();
5508
Mark Lobodzinski33826372017-04-13 11:10:11 -06005509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005510 // Destroy query pool dependency prior to submit to cause ERROR
5511 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5512
5513 VkSubmitInfo submit_info = {};
5514 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5515 submit_info.commandBufferCount = 1;
5516 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5517 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5518
5519 m_errorMonitor->VerifyFound();
5520}
5521
Tobin Ehlis24130d92016-07-08 15:50:53 -06005522TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005523 TEST_DESCRIPTION(
5524 "Attempt to draw with a command buffer that is invalid "
5525 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005526 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005527 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5528
5529 VkResult err;
5530
5531 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5532 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5533
5534 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005535 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005536 ASSERT_VK_SUCCESS(err);
5537
5538 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5539 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5540 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005541 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005542 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005543 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005544 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005545 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005546
5547 VkPipelineShaderStageCreateInfo shaderStages[2];
5548 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5549
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005550 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005551 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005552 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005553 shaderStages[0] = vs.GetStageCreateInfo();
5554 shaderStages[1] = fs.GetStageCreateInfo();
5555
5556 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5557 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5558
5559 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5560 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5561 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5562
5563 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5564 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005565 rs_ci.rasterizerDiscardEnable = true;
5566 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567
5568 VkPipelineColorBlendAttachmentState att = {};
5569 att.blendEnable = VK_FALSE;
5570 att.colorWriteMask = 0xf;
5571
5572 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5573 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5574 cb_ci.attachmentCount = 1;
5575 cb_ci.pAttachments = &att;
5576
5577 VkGraphicsPipelineCreateInfo gp_ci = {};
5578 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5579 gp_ci.stageCount = 2;
5580 gp_ci.pStages = shaderStages;
5581 gp_ci.pVertexInputState = &vi_ci;
5582 gp_ci.pInputAssemblyState = &ia_ci;
5583 gp_ci.pViewportState = &vp_state_ci;
5584 gp_ci.pRasterizationState = &rs_ci;
5585 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005586 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5587 gp_ci.layout = pipeline_layout;
5588 gp_ci.renderPass = renderPass();
5589
5590 VkPipelineCacheCreateInfo pc_ci = {};
5591 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5592
5593 VkPipeline pipeline;
5594 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005595 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005596 ASSERT_VK_SUCCESS(err);
5597
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005598 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005599 ASSERT_VK_SUCCESS(err);
5600
5601 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005602 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005603 m_commandBuffer->EndCommandBuffer();
5604 // Now destroy pipeline in order to cause error when submitting
5605 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5606
Mark Lobodzinski33826372017-04-13 11:10:11 -06005607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005608
5609 VkSubmitInfo submit_info = {};
5610 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5611 submit_info.commandBufferCount = 1;
5612 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5613 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5614
5615 m_errorMonitor->VerifyFound();
5616 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5617 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5618}
5619
Tobin Ehlis31289162016-08-17 14:57:58 -06005620TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005621 TEST_DESCRIPTION(
5622 "Attempt to draw with a command buffer that is invalid "
5623 "due to a bound descriptor set with a buffer dependency "
5624 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005625 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005626 ASSERT_NO_FATAL_FAILURE(InitViewport());
5627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5628
5629 VkDescriptorPoolSize ds_type_count = {};
5630 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5631 ds_type_count.descriptorCount = 1;
5632
5633 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5634 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5635 ds_pool_ci.pNext = NULL;
5636 ds_pool_ci.maxSets = 1;
5637 ds_pool_ci.poolSizeCount = 1;
5638 ds_pool_ci.pPoolSizes = &ds_type_count;
5639
5640 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005641 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005642 ASSERT_VK_SUCCESS(err);
5643
5644 VkDescriptorSetLayoutBinding dsl_binding = {};
5645 dsl_binding.binding = 0;
5646 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5647 dsl_binding.descriptorCount = 1;
5648 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5649 dsl_binding.pImmutableSamplers = NULL;
5650
5651 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5652 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5653 ds_layout_ci.pNext = NULL;
5654 ds_layout_ci.bindingCount = 1;
5655 ds_layout_ci.pBindings = &dsl_binding;
5656 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005657 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005658 ASSERT_VK_SUCCESS(err);
5659
5660 VkDescriptorSet descriptorSet;
5661 VkDescriptorSetAllocateInfo alloc_info = {};
5662 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5663 alloc_info.descriptorSetCount = 1;
5664 alloc_info.descriptorPool = ds_pool;
5665 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005666 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005667 ASSERT_VK_SUCCESS(err);
5668
5669 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5670 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5671 pipeline_layout_ci.pNext = NULL;
5672 pipeline_layout_ci.setLayoutCount = 1;
5673 pipeline_layout_ci.pSetLayouts = &ds_layout;
5674
5675 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005676 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005677 ASSERT_VK_SUCCESS(err);
5678
5679 // Create a buffer to update the descriptor with
5680 uint32_t qfi = 0;
5681 VkBufferCreateInfo buffCI = {};
5682 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5683 buffCI.size = 1024;
5684 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5685 buffCI.queueFamilyIndexCount = 1;
5686 buffCI.pQueueFamilyIndices = &qfi;
5687
5688 VkBuffer buffer;
5689 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5690 ASSERT_VK_SUCCESS(err);
5691 // Allocate memory and bind to buffer so we can make it to the appropriate
5692 // error
5693 VkMemoryAllocateInfo mem_alloc = {};
5694 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5695 mem_alloc.pNext = NULL;
5696 mem_alloc.allocationSize = 1024;
5697 mem_alloc.memoryTypeIndex = 0;
5698
5699 VkMemoryRequirements memReqs;
5700 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005701 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005702 if (!pass) {
5703 vkDestroyBuffer(m_device->device(), buffer, NULL);
5704 return;
5705 }
5706
5707 VkDeviceMemory mem;
5708 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5709 ASSERT_VK_SUCCESS(err);
5710 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5711 ASSERT_VK_SUCCESS(err);
5712 // Correctly update descriptor to avoid "NOT_UPDATED" error
5713 VkDescriptorBufferInfo buffInfo = {};
5714 buffInfo.buffer = buffer;
5715 buffInfo.offset = 0;
5716 buffInfo.range = 1024;
5717
5718 VkWriteDescriptorSet descriptor_write;
5719 memset(&descriptor_write, 0, sizeof(descriptor_write));
5720 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5721 descriptor_write.dstSet = descriptorSet;
5722 descriptor_write.dstBinding = 0;
5723 descriptor_write.descriptorCount = 1;
5724 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5725 descriptor_write.pBufferInfo = &buffInfo;
5726
5727 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5728
5729 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005730 char const *vsSource =
5731 "#version 450\n"
5732 "\n"
5733 "out gl_PerVertex { \n"
5734 " vec4 gl_Position;\n"
5735 "};\n"
5736 "void main(){\n"
5737 " gl_Position = vec4(1);\n"
5738 "}\n";
5739 char const *fsSource =
5740 "#version 450\n"
5741 "\n"
5742 "layout(location=0) out vec4 x;\n"
5743 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5744 "void main(){\n"
5745 " x = vec4(bar.y);\n"
5746 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005747 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5748 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5749 VkPipelineObj pipe(m_device);
5750 pipe.AddShader(&vs);
5751 pipe.AddShader(&fs);
5752 pipe.AddColorAttachment();
5753 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5754
Tony Barbour552f6c02016-12-21 14:34:07 -07005755 m_commandBuffer->BeginCommandBuffer();
5756 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005757 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5758 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5759 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005760
5761 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5762 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5763
Tobin Ehlis31289162016-08-17 14:57:58 -06005764 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005765 m_commandBuffer->EndRenderPass();
5766 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005768 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5769 vkDestroyBuffer(m_device->device(), buffer, NULL);
5770 // Attempt to submit cmd buffer
5771 VkSubmitInfo submit_info = {};
5772 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5773 submit_info.commandBufferCount = 1;
5774 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5775 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5776 m_errorMonitor->VerifyFound();
5777 // Cleanup
5778 vkFreeMemory(m_device->device(), mem, NULL);
5779
5780 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5781 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5782 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5783}
5784
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005785TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005786 TEST_DESCRIPTION(
5787 "Attempt to draw with a command buffer that is invalid "
5788 "due to a bound descriptor sets with a combined image "
5789 "sampler having their image, sampler, and descriptor set "
5790 "each respectively destroyed and then attempting to "
5791 "submit associated cmd buffers. Attempt to destroy a "
5792 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005793 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005794 ASSERT_NO_FATAL_FAILURE(InitViewport());
5795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5796
5797 VkDescriptorPoolSize ds_type_count = {};
5798 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5799 ds_type_count.descriptorCount = 1;
5800
5801 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5802 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5803 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005804 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005805 ds_pool_ci.maxSets = 1;
5806 ds_pool_ci.poolSizeCount = 1;
5807 ds_pool_ci.pPoolSizes = &ds_type_count;
5808
5809 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005810 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005811 ASSERT_VK_SUCCESS(err);
5812
5813 VkDescriptorSetLayoutBinding dsl_binding = {};
5814 dsl_binding.binding = 0;
5815 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5816 dsl_binding.descriptorCount = 1;
5817 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5818 dsl_binding.pImmutableSamplers = NULL;
5819
5820 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5821 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5822 ds_layout_ci.pNext = NULL;
5823 ds_layout_ci.bindingCount = 1;
5824 ds_layout_ci.pBindings = &dsl_binding;
5825 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005826 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005827 ASSERT_VK_SUCCESS(err);
5828
5829 VkDescriptorSet descriptorSet;
5830 VkDescriptorSetAllocateInfo alloc_info = {};
5831 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5832 alloc_info.descriptorSetCount = 1;
5833 alloc_info.descriptorPool = ds_pool;
5834 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005835 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005836 ASSERT_VK_SUCCESS(err);
5837
5838 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5839 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5840 pipeline_layout_ci.pNext = NULL;
5841 pipeline_layout_ci.setLayoutCount = 1;
5842 pipeline_layout_ci.pSetLayouts = &ds_layout;
5843
5844 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005845 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005846 ASSERT_VK_SUCCESS(err);
5847
5848 // Create images to update the descriptor with
5849 VkImage image;
5850 VkImage image2;
5851 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5852 const int32_t tex_width = 32;
5853 const int32_t tex_height = 32;
5854 VkImageCreateInfo image_create_info = {};
5855 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5856 image_create_info.pNext = NULL;
5857 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5858 image_create_info.format = tex_format;
5859 image_create_info.extent.width = tex_width;
5860 image_create_info.extent.height = tex_height;
5861 image_create_info.extent.depth = 1;
5862 image_create_info.mipLevels = 1;
5863 image_create_info.arrayLayers = 1;
5864 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5865 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5866 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5867 image_create_info.flags = 0;
5868 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5869 ASSERT_VK_SUCCESS(err);
5870 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5871 ASSERT_VK_SUCCESS(err);
5872
5873 VkMemoryRequirements memory_reqs;
5874 VkDeviceMemory image_memory;
5875 bool pass;
5876 VkMemoryAllocateInfo memory_info = {};
5877 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5878 memory_info.pNext = NULL;
5879 memory_info.allocationSize = 0;
5880 memory_info.memoryTypeIndex = 0;
5881 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5882 // Allocate enough memory for both images
5883 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005884 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005885 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005886 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005887 ASSERT_VK_SUCCESS(err);
5888 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5889 ASSERT_VK_SUCCESS(err);
5890 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005891 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005892 ASSERT_VK_SUCCESS(err);
5893
5894 VkImageViewCreateInfo image_view_create_info = {};
5895 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5896 image_view_create_info.image = image;
5897 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5898 image_view_create_info.format = tex_format;
5899 image_view_create_info.subresourceRange.layerCount = 1;
5900 image_view_create_info.subresourceRange.baseMipLevel = 0;
5901 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005902 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005903
5904 VkImageView view;
5905 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005906 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005907 ASSERT_VK_SUCCESS(err);
5908 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005909 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005910 ASSERT_VK_SUCCESS(err);
5911 // Create Samplers
5912 VkSamplerCreateInfo sampler_ci = {};
5913 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5914 sampler_ci.pNext = NULL;
5915 sampler_ci.magFilter = VK_FILTER_NEAREST;
5916 sampler_ci.minFilter = VK_FILTER_NEAREST;
5917 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5918 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5919 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5920 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5921 sampler_ci.mipLodBias = 1.0;
5922 sampler_ci.anisotropyEnable = VK_FALSE;
5923 sampler_ci.maxAnisotropy = 1;
5924 sampler_ci.compareEnable = VK_FALSE;
5925 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5926 sampler_ci.minLod = 1.0;
5927 sampler_ci.maxLod = 1.0;
5928 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5929 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5930 VkSampler sampler;
5931 VkSampler sampler2;
5932 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5933 ASSERT_VK_SUCCESS(err);
5934 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5935 ASSERT_VK_SUCCESS(err);
5936 // Update descriptor with image and sampler
5937 VkDescriptorImageInfo img_info = {};
5938 img_info.sampler = sampler;
5939 img_info.imageView = view;
5940 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5941
5942 VkWriteDescriptorSet descriptor_write;
5943 memset(&descriptor_write, 0, sizeof(descriptor_write));
5944 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5945 descriptor_write.dstSet = descriptorSet;
5946 descriptor_write.dstBinding = 0;
5947 descriptor_write.descriptorCount = 1;
5948 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5949 descriptor_write.pImageInfo = &img_info;
5950
5951 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5952
5953 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005954 char const *vsSource =
5955 "#version 450\n"
5956 "\n"
5957 "out gl_PerVertex { \n"
5958 " vec4 gl_Position;\n"
5959 "};\n"
5960 "void main(){\n"
5961 " gl_Position = vec4(1);\n"
5962 "}\n";
5963 char const *fsSource =
5964 "#version 450\n"
5965 "\n"
5966 "layout(set=0, binding=0) uniform sampler2D s;\n"
5967 "layout(location=0) out vec4 x;\n"
5968 "void main(){\n"
5969 " x = texture(s, vec2(1));\n"
5970 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005971 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5972 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5973 VkPipelineObj pipe(m_device);
5974 pipe.AddShader(&vs);
5975 pipe.AddShader(&fs);
5976 pipe.AddColorAttachment();
5977 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5978
5979 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005981 m_commandBuffer->BeginCommandBuffer();
5982 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005983 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5984 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5985 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005986 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5987 VkRect2D scissor = {{0, 0}, {16, 16}};
5988 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5989 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005990 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005991 m_commandBuffer->EndRenderPass();
5992 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005993 // Destroy sampler invalidates the cmd buffer, causing error on submit
5994 vkDestroySampler(m_device->device(), sampler, NULL);
5995 // Attempt to submit cmd buffer
5996 VkSubmitInfo submit_info = {};
5997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5998 submit_info.commandBufferCount = 1;
5999 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6000 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6001 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07006002
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006003 // Now re-update descriptor with valid sampler and delete image
6004 img_info.sampler = sampler2;
6005 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006006
6007 VkCommandBufferBeginInfo info = {};
6008 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6009 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
6010
Mark Lobodzinski33826372017-04-13 11:10:11 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07006012 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006013 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006014 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6015 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6016 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006017 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6018 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006019 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006020 m_commandBuffer->EndRenderPass();
6021 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006022 // Destroy image invalidates the cmd buffer, causing error on submit
6023 vkDestroyImage(m_device->device(), image, NULL);
6024 // Attempt to submit cmd buffer
6025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6030 m_errorMonitor->VerifyFound();
6031 // Now update descriptor to be valid, but then free descriptor
6032 img_info.imageView = view2;
6033 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006034 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006036 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6037 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6038 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006039 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6040 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006041 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006042 m_commandBuffer->EndRenderPass();
6043 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006044 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006045
6046 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006048 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006049 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006050
6051 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006052 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006053 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006054 m_errorMonitor->SetUnexpectedError(
6055 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6056 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006057 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006058 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6059
6060 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006061 submit_info = {};
6062 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6063 submit_info.commandBufferCount = 1;
6064 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006066 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6067 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006068
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006069 // Cleanup
6070 vkFreeMemory(m_device->device(), image_memory, NULL);
6071 vkDestroySampler(m_device->device(), sampler2, NULL);
6072 vkDestroyImage(m_device->device(), image2, NULL);
6073 vkDestroyImageView(m_device->device(), view, NULL);
6074 vkDestroyImageView(m_device->device(), view2, NULL);
6075 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6076 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6077 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6078}
6079
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006080TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6081 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6082 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6083 ASSERT_NO_FATAL_FAILURE(InitViewport());
6084 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6085
6086 VkDescriptorPoolSize ds_type_count = {};
6087 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6088 ds_type_count.descriptorCount = 1;
6089
6090 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6091 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6092 ds_pool_ci.pNext = NULL;
6093 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6094 ds_pool_ci.maxSets = 1;
6095 ds_pool_ci.poolSizeCount = 1;
6096 ds_pool_ci.pPoolSizes = &ds_type_count;
6097
6098 VkDescriptorPool ds_pool;
6099 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6100 ASSERT_VK_SUCCESS(err);
6101
6102 VkDescriptorSetLayoutBinding dsl_binding = {};
6103 dsl_binding.binding = 0;
6104 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6105 dsl_binding.descriptorCount = 1;
6106 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6107 dsl_binding.pImmutableSamplers = NULL;
6108
6109 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6110 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6111 ds_layout_ci.pNext = NULL;
6112 ds_layout_ci.bindingCount = 1;
6113 ds_layout_ci.pBindings = &dsl_binding;
6114 VkDescriptorSetLayout ds_layout;
6115 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6116 ASSERT_VK_SUCCESS(err);
6117
6118 VkDescriptorSet descriptorSet;
6119 VkDescriptorSetAllocateInfo alloc_info = {};
6120 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6121 alloc_info.descriptorSetCount = 1;
6122 alloc_info.descriptorPool = ds_pool;
6123 alloc_info.pSetLayouts = &ds_layout;
6124 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6125 ASSERT_VK_SUCCESS(err);
6126
6127 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6128 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6129 pipeline_layout_ci.pNext = NULL;
6130 pipeline_layout_ci.setLayoutCount = 1;
6131 pipeline_layout_ci.pSetLayouts = &ds_layout;
6132
6133 VkPipelineLayout pipeline_layout;
6134 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6135 ASSERT_VK_SUCCESS(err);
6136
6137 // Create images to update the descriptor with
6138 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6139 VkImageObj image(m_device);
6140 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6141 0);
6142 ASSERT_TRUE(image.initialized());
6143
6144 VkImageViewCreateInfo image_view_create_info = {};
6145 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6146 image_view_create_info.image = image.handle();
6147 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6148 image_view_create_info.format = format;
6149 image_view_create_info.subresourceRange.layerCount = 1;
6150 image_view_create_info.subresourceRange.baseMipLevel = 0;
6151 image_view_create_info.subresourceRange.levelCount = 1;
6152 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6153
6154 VkImageView view;
6155 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6156 ASSERT_VK_SUCCESS(err);
6157 // Create Sampler
6158 VkSamplerCreateInfo sampler_ci = {};
6159 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6160 sampler_ci.pNext = NULL;
6161 sampler_ci.magFilter = VK_FILTER_NEAREST;
6162 sampler_ci.minFilter = VK_FILTER_NEAREST;
6163 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6164 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6165 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6166 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6167 sampler_ci.mipLodBias = 1.0;
6168 sampler_ci.anisotropyEnable = VK_FALSE;
6169 sampler_ci.maxAnisotropy = 1;
6170 sampler_ci.compareEnable = VK_FALSE;
6171 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6172 sampler_ci.minLod = 1.0;
6173 sampler_ci.maxLod = 1.0;
6174 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6175 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6176 VkSampler sampler;
6177 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6178 ASSERT_VK_SUCCESS(err);
6179 // Update descriptor with image and sampler
6180 VkDescriptorImageInfo img_info = {};
6181 img_info.sampler = sampler;
6182 img_info.imageView = view;
6183 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6184 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6185
6186 VkWriteDescriptorSet descriptor_write;
6187 memset(&descriptor_write, 0, sizeof(descriptor_write));
6188 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6189 descriptor_write.dstSet = descriptorSet;
6190 descriptor_write.dstBinding = 0;
6191 descriptor_write.descriptorCount = 1;
6192 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6193 descriptor_write.pImageInfo = &img_info;
6194
6195 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6196
6197 // Create PSO to be used for draw-time errors below
6198 char const *vsSource =
6199 "#version 450\n"
6200 "\n"
6201 "out gl_PerVertex { \n"
6202 " vec4 gl_Position;\n"
6203 "};\n"
6204 "void main(){\n"
6205 " gl_Position = vec4(1);\n"
6206 "}\n";
6207 char const *fsSource =
6208 "#version 450\n"
6209 "\n"
6210 "layout(set=0, binding=0) uniform sampler2D s;\n"
6211 "layout(location=0) out vec4 x;\n"
6212 "void main(){\n"
6213 " x = texture(s, vec2(1));\n"
6214 "}\n";
6215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6217 VkPipelineObj pipe(m_device);
6218 pipe.AddShader(&vs);
6219 pipe.AddShader(&fs);
6220 pipe.AddColorAttachment();
6221 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6222
6223 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6224 cmd_buf.BeginCommandBuffer();
6225 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
6226 // record layout different than actual descriptor layout of SHADER_RO
6227 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
6228 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6229 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6230 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6231 VkRect2D scissor = {{0, 0}, {16, 16}};
6232 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6233 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6234 // At draw time the update layout will mis-match the actual layout
6235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6236 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6237 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6238 m_errorMonitor->SetDesiredFailureMsg(
6239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6240 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6241 cmd_buf.Draw(1, 0, 0, 0);
6242 m_errorMonitor->VerifyFound();
6243 cmd_buf.EndRenderPass();
6244 cmd_buf.EndCommandBuffer();
6245 // Submit cmd buffer
6246 VkSubmitInfo submit_info = {};
6247 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6248 submit_info.commandBufferCount = 1;
6249 submit_info.pCommandBuffers = &cmd_buf.handle();
6250 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6251 vkQueueWaitIdle(m_device->m_queue);
6252 // Cleanup
6253 vkDestroySampler(m_device->device(), sampler, NULL);
6254 vkDestroyImageView(m_device->device(), view, NULL);
6255 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6256 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6257 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6258}
6259
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006260TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6261 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006262 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006263 ASSERT_NO_FATAL_FAILURE(InitViewport());
6264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6265
6266 VkDescriptorPoolSize ds_type_count = {};
6267 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6268 ds_type_count.descriptorCount = 1;
6269
6270 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6271 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6272 ds_pool_ci.pNext = NULL;
6273 ds_pool_ci.maxSets = 1;
6274 ds_pool_ci.poolSizeCount = 1;
6275 ds_pool_ci.pPoolSizes = &ds_type_count;
6276
6277 VkDescriptorPool ds_pool;
6278 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6279 ASSERT_VK_SUCCESS(err);
6280
6281 VkDescriptorSetLayoutBinding dsl_binding = {};
6282 dsl_binding.binding = 0;
6283 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6284 dsl_binding.descriptorCount = 1;
6285 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6286 dsl_binding.pImmutableSamplers = NULL;
6287
6288 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6289 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6290 ds_layout_ci.pNext = NULL;
6291 ds_layout_ci.bindingCount = 1;
6292 ds_layout_ci.pBindings = &dsl_binding;
6293 VkDescriptorSetLayout ds_layout;
6294 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6295 ASSERT_VK_SUCCESS(err);
6296
6297 VkDescriptorSet descriptor_set;
6298 VkDescriptorSetAllocateInfo alloc_info = {};
6299 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6300 alloc_info.descriptorSetCount = 1;
6301 alloc_info.descriptorPool = ds_pool;
6302 alloc_info.pSetLayouts = &ds_layout;
6303 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6304 ASSERT_VK_SUCCESS(err);
6305
6306 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6307 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6308 pipeline_layout_ci.pNext = NULL;
6309 pipeline_layout_ci.setLayoutCount = 1;
6310 pipeline_layout_ci.pSetLayouts = &ds_layout;
6311
6312 VkPipelineLayout pipeline_layout;
6313 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6314 ASSERT_VK_SUCCESS(err);
6315
6316 // Create image to update the descriptor with
6317 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006318 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006319 ASSERT_TRUE(image.initialized());
6320
6321 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6322 // Create Sampler
6323 VkSamplerCreateInfo sampler_ci = {};
6324 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6325 sampler_ci.pNext = NULL;
6326 sampler_ci.magFilter = VK_FILTER_NEAREST;
6327 sampler_ci.minFilter = VK_FILTER_NEAREST;
6328 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6329 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6330 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6331 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6332 sampler_ci.mipLodBias = 1.0;
6333 sampler_ci.anisotropyEnable = VK_FALSE;
6334 sampler_ci.maxAnisotropy = 1;
6335 sampler_ci.compareEnable = VK_FALSE;
6336 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6337 sampler_ci.minLod = 1.0;
6338 sampler_ci.maxLod = 1.0;
6339 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6340 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6341 VkSampler sampler;
6342 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6343 ASSERT_VK_SUCCESS(err);
6344 // Update descriptor with image and sampler
6345 VkDescriptorImageInfo img_info = {};
6346 img_info.sampler = sampler;
6347 img_info.imageView = view;
6348 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6349
6350 VkWriteDescriptorSet descriptor_write;
6351 memset(&descriptor_write, 0, sizeof(descriptor_write));
6352 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6353 descriptor_write.dstSet = descriptor_set;
6354 descriptor_write.dstBinding = 0;
6355 descriptor_write.descriptorCount = 1;
6356 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6357 descriptor_write.pImageInfo = &img_info;
6358
6359 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6360
6361 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006362 char const *vsSource =
6363 "#version 450\n"
6364 "\n"
6365 "out gl_PerVertex { \n"
6366 " vec4 gl_Position;\n"
6367 "};\n"
6368 "void main(){\n"
6369 " gl_Position = vec4(1);\n"
6370 "}\n";
6371 char const *fsSource =
6372 "#version 450\n"
6373 "\n"
6374 "layout(set=0, binding=0) uniform sampler2D s;\n"
6375 "layout(location=0) out vec4 x;\n"
6376 "void main(){\n"
6377 " x = texture(s, vec2(1));\n"
6378 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6380 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6381 VkPipelineObj pipe(m_device);
6382 pipe.AddShader(&vs);
6383 pipe.AddShader(&fs);
6384 pipe.AddColorAttachment();
6385 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6386
Tony Barbour552f6c02016-12-21 14:34:07 -07006387 m_commandBuffer->BeginCommandBuffer();
6388 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006389 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6390 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6391 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006392
6393 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6394 VkRect2D scissor = {{0, 0}, {16, 16}};
6395 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6396 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6397
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006398 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006399 m_commandBuffer->EndRenderPass();
6400 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006401 // Submit cmd buffer to put pool in-flight
6402 VkSubmitInfo submit_info = {};
6403 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6404 submit_info.commandBufferCount = 1;
6405 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6406 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6407 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006409 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6410 m_errorMonitor->VerifyFound();
6411 vkQueueWaitIdle(m_device->m_queue);
6412 // Cleanup
6413 vkDestroySampler(m_device->device(), sampler, NULL);
6414 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6415 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006416 m_errorMonitor->SetUnexpectedError(
6417 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006418 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006420 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006421}
6422
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006423TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6424 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006425 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006426 ASSERT_NO_FATAL_FAILURE(InitViewport());
6427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6428
6429 VkDescriptorPoolSize ds_type_count = {};
6430 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6431 ds_type_count.descriptorCount = 1;
6432
6433 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6434 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6435 ds_pool_ci.pNext = NULL;
6436 ds_pool_ci.maxSets = 1;
6437 ds_pool_ci.poolSizeCount = 1;
6438 ds_pool_ci.pPoolSizes = &ds_type_count;
6439
6440 VkDescriptorPool ds_pool;
6441 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6442 ASSERT_VK_SUCCESS(err);
6443
6444 VkDescriptorSetLayoutBinding dsl_binding = {};
6445 dsl_binding.binding = 0;
6446 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6447 dsl_binding.descriptorCount = 1;
6448 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6449 dsl_binding.pImmutableSamplers = NULL;
6450
6451 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6452 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6453 ds_layout_ci.pNext = NULL;
6454 ds_layout_ci.bindingCount = 1;
6455 ds_layout_ci.pBindings = &dsl_binding;
6456 VkDescriptorSetLayout ds_layout;
6457 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6458 ASSERT_VK_SUCCESS(err);
6459
6460 VkDescriptorSet descriptorSet;
6461 VkDescriptorSetAllocateInfo alloc_info = {};
6462 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6463 alloc_info.descriptorSetCount = 1;
6464 alloc_info.descriptorPool = ds_pool;
6465 alloc_info.pSetLayouts = &ds_layout;
6466 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6467 ASSERT_VK_SUCCESS(err);
6468
6469 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6470 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6471 pipeline_layout_ci.pNext = NULL;
6472 pipeline_layout_ci.setLayoutCount = 1;
6473 pipeline_layout_ci.pSetLayouts = &ds_layout;
6474
6475 VkPipelineLayout pipeline_layout;
6476 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6477 ASSERT_VK_SUCCESS(err);
6478
6479 // Create images to update the descriptor with
6480 VkImage image;
6481 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6482 const int32_t tex_width = 32;
6483 const int32_t tex_height = 32;
6484 VkImageCreateInfo image_create_info = {};
6485 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6486 image_create_info.pNext = NULL;
6487 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6488 image_create_info.format = tex_format;
6489 image_create_info.extent.width = tex_width;
6490 image_create_info.extent.height = tex_height;
6491 image_create_info.extent.depth = 1;
6492 image_create_info.mipLevels = 1;
6493 image_create_info.arrayLayers = 1;
6494 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6495 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6496 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6497 image_create_info.flags = 0;
6498 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6499 ASSERT_VK_SUCCESS(err);
6500 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6501 VkMemoryRequirements memory_reqs;
6502 VkDeviceMemory image_memory;
6503 bool pass;
6504 VkMemoryAllocateInfo memory_info = {};
6505 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6506 memory_info.pNext = NULL;
6507 memory_info.allocationSize = 0;
6508 memory_info.memoryTypeIndex = 0;
6509 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6510 // Allocate enough memory for image
6511 memory_info.allocationSize = memory_reqs.size;
6512 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6513 ASSERT_TRUE(pass);
6514 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6515 ASSERT_VK_SUCCESS(err);
6516 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6517 ASSERT_VK_SUCCESS(err);
6518
6519 VkImageViewCreateInfo image_view_create_info = {};
6520 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6521 image_view_create_info.image = image;
6522 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6523 image_view_create_info.format = tex_format;
6524 image_view_create_info.subresourceRange.layerCount = 1;
6525 image_view_create_info.subresourceRange.baseMipLevel = 0;
6526 image_view_create_info.subresourceRange.levelCount = 1;
6527 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6528
6529 VkImageView view;
6530 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6531 ASSERT_VK_SUCCESS(err);
6532 // Create Samplers
6533 VkSamplerCreateInfo sampler_ci = {};
6534 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6535 sampler_ci.pNext = NULL;
6536 sampler_ci.magFilter = VK_FILTER_NEAREST;
6537 sampler_ci.minFilter = VK_FILTER_NEAREST;
6538 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6539 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6540 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6541 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6542 sampler_ci.mipLodBias = 1.0;
6543 sampler_ci.anisotropyEnable = VK_FALSE;
6544 sampler_ci.maxAnisotropy = 1;
6545 sampler_ci.compareEnable = VK_FALSE;
6546 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6547 sampler_ci.minLod = 1.0;
6548 sampler_ci.maxLod = 1.0;
6549 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6550 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6551 VkSampler sampler;
6552 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6553 ASSERT_VK_SUCCESS(err);
6554 // Update descriptor with image and sampler
6555 VkDescriptorImageInfo img_info = {};
6556 img_info.sampler = sampler;
6557 img_info.imageView = view;
6558 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6559
6560 VkWriteDescriptorSet descriptor_write;
6561 memset(&descriptor_write, 0, sizeof(descriptor_write));
6562 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6563 descriptor_write.dstSet = descriptorSet;
6564 descriptor_write.dstBinding = 0;
6565 descriptor_write.descriptorCount = 1;
6566 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6567 descriptor_write.pImageInfo = &img_info;
6568 // Break memory binding and attempt update
6569 vkFreeMemory(m_device->device(), image_memory, nullptr);
6570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006571 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6573 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6574 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6575 m_errorMonitor->VerifyFound();
6576 // Cleanup
6577 vkDestroyImage(m_device->device(), image, NULL);
6578 vkDestroySampler(m_device->device(), sampler, NULL);
6579 vkDestroyImageView(m_device->device(), view, NULL);
6580 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6581 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6582 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6583}
6584
Karl Schultz6addd812016-02-02 17:17:23 -07006585TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006586 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6587 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006588 // Create a valid cmd buffer
6589 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006590 uint64_t fake_pipeline_handle = 0xbaad6001;
6591 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006592 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6594
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006596 m_commandBuffer->BeginCommandBuffer();
6597 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006598 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006599 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006600
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006601 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006603 Draw(1, 0, 0, 0);
6604 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006605
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006606 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006608 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006609 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6610 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006611}
6612
Karl Schultz6addd812016-02-02 17:17:23 -07006613TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006614 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006615 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006616
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006618
Tony Barbour1fa09702017-03-16 12:09:08 -06006619 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006620 ASSERT_NO_FATAL_FAILURE(InitViewport());
6621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006622 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006623 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6624 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006625
6626 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6628 ds_pool_ci.pNext = NULL;
6629 ds_pool_ci.maxSets = 1;
6630 ds_pool_ci.poolSizeCount = 1;
6631 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006632
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006633 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006634 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006635 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006636
Tony Barboureb254902015-07-15 12:50:33 -06006637 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006638 dsl_binding.binding = 0;
6639 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6640 dsl_binding.descriptorCount = 1;
6641 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6642 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006643
Tony Barboureb254902015-07-15 12:50:33 -06006644 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006645 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6646 ds_layout_ci.pNext = NULL;
6647 ds_layout_ci.bindingCount = 1;
6648 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006649 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006651 ASSERT_VK_SUCCESS(err);
6652
6653 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006654 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006655 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006656 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006657 alloc_info.descriptorPool = ds_pool;
6658 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006659 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006660 ASSERT_VK_SUCCESS(err);
6661
Tony Barboureb254902015-07-15 12:50:33 -06006662 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006663 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6664 pipeline_layout_ci.pNext = NULL;
6665 pipeline_layout_ci.setLayoutCount = 1;
6666 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006667
6668 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006669 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006670 ASSERT_VK_SUCCESS(err);
6671
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006672 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006673 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006674 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006675 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006676
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006677 VkPipelineObj pipe(m_device);
6678 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006679 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006680 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006681 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006682
Tony Barbour552f6c02016-12-21 14:34:07 -07006683 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006684 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6685 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6686 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006688 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006689
Chia-I Wuf7458c52015-10-26 21:10:41 +08006690 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6692 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006693}
6694
Karl Schultz6addd812016-02-02 17:17:23 -07006695TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006696 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006697 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006698
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006700
Tony Barbour1fa09702017-03-16 12:09:08 -06006701 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006702 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006703 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6704 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006705
6706 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006707 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6708 ds_pool_ci.pNext = NULL;
6709 ds_pool_ci.maxSets = 1;
6710 ds_pool_ci.poolSizeCount = 1;
6711 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006712
6713 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006714 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006715 ASSERT_VK_SUCCESS(err);
6716
6717 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006718 dsl_binding.binding = 0;
6719 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6720 dsl_binding.descriptorCount = 1;
6721 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6722 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006723
6724 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006725 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6726 ds_layout_ci.pNext = NULL;
6727 ds_layout_ci.bindingCount = 1;
6728 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006729 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006731 ASSERT_VK_SUCCESS(err);
6732
6733 VkDescriptorSet descriptorSet;
6734 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006735 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006736 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006737 alloc_info.descriptorPool = ds_pool;
6738 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006739 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006740 ASSERT_VK_SUCCESS(err);
6741
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006742 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006743 VkWriteDescriptorSet descriptor_write;
6744 memset(&descriptor_write, 0, sizeof(descriptor_write));
6745 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6746 descriptor_write.dstSet = descriptorSet;
6747 descriptor_write.dstBinding = 0;
6748 descriptor_write.descriptorCount = 1;
6749 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6750 descriptor_write.pTexelBufferView = &view;
6751
6752 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6753
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006754 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006755
6756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6758}
6759
Mark Youngd339ba32016-05-30 13:28:35 -06006760TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006761 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006762
6763 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006765 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006766
Tony Barbour1fa09702017-03-16 12:09:08 -06006767 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006768
6769 // Create a buffer with no bound memory and then attempt to create
6770 // a buffer view.
6771 VkBufferCreateInfo buff_ci = {};
6772 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006773 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006774 buff_ci.size = 256;
6775 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6776 VkBuffer buffer;
6777 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6778 ASSERT_VK_SUCCESS(err);
6779
6780 VkBufferViewCreateInfo buff_view_ci = {};
6781 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6782 buff_view_ci.buffer = buffer;
6783 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6784 buff_view_ci.range = VK_WHOLE_SIZE;
6785 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006786 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006787
6788 m_errorMonitor->VerifyFound();
6789 vkDestroyBuffer(m_device->device(), buffer, NULL);
6790 // If last error is success, it still created the view, so delete it.
6791 if (err == VK_SUCCESS) {
6792 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6793 }
6794}
6795
Karl Schultz6addd812016-02-02 17:17:23 -07006796TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6797 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6798 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006799 // 1. No dynamicOffset supplied
6800 // 2. Too many dynamicOffsets supplied
6801 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006802 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6804 " requires 1 dynamicOffsets, but only "
6805 "0 dynamicOffsets are left in "
6806 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006807
Tony Barbour1fa09702017-03-16 12:09:08 -06006808 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006809 ASSERT_NO_FATAL_FAILURE(InitViewport());
6810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6811
6812 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006813 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6814 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006815
6816 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6818 ds_pool_ci.pNext = NULL;
6819 ds_pool_ci.maxSets = 1;
6820 ds_pool_ci.poolSizeCount = 1;
6821 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006822
6823 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006824 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006825 ASSERT_VK_SUCCESS(err);
6826
6827 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006828 dsl_binding.binding = 0;
6829 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6830 dsl_binding.descriptorCount = 1;
6831 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6832 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006833
6834 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006835 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6836 ds_layout_ci.pNext = NULL;
6837 ds_layout_ci.bindingCount = 1;
6838 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006839 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006840 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006841 ASSERT_VK_SUCCESS(err);
6842
6843 VkDescriptorSet descriptorSet;
6844 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006845 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006846 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006847 alloc_info.descriptorPool = ds_pool;
6848 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006849 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006850 ASSERT_VK_SUCCESS(err);
6851
6852 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006853 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6854 pipeline_layout_ci.pNext = NULL;
6855 pipeline_layout_ci.setLayoutCount = 1;
6856 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006857
6858 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006859 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006860 ASSERT_VK_SUCCESS(err);
6861
6862 // Create a buffer to update the descriptor with
6863 uint32_t qfi = 0;
6864 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006865 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6866 buffCI.size = 1024;
6867 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6868 buffCI.queueFamilyIndexCount = 1;
6869 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006870
6871 VkBuffer dyub;
6872 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6873 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006874 // Allocate memory and bind to buffer so we can make it to the appropriate
6875 // error
6876 VkMemoryAllocateInfo mem_alloc = {};
6877 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6878 mem_alloc.pNext = NULL;
6879 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006880 mem_alloc.memoryTypeIndex = 0;
6881
6882 VkMemoryRequirements memReqs;
6883 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006884 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006885 if (!pass) {
6886 vkDestroyBuffer(m_device->device(), dyub, NULL);
6887 return;
6888 }
6889
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006890 VkDeviceMemory mem;
6891 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6892 ASSERT_VK_SUCCESS(err);
6893 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6894 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006895 // Correctly update descriptor to avoid "NOT_UPDATED" error
6896 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006897 buffInfo.buffer = dyub;
6898 buffInfo.offset = 0;
6899 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006900
6901 VkWriteDescriptorSet descriptor_write;
6902 memset(&descriptor_write, 0, sizeof(descriptor_write));
6903 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6904 descriptor_write.dstSet = descriptorSet;
6905 descriptor_write.dstBinding = 0;
6906 descriptor_write.descriptorCount = 1;
6907 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6908 descriptor_write.pBufferInfo = &buffInfo;
6909
6910 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6911
Tony Barbour552f6c02016-12-21 14:34:07 -07006912 m_commandBuffer->BeginCommandBuffer();
6913 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006914 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6915 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006916 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006917 uint32_t pDynOff[2] = {512, 756};
6918 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6920 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6921 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6922 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006923 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006924 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6926 " dynamic offset 512 combined with "
6927 "offset 0 and range 1024 that "
6928 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006929 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006930 char const *vsSource =
6931 "#version 450\n"
6932 "\n"
6933 "out gl_PerVertex { \n"
6934 " vec4 gl_Position;\n"
6935 "};\n"
6936 "void main(){\n"
6937 " gl_Position = vec4(1);\n"
6938 "}\n";
6939 char const *fsSource =
6940 "#version 450\n"
6941 "\n"
6942 "layout(location=0) out vec4 x;\n"
6943 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6944 "void main(){\n"
6945 " x = vec4(bar.y);\n"
6946 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006947 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6948 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6949 VkPipelineObj pipe(m_device);
6950 pipe.AddShader(&vs);
6951 pipe.AddShader(&fs);
6952 pipe.AddColorAttachment();
6953 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6954
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006955 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6956 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6957 VkRect2D scissor = {{0, 0}, {16, 16}};
6958 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006960 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006961 // This update should succeed, but offset size of 512 will overstep buffer
6962 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006963 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6964 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006965 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006966 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006967
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006968 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006969 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006970
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006971 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006972 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006973 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6974}
6975
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006976TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006977 TEST_DESCRIPTION(
6978 "Attempt to update a descriptor with a non-sparse buffer "
6979 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006980 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006982 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6984 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006985
Tony Barbour1fa09702017-03-16 12:09:08 -06006986 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006987 ASSERT_NO_FATAL_FAILURE(InitViewport());
6988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6989
6990 VkDescriptorPoolSize ds_type_count = {};
6991 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6992 ds_type_count.descriptorCount = 1;
6993
6994 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6995 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6996 ds_pool_ci.pNext = NULL;
6997 ds_pool_ci.maxSets = 1;
6998 ds_pool_ci.poolSizeCount = 1;
6999 ds_pool_ci.pPoolSizes = &ds_type_count;
7000
7001 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007002 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007003 ASSERT_VK_SUCCESS(err);
7004
7005 VkDescriptorSetLayoutBinding dsl_binding = {};
7006 dsl_binding.binding = 0;
7007 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7008 dsl_binding.descriptorCount = 1;
7009 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7010 dsl_binding.pImmutableSamplers = NULL;
7011
7012 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7013 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7014 ds_layout_ci.pNext = NULL;
7015 ds_layout_ci.bindingCount = 1;
7016 ds_layout_ci.pBindings = &dsl_binding;
7017 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007018 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007019 ASSERT_VK_SUCCESS(err);
7020
7021 VkDescriptorSet descriptorSet;
7022 VkDescriptorSetAllocateInfo alloc_info = {};
7023 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7024 alloc_info.descriptorSetCount = 1;
7025 alloc_info.descriptorPool = ds_pool;
7026 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007027 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007028 ASSERT_VK_SUCCESS(err);
7029
7030 // Create a buffer to update the descriptor with
7031 uint32_t qfi = 0;
7032 VkBufferCreateInfo buffCI = {};
7033 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7034 buffCI.size = 1024;
7035 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7036 buffCI.queueFamilyIndexCount = 1;
7037 buffCI.pQueueFamilyIndices = &qfi;
7038
7039 VkBuffer dyub;
7040 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7041 ASSERT_VK_SUCCESS(err);
7042
7043 // Attempt to update descriptor without binding memory to it
7044 VkDescriptorBufferInfo buffInfo = {};
7045 buffInfo.buffer = dyub;
7046 buffInfo.offset = 0;
7047 buffInfo.range = 1024;
7048
7049 VkWriteDescriptorSet descriptor_write;
7050 memset(&descriptor_write, 0, sizeof(descriptor_write));
7051 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7052 descriptor_write.dstSet = descriptorSet;
7053 descriptor_write.dstBinding = 0;
7054 descriptor_write.descriptorCount = 1;
7055 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7056 descriptor_write.pBufferInfo = &buffInfo;
7057
7058 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7059 m_errorMonitor->VerifyFound();
7060
7061 vkDestroyBuffer(m_device->device(), dyub, NULL);
7062 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7063 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7064}
7065
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007066TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007067 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007068 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007069 ASSERT_NO_FATAL_FAILURE(InitViewport());
7070 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7071
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007072 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007073 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007074 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7075 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7076 pipeline_layout_ci.pushConstantRangeCount = 1;
7077 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7078
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007079 //
7080 // Check for invalid push constant ranges in pipeline layouts.
7081 //
7082 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007083 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007084 char const *msg;
7085 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007086
Karl Schultzc81037d2016-05-12 08:11:23 -06007087 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7088 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7089 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7090 "vkCreatePipelineLayout() call has push constants index 0 with "
7091 "size 0."},
7092 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7093 "vkCreatePipelineLayout() call has push constants index 0 with "
7094 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007095 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007096 "vkCreatePipelineLayout() call has push constants index 0 with "
7097 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007098 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007099 "vkCreatePipelineLayout() call has push constants index 0 with "
7100 "size 0."},
7101 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7102 "vkCreatePipelineLayout() call has push constants index 0 with "
7103 "offset 1. Offset must"},
7104 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7105 "vkCreatePipelineLayout() call has push constants index 0 "
7106 "with offset "},
7107 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7108 "vkCreatePipelineLayout() call has push constants "
7109 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007110 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007111 "vkCreatePipelineLayout() call has push constants index 0 "
7112 "with offset "},
7113 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7114 "vkCreatePipelineLayout() call has push "
7115 "constants index 0 with offset "},
7116 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7117 "vkCreatePipelineLayout() call has push "
7118 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007119 }};
7120
7121 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007122 for (const auto &iter : range_tests) {
7123 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7125 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007126 m_errorMonitor->VerifyFound();
7127 if (VK_SUCCESS == err) {
7128 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7129 }
7130 }
7131
7132 // Check for invalid stage flag
7133 pc_range.offset = 0;
7134 pc_range.size = 16;
7135 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007136 m_errorMonitor->SetDesiredFailureMsg(
7137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7138 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007139 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007140 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007141 if (VK_SUCCESS == err) {
7142 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7143 }
7144
Karl Schultzc59b72d2017-02-24 15:45:05 -07007145 // Check for duplicate stage flags in a list of push constant ranges.
7146 // A shader can only have one push constant block and that block is mapped
7147 // to the push constant range that has that shader's stage flag set.
7148 // The shader's stage flag can only appear once in all the ranges, so the
7149 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007150 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007151 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007152 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007153 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007154 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007155 // Overlapping ranges are OK, but a stage flag can appear only once.
7156 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7157 {
7158 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7159 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7160 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7161 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007162 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007163 {
7164 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7165 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7166 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7167 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7168 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7169 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7170 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7171 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7172 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7173 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7174 }},
7175 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7176 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7177 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7178 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7179 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7180 {
7181 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7182 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7183 }},
7184 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7185 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7186 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7187 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7188 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7189 {
7190 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7191 }},
7192 },
7193 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007194
Karl Schultzc59b72d2017-02-24 15:45:05 -07007195 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007196 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007197 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007199 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007200 m_errorMonitor->VerifyFound();
7201 if (VK_SUCCESS == err) {
7202 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7203 }
7204 }
7205
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007206 //
7207 // CmdPushConstants tests
7208 //
7209
Karl Schultzc59b72d2017-02-24 15:45:05 -07007210 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007211 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007212 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007213 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007214 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007215 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007216 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007217 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007218
7219 const uint8_t dummy_values[100] = {};
7220
7221 m_commandBuffer->BeginCommandBuffer();
7222 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007223
7224 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007225 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007227 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007228 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007229
Karl Schultzc59b72d2017-02-24 15:45:05 -07007230 m_errorMonitor->ExpectSuccess();
7231 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7232 m_errorMonitor->VerifyNotFound();
7233 m_errorMonitor->ExpectSuccess();
7234 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7235 m_errorMonitor->VerifyNotFound();
7236 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7237 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7238 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7239 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7240 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7241 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7242 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007243 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007244 for (const auto &iter : cmd_range_tests) {
7245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7246 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7247 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007248 m_errorMonitor->VerifyFound();
7249 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007250
Tony Barbour552f6c02016-12-21 14:34:07 -07007251 m_commandBuffer->EndRenderPass();
7252 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007253 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007254}
7255
Karl Schultz6addd812016-02-02 17:17:23 -07007256TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007257 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007258 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007259
Tony Barbour1fa09702017-03-16 12:09:08 -06007260 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007261 ASSERT_NO_FATAL_FAILURE(InitViewport());
7262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7263
7264 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7265 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007266 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7267 ds_type_count[0].descriptorCount = 10;
7268 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7269 ds_type_count[1].descriptorCount = 2;
7270 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7271 ds_type_count[2].descriptorCount = 2;
7272 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7273 ds_type_count[3].descriptorCount = 5;
7274 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7275 // type
7276 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7277 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7278 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007279
7280 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007281 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7282 ds_pool_ci.pNext = NULL;
7283 ds_pool_ci.maxSets = 5;
7284 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7285 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007286
7287 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007288 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007289 ASSERT_VK_SUCCESS(err);
7290
7291 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7292 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007293 dsl_binding[0].binding = 0;
7294 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7295 dsl_binding[0].descriptorCount = 5;
7296 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7297 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007298
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007299 // Create layout identical to set0 layout but w/ different stageFlags
7300 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007301 dsl_fs_stage_only.binding = 0;
7302 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7303 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007304 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7305 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007306 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007307 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007308 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7309 ds_layout_ci.pNext = NULL;
7310 ds_layout_ci.bindingCount = 1;
7311 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007312 static const uint32_t NUM_LAYOUTS = 4;
7313 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007314 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007315 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7316 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007317 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007318 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007319 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007320 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007321 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007322 dsl_binding[0].binding = 0;
7323 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007324 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007325 dsl_binding[1].binding = 1;
7326 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7327 dsl_binding[1].descriptorCount = 2;
7328 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7329 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007330 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007331 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007332 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007333 ASSERT_VK_SUCCESS(err);
7334 dsl_binding[0].binding = 0;
7335 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007336 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007337 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007338 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007339 ASSERT_VK_SUCCESS(err);
7340 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007341 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007342 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007343 ASSERT_VK_SUCCESS(err);
7344
7345 static const uint32_t NUM_SETS = 4;
7346 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7347 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007348 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007349 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007350 alloc_info.descriptorPool = ds_pool;
7351 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007352 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007353 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007354 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007355 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007356 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007357 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007358 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007359
7360 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007361 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7362 pipeline_layout_ci.pNext = NULL;
7363 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7364 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007365
7366 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007367 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007368 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007369 // Create pipelineLayout with only one setLayout
7370 pipeline_layout_ci.setLayoutCount = 1;
7371 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007372 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007373 ASSERT_VK_SUCCESS(err);
7374 // Create pipelineLayout with 2 descriptor setLayout at index 0
7375 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7376 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007377 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007378 ASSERT_VK_SUCCESS(err);
7379 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7380 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7381 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007382 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007383 ASSERT_VK_SUCCESS(err);
7384 // Create pipelineLayout with UB type, but stageFlags for FS only
7385 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7386 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007387 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007388 ASSERT_VK_SUCCESS(err);
7389 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7390 VkDescriptorSetLayout pl_bad_s0[2] = {};
7391 pl_bad_s0[0] = ds_layout_fs_only;
7392 pl_bad_s0[1] = ds_layout[1];
7393 pipeline_layout_ci.setLayoutCount = 2;
7394 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7395 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007396 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007397 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007398
Tobin Ehlis88452832015-12-03 09:40:56 -07007399 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007400 char const *vsSource =
7401 "#version 450\n"
7402 "\n"
7403 "out gl_PerVertex {\n"
7404 " vec4 gl_Position;\n"
7405 "};\n"
7406 "void main(){\n"
7407 " gl_Position = vec4(1);\n"
7408 "}\n";
7409 char const *fsSource =
7410 "#version 450\n"
7411 "\n"
7412 "layout(location=0) out vec4 x;\n"
7413 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7414 "void main(){\n"
7415 " x = vec4(bar.y);\n"
7416 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007417 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7418 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007419 VkPipelineObj pipe(m_device);
7420 pipe.AddShader(&vs);
7421 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007422 pipe.AddColorAttachment();
7423 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007424
Tony Barbour552f6c02016-12-21 14:34:07 -07007425 m_commandBuffer->BeginCommandBuffer();
7426 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007427
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007428 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007429 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7430 // of PSO
7431 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7432 // cmd_pipeline.c
7433 // due to the fact that cmd_alloc_dset_data() has not been called in
7434 // cmd_bind_graphics_pipeline()
7435 // TODO : Want to cause various binding incompatibility issues here to test
7436 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007437 // First cause various verify_layout_compatibility() fails
7438 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 // verify_set_layout_compatibility fail cases:
7440 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007442 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7443 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007444 m_errorMonitor->VerifyFound();
7445
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007446 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7448 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7449 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007450 m_errorMonitor->VerifyFound();
7451
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007452 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007453 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7454 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7456 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7457 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007458 m_errorMonitor->VerifyFound();
7459
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007460 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7461 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7463 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7464 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007465 m_errorMonitor->VerifyFound();
7466
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007467 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7468 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7470 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7471 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7472 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007473 m_errorMonitor->VerifyFound();
7474
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007475 // Cause INFO messages due to disturbing previously bound Sets
7476 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007477 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7478 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007479 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7481 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7482 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007483 m_errorMonitor->VerifyFound();
7484
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007485 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7486 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007487 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7489 " newly bound as set #0 so set #1 and "
7490 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007491 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7492 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007493 m_errorMonitor->VerifyFound();
7494
Tobin Ehlis10fad692016-07-07 12:00:36 -06007495 // Now that we're done actively using the pipelineLayout that gfx pipeline
7496 // was created with, we should be able to delete it. Do that now to verify
7497 // that validation obeys pipelineLayout lifetime
7498 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7499
Tobin Ehlis88452832015-12-03 09:40:56 -07007500 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007501 // 1. Error due to not binding required set (we actually use same code as
7502 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007503 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7504 &descriptorSet[0], 0, NULL);
7505 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7506 &descriptorSet[1], 0, NULL);
7507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007508
7509 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7510 VkRect2D scissor = {{0, 0}, {16, 16}};
7511 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7512 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7513
Tobin Ehlis88452832015-12-03 09:40:56 -07007514 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007515 m_errorMonitor->VerifyFound();
7516
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007517 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007518 // 2. Error due to bound set not being compatible with PSO's
7519 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007520 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7521 &descriptorSet[0], 0, NULL);
7522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007523 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007524 m_errorMonitor->VerifyFound();
7525
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007526 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007527 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007528 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7529 }
7530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007531 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7532 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7533}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007534
Karl Schultz6addd812016-02-02 17:17:23 -07007535TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7537 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007538
Tony Barbour1fa09702017-03-16 12:09:08 -06007539 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007540 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007541 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007542 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007543
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007544 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007545}
7546
Karl Schultz6addd812016-02-02 17:17:23 -07007547TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7548 VkResult err;
7549 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007550
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007552
Tony Barbour1fa09702017-03-16 12:09:08 -06007553 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007554
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007555 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007556 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007557 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007558 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007559 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007560 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007561
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007562 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007563 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007564
7565 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007566 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007567 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7568
7569 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007570 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007571 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007572 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007573 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007574
7575 // The error should be caught by validation of the BeginCommandBuffer call
7576 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7577
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007578 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007579 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007580}
7581
Karl Schultz6addd812016-02-02 17:17:23 -07007582TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007583 // Cause error due to Begin while recording CB
7584 // Then cause 2 errors for attempting to reset CB w/o having
7585 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7586 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007588
Tony Barbour1fa09702017-03-16 12:09:08 -06007589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007590
7591 // Calls AllocateCommandBuffers
7592 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7593
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007594 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007595 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007596 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7597 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007598 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7599 cmd_buf_info.pNext = NULL;
7600 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007601 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007602
7603 // Begin CB to transition to recording state
7604 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7605 // Can't re-begin. This should trigger error
7606 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007607 m_errorMonitor->VerifyFound();
7608
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007610 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007611 // Reset attempt will trigger error due to incorrect CommandPool state
7612 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007613 m_errorMonitor->VerifyFound();
7614
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007616 // Transition CB to RECORDED state
7617 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7618 // Now attempting to Begin will implicitly reset, which triggers error
7619 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007620 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007621}
7622
Karl Schultz6addd812016-02-02 17:17:23 -07007623TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007624 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007625 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007626
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7628 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007629
Tony Barbour1fa09702017-03-16 12:09:08 -06007630 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007631 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007632
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007633 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007634 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7635 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007636
7637 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007638 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7639 ds_pool_ci.pNext = NULL;
7640 ds_pool_ci.maxSets = 1;
7641 ds_pool_ci.poolSizeCount = 1;
7642 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007643
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007644 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007645 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007646 ASSERT_VK_SUCCESS(err);
7647
Tony Barboureb254902015-07-15 12:50:33 -06007648 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007649 dsl_binding.binding = 0;
7650 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7651 dsl_binding.descriptorCount = 1;
7652 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7653 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007654
Tony Barboureb254902015-07-15 12:50:33 -06007655 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007656 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7657 ds_layout_ci.pNext = NULL;
7658 ds_layout_ci.bindingCount = 1;
7659 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007660
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007661 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007662 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007663 ASSERT_VK_SUCCESS(err);
7664
7665 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007666 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007667 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007668 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007669 alloc_info.descriptorPool = ds_pool;
7670 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007671 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007672 ASSERT_VK_SUCCESS(err);
7673
Tony Barboureb254902015-07-15 12:50:33 -06007674 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007675 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7676 pipeline_layout_ci.setLayoutCount = 1;
7677 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007678
7679 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007680 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007681 ASSERT_VK_SUCCESS(err);
7682
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007683 VkViewport vp = {}; // Just need dummy vp to point to
7684 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007685
7686 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007687 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7688 vp_state_ci.scissorCount = 1;
7689 vp_state_ci.pScissors = &sc;
7690 vp_state_ci.viewportCount = 1;
7691 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007692
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007693 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7694 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7695 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7696 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7697 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7698 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007699 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007700 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007701 rs_state_ci.lineWidth = 1.0f;
7702
7703 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7704 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7705 vi_ci.pNext = nullptr;
7706 vi_ci.vertexBindingDescriptionCount = 0;
7707 vi_ci.pVertexBindingDescriptions = nullptr;
7708 vi_ci.vertexAttributeDescriptionCount = 0;
7709 vi_ci.pVertexAttributeDescriptions = nullptr;
7710
7711 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7712 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7713 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7714
7715 VkPipelineShaderStageCreateInfo shaderStages[2];
7716 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7717
7718 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7719 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007720 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007721 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007722
Tony Barboureb254902015-07-15 12:50:33 -06007723 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007724 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7725 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007726 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007727 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7728 gp_ci.layout = pipeline_layout;
7729 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007730 gp_ci.pVertexInputState = &vi_ci;
7731 gp_ci.pInputAssemblyState = &ia_ci;
7732
7733 gp_ci.stageCount = 1;
7734 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007735
7736 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007737 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7738 pc_ci.initialDataSize = 0;
7739 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007740
7741 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007742 VkPipelineCache pipelineCache;
7743
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007744 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007745 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007746 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007747 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007748
Chia-I Wuf7458c52015-10-26 21:10:41 +08007749 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7750 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7751 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7752 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007753}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007754
Tobin Ehlis912df022015-09-17 08:46:18 -06007755/*// TODO : This test should be good, but needs Tess support in compiler to run
7756TEST_F(VkLayerTest, InvalidPatchControlPoints)
7757{
7758 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007759 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007760
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007762 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7763primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007764
Tony Barbour1fa09702017-03-16 12:09:08 -06007765 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007767
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007768 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007769 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007770 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007771
7772 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7773 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7774 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007775 ds_pool_ci.poolSizeCount = 1;
7776 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007777
7778 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007779 err = vkCreateDescriptorPool(m_device->device(),
7780VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007781 ASSERT_VK_SUCCESS(err);
7782
7783 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007784 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007785 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007786 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007787 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7788 dsl_binding.pImmutableSamplers = NULL;
7789
7790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007791 ds_layout_ci.sType =
7792VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007793 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007794 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007795 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007796
7797 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7799&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007800 ASSERT_VK_SUCCESS(err);
7801
7802 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007803 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7804VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007805 ASSERT_VK_SUCCESS(err);
7806
7807 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007808 pipeline_layout_ci.sType =
7809VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007810 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007811 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007812 pipeline_layout_ci.pSetLayouts = &ds_layout;
7813
7814 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007815 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7816&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007817 ASSERT_VK_SUCCESS(err);
7818
7819 VkPipelineShaderStageCreateInfo shaderStages[3];
7820 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7821
Karl Schultz6addd812016-02-02 17:17:23 -07007822 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7823this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007824 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007825 VkShaderObj
7826tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7827this);
7828 VkShaderObj
7829te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7830this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007831
Karl Schultz6addd812016-02-02 17:17:23 -07007832 shaderStages[0].sType =
7833VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007834 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007835 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007836 shaderStages[1].sType =
7837VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007838 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007839 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007840 shaderStages[2].sType =
7841VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007842 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007843 shaderStages[2].shader = te.handle();
7844
7845 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007846 iaCI.sType =
7847VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007848 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007849
7850 VkPipelineTessellationStateCreateInfo tsCI = {};
7851 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7852 tsCI.patchControlPoints = 0; // This will cause an error
7853
7854 VkGraphicsPipelineCreateInfo gp_ci = {};
7855 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7856 gp_ci.pNext = NULL;
7857 gp_ci.stageCount = 3;
7858 gp_ci.pStages = shaderStages;
7859 gp_ci.pVertexInputState = NULL;
7860 gp_ci.pInputAssemblyState = &iaCI;
7861 gp_ci.pTessellationState = &tsCI;
7862 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007863 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007864 gp_ci.pMultisampleState = NULL;
7865 gp_ci.pDepthStencilState = NULL;
7866 gp_ci.pColorBlendState = NULL;
7867 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7868 gp_ci.layout = pipeline_layout;
7869 gp_ci.renderPass = renderPass();
7870
7871 VkPipelineCacheCreateInfo pc_ci = {};
7872 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7873 pc_ci.pNext = NULL;
7874 pc_ci.initialSize = 0;
7875 pc_ci.initialData = 0;
7876 pc_ci.maxSize = 0;
7877
7878 VkPipeline pipeline;
7879 VkPipelineCache pipelineCache;
7880
Karl Schultz6addd812016-02-02 17:17:23 -07007881 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7882&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007883 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007884 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7885&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007886
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007887 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007888
Chia-I Wuf7458c52015-10-26 21:10:41 +08007889 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7890 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7891 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7892 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007893}
7894*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007895
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007896TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007897 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007898
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007899 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007900
Tony Barbour1fa09702017-03-16 12:09:08 -06007901 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007902 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007903
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007904 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007905 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7906 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007907
7908 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007909 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7910 ds_pool_ci.maxSets = 1;
7911 ds_pool_ci.poolSizeCount = 1;
7912 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007913
7914 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007915 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007916 ASSERT_VK_SUCCESS(err);
7917
7918 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007919 dsl_binding.binding = 0;
7920 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7921 dsl_binding.descriptorCount = 1;
7922 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007923
7924 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007925 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7926 ds_layout_ci.bindingCount = 1;
7927 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007928
7929 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007930 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007931 ASSERT_VK_SUCCESS(err);
7932
7933 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007934 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007935 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007936 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007937 alloc_info.descriptorPool = ds_pool;
7938 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007939 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007940 ASSERT_VK_SUCCESS(err);
7941
7942 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007943 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7944 pipeline_layout_ci.setLayoutCount = 1;
7945 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946
7947 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007948 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007949 ASSERT_VK_SUCCESS(err);
7950
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007951 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007952 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007953 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007954 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007955 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007956 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007957
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007958 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7959 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7960 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7961 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7962 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7963 rs_state_ci.depthClampEnable = VK_FALSE;
7964 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7965 rs_state_ci.depthBiasEnable = VK_FALSE;
7966
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007967 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7968 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7969 vi_ci.pNext = nullptr;
7970 vi_ci.vertexBindingDescriptionCount = 0;
7971 vi_ci.pVertexBindingDescriptions = nullptr;
7972 vi_ci.vertexAttributeDescriptionCount = 0;
7973 vi_ci.pVertexAttributeDescriptions = nullptr;
7974
7975 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7976 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7977 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7978
7979 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7980 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7981 pipe_ms_state_ci.pNext = NULL;
7982 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7983 pipe_ms_state_ci.sampleShadingEnable = 0;
7984 pipe_ms_state_ci.minSampleShading = 1.0;
7985 pipe_ms_state_ci.pSampleMask = NULL;
7986
Cody Northropeb3a6c12015-10-05 14:44:45 -06007987 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007988 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007989
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007990 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007991 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007992 shaderStages[0] = vs.GetStageCreateInfo();
7993 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007994
7995 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007996 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7997 gp_ci.stageCount = 2;
7998 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007999 gp_ci.pVertexInputState = &vi_ci;
8000 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008001 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008002 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008003 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008004 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8005 gp_ci.layout = pipeline_layout;
8006 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008007
8008 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008009 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008010
8011 VkPipeline pipeline;
8012 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008013 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008014 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008015
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008016 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008017 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008018
8019 // Check case where multiViewport is disabled and viewport count is not 1
8020 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8023 vp_state_ci.scissorCount = 0;
8024 vp_state_ci.viewportCount = 0;
8025 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8026 m_errorMonitor->VerifyFound();
8027 } else {
8028 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008029 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008030 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008031 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008032
8033 // Check is that viewportcount and scissorcount match
8034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8035 vp_state_ci.scissorCount = 1;
8036 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8037 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8038 m_errorMonitor->VerifyFound();
8039
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008040 // Check case where multiViewport is enabled and viewport count is greater than max
8041 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8044 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8045 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8046 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8047 m_errorMonitor->VerifyFound();
8048 }
8049 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008050
Chia-I Wuf7458c52015-10-26 21:10:41 +08008051 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8052 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8053 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8054 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008055}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008056
8057// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
8058// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008059TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008060 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008061
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008062 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8063
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008065
Tony Barbour1fa09702017-03-16 12:09:08 -06008066 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008068
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008069 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008070 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8071 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008072
8073 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008074 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8075 ds_pool_ci.maxSets = 1;
8076 ds_pool_ci.poolSizeCount = 1;
8077 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008078
8079 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008080 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008081 ASSERT_VK_SUCCESS(err);
8082
8083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008084 dsl_binding.binding = 0;
8085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8086 dsl_binding.descriptorCount = 1;
8087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008088
8089 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008090 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8091 ds_layout_ci.bindingCount = 1;
8092 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008093
8094 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008095 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008096 ASSERT_VK_SUCCESS(err);
8097
8098 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008099 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008100 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008101 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008102 alloc_info.descriptorPool = ds_pool;
8103 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008104 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008105 ASSERT_VK_SUCCESS(err);
8106
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008107 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8108 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8109 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8110
8111 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8112 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8113 vi_ci.pNext = nullptr;
8114 vi_ci.vertexBindingDescriptionCount = 0;
8115 vi_ci.pVertexBindingDescriptions = nullptr;
8116 vi_ci.vertexAttributeDescriptionCount = 0;
8117 vi_ci.pVertexAttributeDescriptions = nullptr;
8118
8119 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8120 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8121 pipe_ms_state_ci.pNext = NULL;
8122 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8123 pipe_ms_state_ci.sampleShadingEnable = 0;
8124 pipe_ms_state_ci.minSampleShading = 1.0;
8125 pipe_ms_state_ci.pSampleMask = NULL;
8126
Tobin Ehlise68360f2015-10-01 11:15:13 -06008127 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008128 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8129 pipeline_layout_ci.setLayoutCount = 1;
8130 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008131
8132 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008133 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008134 ASSERT_VK_SUCCESS(err);
8135
8136 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8137 // Set scissor as dynamic to avoid second error
8138 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008139 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8140 dyn_state_ci.dynamicStateCount = 1;
8141 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008142
Cody Northropeb3a6c12015-10-05 14:44:45 -06008143 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008144 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008145
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008146 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008147 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8148 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008149 shaderStages[0] = vs.GetStageCreateInfo();
8150 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008152 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8153 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8154 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8155 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8156 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8157 rs_state_ci.depthClampEnable = VK_FALSE;
8158 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8159 rs_state_ci.depthBiasEnable = VK_FALSE;
8160
Tobin Ehlise68360f2015-10-01 11:15:13 -06008161 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008162 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8163 gp_ci.stageCount = 2;
8164 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008165 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008166 // Not setting VP state w/o dynamic vp state should cause validation error
8167 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008168 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008169 gp_ci.pVertexInputState = &vi_ci;
8170 gp_ci.pInputAssemblyState = &ia_ci;
8171 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008172 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8173 gp_ci.layout = pipeline_layout;
8174 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008175
8176 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008177 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008178
8179 VkPipeline pipeline;
8180 VkPipelineCache pipelineCache;
8181
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008182 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008183 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008184 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008186 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008187
Chia-I Wuf7458c52015-10-26 21:10:41 +08008188 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8189 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8190 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8191 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008192}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008193
8194// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8195// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008196TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8197 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008198
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008200
Tony Barbour1fa09702017-03-16 12:09:08 -06008201 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008202
8203 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008204 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008205 return;
8206 }
8207
Tobin Ehlise68360f2015-10-01 11:15:13 -06008208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008209
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008210 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008211 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8212 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008213
8214 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008215 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8216 ds_pool_ci.maxSets = 1;
8217 ds_pool_ci.poolSizeCount = 1;
8218 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008219
8220 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008221 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008222 ASSERT_VK_SUCCESS(err);
8223
8224 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008225 dsl_binding.binding = 0;
8226 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8227 dsl_binding.descriptorCount = 1;
8228 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008229
8230 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8232 ds_layout_ci.bindingCount = 1;
8233 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008234
8235 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008236 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008237 ASSERT_VK_SUCCESS(err);
8238
8239 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008240 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008241 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008242 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008243 alloc_info.descriptorPool = ds_pool;
8244 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008245 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008246 ASSERT_VK_SUCCESS(err);
8247
8248 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008249 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8250 pipeline_layout_ci.setLayoutCount = 1;
8251 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008252
8253 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008254 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008255 ASSERT_VK_SUCCESS(err);
8256
8257 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008258 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8259 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008260 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008261 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008262 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008263
8264 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8265 // Set scissor as dynamic to avoid that error
8266 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008267 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8268 dyn_state_ci.dynamicStateCount = 1;
8269 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008270
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008271 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8272 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8273 pipe_ms_state_ci.pNext = NULL;
8274 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8275 pipe_ms_state_ci.sampleShadingEnable = 0;
8276 pipe_ms_state_ci.minSampleShading = 1.0;
8277 pipe_ms_state_ci.pSampleMask = NULL;
8278
Cody Northropeb3a6c12015-10-05 14:44:45 -06008279 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008280 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008281
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008282 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008283 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8284 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008285 shaderStages[0] = vs.GetStageCreateInfo();
8286 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008287
Cody Northropf6622dc2015-10-06 10:33:21 -06008288 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8289 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8290 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008291 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008292 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008293 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008294 vi_ci.pVertexAttributeDescriptions = nullptr;
8295
8296 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8297 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8298 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8299
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008300 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008301 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008302 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008303 rs_ci.pNext = nullptr;
8304
Mark Youngc89c6312016-03-31 16:03:20 -06008305 VkPipelineColorBlendAttachmentState att = {};
8306 att.blendEnable = VK_FALSE;
8307 att.colorWriteMask = 0xf;
8308
Cody Northropf6622dc2015-10-06 10:33:21 -06008309 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8310 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8311 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008312 cb_ci.attachmentCount = 1;
8313 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008314
Tobin Ehlise68360f2015-10-01 11:15:13 -06008315 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008316 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8317 gp_ci.stageCount = 2;
8318 gp_ci.pStages = shaderStages;
8319 gp_ci.pVertexInputState = &vi_ci;
8320 gp_ci.pInputAssemblyState = &ia_ci;
8321 gp_ci.pViewportState = &vp_state_ci;
8322 gp_ci.pRasterizationState = &rs_ci;
8323 gp_ci.pColorBlendState = &cb_ci;
8324 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008325 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008326 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8327 gp_ci.layout = pipeline_layout;
8328 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008329
8330 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008331 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008332
8333 VkPipeline pipeline;
8334 VkPipelineCache pipelineCache;
8335
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008336 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008337 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008338 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008339
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008340 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008341
Tobin Ehlisd332f282015-10-02 11:00:56 -06008342 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008343 // First need to successfully create the PSO from above by setting
8344 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008346
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008347 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008348 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008349 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008350 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008351 m_commandBuffer->BeginCommandBuffer();
8352 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008353 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008354 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008355 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008356 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008357 Draw(1, 0, 0, 0);
8358
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008359 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008360
8361 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8362 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8363 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8364 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008365 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008366}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008367
8368// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008369// viewportCount
8370TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8371 VkResult err;
8372
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008374
Tony Barbour1fa09702017-03-16 12:09:08 -06008375 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008376
8377 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008378 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008379 return;
8380 }
8381
Karl Schultz6addd812016-02-02 17:17:23 -07008382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8383
8384 VkDescriptorPoolSize ds_type_count = {};
8385 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8386 ds_type_count.descriptorCount = 1;
8387
8388 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8389 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8390 ds_pool_ci.maxSets = 1;
8391 ds_pool_ci.poolSizeCount = 1;
8392 ds_pool_ci.pPoolSizes = &ds_type_count;
8393
8394 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008395 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008396 ASSERT_VK_SUCCESS(err);
8397
8398 VkDescriptorSetLayoutBinding dsl_binding = {};
8399 dsl_binding.binding = 0;
8400 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8401 dsl_binding.descriptorCount = 1;
8402 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8403
8404 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8405 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8406 ds_layout_ci.bindingCount = 1;
8407 ds_layout_ci.pBindings = &dsl_binding;
8408
8409 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008410 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008411 ASSERT_VK_SUCCESS(err);
8412
8413 VkDescriptorSet descriptorSet;
8414 VkDescriptorSetAllocateInfo alloc_info = {};
8415 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8416 alloc_info.descriptorSetCount = 1;
8417 alloc_info.descriptorPool = ds_pool;
8418 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008419 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008420 ASSERT_VK_SUCCESS(err);
8421
8422 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8423 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8424 pipeline_layout_ci.setLayoutCount = 1;
8425 pipeline_layout_ci.pSetLayouts = &ds_layout;
8426
8427 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008428 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008429 ASSERT_VK_SUCCESS(err);
8430
8431 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8432 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8433 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008434 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008435 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008436 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008437
8438 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8439 // Set scissor as dynamic to avoid that error
8440 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8441 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8442 dyn_state_ci.dynamicStateCount = 1;
8443 dyn_state_ci.pDynamicStates = &vp_state;
8444
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008445 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8446 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8447 pipe_ms_state_ci.pNext = NULL;
8448 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8449 pipe_ms_state_ci.sampleShadingEnable = 0;
8450 pipe_ms_state_ci.minSampleShading = 1.0;
8451 pipe_ms_state_ci.pSampleMask = NULL;
8452
Karl Schultz6addd812016-02-02 17:17:23 -07008453 VkPipelineShaderStageCreateInfo shaderStages[2];
8454 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8455
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008456 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008457 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8458 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008459 shaderStages[0] = vs.GetStageCreateInfo();
8460 shaderStages[1] = fs.GetStageCreateInfo();
8461
8462 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8463 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8464 vi_ci.pNext = nullptr;
8465 vi_ci.vertexBindingDescriptionCount = 0;
8466 vi_ci.pVertexBindingDescriptions = nullptr;
8467 vi_ci.vertexAttributeDescriptionCount = 0;
8468 vi_ci.pVertexAttributeDescriptions = nullptr;
8469
8470 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8471 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8472 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8473
8474 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8475 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008476 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008477 rs_ci.pNext = nullptr;
8478
Mark Youngc89c6312016-03-31 16:03:20 -06008479 VkPipelineColorBlendAttachmentState att = {};
8480 att.blendEnable = VK_FALSE;
8481 att.colorWriteMask = 0xf;
8482
Karl Schultz6addd812016-02-02 17:17:23 -07008483 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8484 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8485 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008486 cb_ci.attachmentCount = 1;
8487 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008488
8489 VkGraphicsPipelineCreateInfo gp_ci = {};
8490 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8491 gp_ci.stageCount = 2;
8492 gp_ci.pStages = shaderStages;
8493 gp_ci.pVertexInputState = &vi_ci;
8494 gp_ci.pInputAssemblyState = &ia_ci;
8495 gp_ci.pViewportState = &vp_state_ci;
8496 gp_ci.pRasterizationState = &rs_ci;
8497 gp_ci.pColorBlendState = &cb_ci;
8498 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008499 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008500 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8501 gp_ci.layout = pipeline_layout;
8502 gp_ci.renderPass = renderPass();
8503
8504 VkPipelineCacheCreateInfo pc_ci = {};
8505 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8506
8507 VkPipeline pipeline;
8508 VkPipelineCache pipelineCache;
8509
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008510 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008511 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008512 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008513
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008514 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008515
8516 // Now hit second fail case where we set scissor w/ different count than PSO
8517 // First need to successfully create the PSO from above by setting
8518 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8520 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008521
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008522 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008523 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008524 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008525 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008526 m_commandBuffer->BeginCommandBuffer();
8527 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008528 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008529 VkViewport viewports[1] = {};
8530 viewports[0].width = 8;
8531 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008532 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008533 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008534 Draw(1, 0, 0, 0);
8535
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008536 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008537
Chia-I Wuf7458c52015-10-26 21:10:41 +08008538 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8539 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8540 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8541 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008542 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008543}
8544
Mark Young7394fdd2016-03-31 14:56:43 -06008545TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8546 VkResult err;
8547
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008549
Tony Barbour1fa09702017-03-16 12:09:08 -06008550 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8552
8553 VkDescriptorPoolSize ds_type_count = {};
8554 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8555 ds_type_count.descriptorCount = 1;
8556
8557 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8558 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8559 ds_pool_ci.maxSets = 1;
8560 ds_pool_ci.poolSizeCount = 1;
8561 ds_pool_ci.pPoolSizes = &ds_type_count;
8562
8563 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008564 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008565 ASSERT_VK_SUCCESS(err);
8566
8567 VkDescriptorSetLayoutBinding dsl_binding = {};
8568 dsl_binding.binding = 0;
8569 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8570 dsl_binding.descriptorCount = 1;
8571 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8572
8573 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8574 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8575 ds_layout_ci.bindingCount = 1;
8576 ds_layout_ci.pBindings = &dsl_binding;
8577
8578 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008579 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008580 ASSERT_VK_SUCCESS(err);
8581
8582 VkDescriptorSet descriptorSet;
8583 VkDescriptorSetAllocateInfo alloc_info = {};
8584 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8585 alloc_info.descriptorSetCount = 1;
8586 alloc_info.descriptorPool = ds_pool;
8587 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008588 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008589 ASSERT_VK_SUCCESS(err);
8590
8591 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8592 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8593 pipeline_layout_ci.setLayoutCount = 1;
8594 pipeline_layout_ci.pSetLayouts = &ds_layout;
8595
8596 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008597 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008598 ASSERT_VK_SUCCESS(err);
8599
8600 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8601 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8602 vp_state_ci.scissorCount = 1;
8603 vp_state_ci.pScissors = NULL;
8604 vp_state_ci.viewportCount = 1;
8605 vp_state_ci.pViewports = NULL;
8606
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008607 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008608 // Set scissor as dynamic to avoid that error
8609 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8610 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8611 dyn_state_ci.dynamicStateCount = 2;
8612 dyn_state_ci.pDynamicStates = dynamic_states;
8613
8614 VkPipelineShaderStageCreateInfo shaderStages[2];
8615 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8616
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008617 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8618 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008619 this); // TODO - We shouldn't need a fragment shader
8620 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008621 shaderStages[0] = vs.GetStageCreateInfo();
8622 shaderStages[1] = fs.GetStageCreateInfo();
8623
8624 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8625 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8626 vi_ci.pNext = nullptr;
8627 vi_ci.vertexBindingDescriptionCount = 0;
8628 vi_ci.pVertexBindingDescriptions = nullptr;
8629 vi_ci.vertexAttributeDescriptionCount = 0;
8630 vi_ci.pVertexAttributeDescriptions = nullptr;
8631
8632 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8633 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8634 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8635
8636 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8637 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8638 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008639 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008640
Mark Young47107952016-05-02 15:59:55 -06008641 // Check too low (line width of -1.0f).
8642 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008643
8644 VkPipelineColorBlendAttachmentState att = {};
8645 att.blendEnable = VK_FALSE;
8646 att.colorWriteMask = 0xf;
8647
8648 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8649 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8650 cb_ci.pNext = nullptr;
8651 cb_ci.attachmentCount = 1;
8652 cb_ci.pAttachments = &att;
8653
8654 VkGraphicsPipelineCreateInfo gp_ci = {};
8655 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8656 gp_ci.stageCount = 2;
8657 gp_ci.pStages = shaderStages;
8658 gp_ci.pVertexInputState = &vi_ci;
8659 gp_ci.pInputAssemblyState = &ia_ci;
8660 gp_ci.pViewportState = &vp_state_ci;
8661 gp_ci.pRasterizationState = &rs_ci;
8662 gp_ci.pColorBlendState = &cb_ci;
8663 gp_ci.pDynamicState = &dyn_state_ci;
8664 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8665 gp_ci.layout = pipeline_layout;
8666 gp_ci.renderPass = renderPass();
8667
8668 VkPipelineCacheCreateInfo pc_ci = {};
8669 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8670
8671 VkPipeline pipeline;
8672 VkPipelineCache pipelineCache;
8673
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008674 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008675 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008676 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008677
8678 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008679 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008680
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008682
8683 // Check too high (line width of 65536.0f).
8684 rs_ci.lineWidth = 65536.0f;
8685
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008686 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008687 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008688 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008689
8690 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008691 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008692
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008694
8695 dyn_state_ci.dynamicStateCount = 3;
8696
8697 rs_ci.lineWidth = 1.0f;
8698
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008699 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008700 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008701 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008702 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008703 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008704
8705 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008706 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008707 m_errorMonitor->VerifyFound();
8708
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008710
8711 // Check too high with dynamic setting.
8712 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8713 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008714 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008715
8716 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8717 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8718 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8719 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008720 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008721}
8722
Karl Schultz6addd812016-02-02 17:17:23 -07008723TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008724 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008726 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008727
Tony Barbour1fa09702017-03-16 12:09:08 -06008728 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008730
Tony Barbour552f6c02016-12-21 14:34:07 -07008731 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008732 // Don't care about RenderPass handle b/c error should be flagged before
8733 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008734 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008735
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008736 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008737}
8738
Karl Schultz6addd812016-02-02 17:17:23 -07008739TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008740 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8742 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008743
Tony Barbour1fa09702017-03-16 12:09:08 -06008744 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008746
Tony Barbour552f6c02016-12-21 14:34:07 -07008747 m_commandBuffer->BeginCommandBuffer();
8748 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008749 // Just create a dummy Renderpass that's non-NULL so we can get to the
8750 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008751 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008752
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008753 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008754}
8755
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008756TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008757 TEST_DESCRIPTION(
8758 "Begin a renderPass where clearValueCount is less than"
8759 "the number of renderPass attachments that use loadOp"
8760 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008761
Tony Barbour1fa09702017-03-16 12:09:08 -06008762 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8764
8765 // Create a renderPass with a single attachment that uses loadOp CLEAR
8766 VkAttachmentReference attach = {};
8767 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8768 VkSubpassDescription subpass = {};
8769 subpass.inputAttachmentCount = 1;
8770 subpass.pInputAttachments = &attach;
8771 VkRenderPassCreateInfo rpci = {};
8772 rpci.subpassCount = 1;
8773 rpci.pSubpasses = &subpass;
8774 rpci.attachmentCount = 1;
8775 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008776 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008777 // Set loadOp to CLEAR
8778 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8779 rpci.pAttachments = &attach_desc;
8780 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8781 VkRenderPass rp;
8782 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8783
8784 VkCommandBufferInheritanceInfo hinfo = {};
8785 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8786 hinfo.renderPass = VK_NULL_HANDLE;
8787 hinfo.subpass = 0;
8788 hinfo.framebuffer = VK_NULL_HANDLE;
8789 hinfo.occlusionQueryEnable = VK_FALSE;
8790 hinfo.queryFlags = 0;
8791 hinfo.pipelineStatistics = 0;
8792 VkCommandBufferBeginInfo info = {};
8793 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8794 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8795 info.pInheritanceInfo = &hinfo;
8796
8797 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8798 VkRenderPassBeginInfo rp_begin = {};
8799 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8800 rp_begin.pNext = NULL;
8801 rp_begin.renderPass = renderPass();
8802 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008803 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008804
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008806
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008807 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008808
8809 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008810
8811 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008812}
8813
Slawomir Cygan0808f392016-11-28 17:53:23 +01008814TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008815 TEST_DESCRIPTION(
8816 "Begin a renderPass where clearValueCount is greater than"
8817 "the number of renderPass attachments that use loadOp"
8818 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008819
Tony Barbour1fa09702017-03-16 12:09:08 -06008820 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008821 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8822
8823 // Create a renderPass with a single attachment that uses loadOp CLEAR
8824 VkAttachmentReference attach = {};
8825 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8826 VkSubpassDescription subpass = {};
8827 subpass.inputAttachmentCount = 1;
8828 subpass.pInputAttachments = &attach;
8829 VkRenderPassCreateInfo rpci = {};
8830 rpci.subpassCount = 1;
8831 rpci.pSubpasses = &subpass;
8832 rpci.attachmentCount = 1;
8833 VkAttachmentDescription attach_desc = {};
8834 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8835 // Set loadOp to CLEAR
8836 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8837 rpci.pAttachments = &attach_desc;
8838 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8839 VkRenderPass rp;
8840 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8841
8842 VkCommandBufferBeginInfo info = {};
8843 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8844 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8845
8846 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8847 VkRenderPassBeginInfo rp_begin = {};
8848 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8849 rp_begin.pNext = NULL;
8850 rp_begin.renderPass = renderPass();
8851 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008852 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008853
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8855 " has a clearValueCount of"
8856 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008857
8858 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8859
8860 m_errorMonitor->VerifyFound();
8861
8862 vkDestroyRenderPass(m_device->device(), rp, NULL);
8863}
8864
Cody Northrop3bb4d962016-05-09 16:15:57 -06008865TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008866 TEST_DESCRIPTION("End a command buffer with an active render pass");
8867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8869 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008870
Tony Barbour1fa09702017-03-16 12:09:08 -06008871 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008872 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8873
Tony Barbour552f6c02016-12-21 14:34:07 -07008874 m_commandBuffer->BeginCommandBuffer();
8875 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8876 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008877
8878 m_errorMonitor->VerifyFound();
8879
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008880 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8881 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008882}
8883
Karl Schultz6addd812016-02-02 17:17:23 -07008884TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008885 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8887 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008888
Tony Barbour1fa09702017-03-16 12:09:08 -06008889 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008890 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008891
Tony Barbour552f6c02016-12-21 14:34:07 -07008892 m_commandBuffer->BeginCommandBuffer();
8893 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008894
8895 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008896 vk_testing::Buffer dstBuffer;
8897 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008898
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008899 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008900
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008901 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008902}
8903
Karl Schultz6addd812016-02-02 17:17:23 -07008904TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008905 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8907 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008908
Tony Barbour1fa09702017-03-16 12:09:08 -06008909 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008911
Tony Barbour552f6c02016-12-21 14:34:07 -07008912 m_commandBuffer->BeginCommandBuffer();
8913 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008914
8915 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008916 vk_testing::Buffer dstBuffer;
8917 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008918
Karl Schultz6addd812016-02-02 17:17:23 -07008919 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008920 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8921 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8922 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008923
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008924 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008925}
8926
Karl Schultz6addd812016-02-02 17:17:23 -07008927TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008928 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8930 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008931
Tony Barbour1fa09702017-03-16 12:09:08 -06008932 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008934
Tony Barbour552f6c02016-12-21 14:34:07 -07008935 m_commandBuffer->BeginCommandBuffer();
8936 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008937
Michael Lentine0a369f62016-02-03 16:51:46 -06008938 VkClearColorValue clear_color;
8939 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008940 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8941 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8942 const int32_t tex_width = 32;
8943 const int32_t tex_height = 32;
8944 VkImageCreateInfo image_create_info = {};
8945 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8946 image_create_info.pNext = NULL;
8947 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8948 image_create_info.format = tex_format;
8949 image_create_info.extent.width = tex_width;
8950 image_create_info.extent.height = tex_height;
8951 image_create_info.extent.depth = 1;
8952 image_create_info.mipLevels = 1;
8953 image_create_info.arrayLayers = 1;
8954 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8955 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008956 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008957
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008958 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008959 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008960
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008961 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008962
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008963 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008964
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008965 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008966}
8967
Karl Schultz6addd812016-02-02 17:17:23 -07008968TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008969 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8971 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008972
Tony Barbour1fa09702017-03-16 12:09:08 -06008973 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008975
Dave Houlton1d2022c2017-03-29 11:43:58 -06008976 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008977 if (!depth_format) {
8978 printf(" No Depth + Stencil format found. Skipped.\n");
8979 return;
8980 }
8981
Tony Barbour552f6c02016-12-21 14:34:07 -07008982 m_commandBuffer->BeginCommandBuffer();
8983 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008984
8985 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008986 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008987 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8988 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008989 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008990 image_create_info.extent.width = 64;
8991 image_create_info.extent.height = 64;
8992 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8993 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008994
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008995 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008996 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008997
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008998 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008999
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009000 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9001 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009002
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009003 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009004}
9005
Karl Schultz6addd812016-02-02 17:17:23 -07009006TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009007 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009008 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009009
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9011 "vkCmdClearAttachments(): This call "
9012 "must be issued inside an active "
9013 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009014
Tony Barbour1fa09702017-03-16 12:09:08 -06009015 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009017
9018 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009019 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009020 ASSERT_VK_SUCCESS(err);
9021
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009022 VkClearAttachment color_attachment;
9023 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9024 color_attachment.clearValue.color.float32[0] = 0;
9025 color_attachment.clearValue.color.float32[1] = 0;
9026 color_attachment.clearValue.color.float32[2] = 0;
9027 color_attachment.clearValue.color.float32[3] = 0;
9028 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009029 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009030 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009031
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009032 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009033}
9034
Chris Forbes3b97e932016-09-07 11:29:24 +12009035TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009036 TEST_DESCRIPTION(
9037 "Test that an error is produced when CmdNextSubpass is "
9038 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009039
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9041 "vkCmdNextSubpass(): Attempted to advance "
9042 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009043
Tony Barbour1fa09702017-03-16 12:09:08 -06009044 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9046
Tony Barbour552f6c02016-12-21 14:34:07 -07009047 m_commandBuffer->BeginCommandBuffer();
9048 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009049
9050 // error here.
9051 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9052 m_errorMonitor->VerifyFound();
9053
Tony Barbour552f6c02016-12-21 14:34:07 -07009054 m_commandBuffer->EndRenderPass();
9055 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009056}
9057
Chris Forbes6d624702016-09-07 13:57:05 +12009058TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009059 TEST_DESCRIPTION(
9060 "Test that an error is produced when CmdEndRenderPass is "
9061 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009062
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9064 "vkCmdEndRenderPass(): Called before reaching "
9065 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009066
Tony Barbour1fa09702017-03-16 12:09:08 -06009067 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009068 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9069 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009070
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009071 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009072
9073 VkRenderPass rp;
9074 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9075 ASSERT_VK_SUCCESS(err);
9076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009077 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009078
9079 VkFramebuffer fb;
9080 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9081 ASSERT_VK_SUCCESS(err);
9082
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009083 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009084
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009085 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009086
9087 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9088
9089 // Error here.
9090 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9091 m_errorMonitor->VerifyFound();
9092
9093 // Clean up.
9094 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9095 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9096}
9097
Karl Schultz9e66a292016-04-21 15:57:51 -06009098TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9099 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9101 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009102
Tony Barbour1fa09702017-03-16 12:09:08 -06009103 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009104 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009105
9106 VkBufferMemoryBarrier buf_barrier = {};
9107 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9108 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9109 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9110 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9111 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9112 buf_barrier.buffer = VK_NULL_HANDLE;
9113 buf_barrier.offset = 0;
9114 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009115 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9116 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009117
9118 m_errorMonitor->VerifyFound();
9119}
9120
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009121TEST_F(VkLayerTest, InvalidBarriers) {
9122 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9123
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009125
Tony Barbour1fa09702017-03-16 12:09:08 -06009126 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009127 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009128 if (!depth_format) {
9129 printf(" No Depth + Stencil format found. Skipped.\n");
9130 return;
9131 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009132 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9133
9134 VkMemoryBarrier mem_barrier = {};
9135 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9136 mem_barrier.pNext = NULL;
9137 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9138 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009139 m_commandBuffer->BeginCommandBuffer();
9140 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009141 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009142 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009143 &mem_barrier, 0, nullptr, 0, nullptr);
9144 m_errorMonitor->VerifyFound();
9145
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009147 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009148 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009149 ASSERT_TRUE(image.initialized());
9150 VkImageMemoryBarrier img_barrier = {};
9151 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9152 img_barrier.pNext = NULL;
9153 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9154 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9155 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9156 // New layout can't be UNDEFINED
9157 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9158 img_barrier.image = image.handle();
9159 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9160 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9161 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9162 img_barrier.subresourceRange.baseArrayLayer = 0;
9163 img_barrier.subresourceRange.baseMipLevel = 0;
9164 img_barrier.subresourceRange.layerCount = 1;
9165 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009166 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9167 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009168 m_errorMonitor->VerifyFound();
9169 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9170
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9172 "Subresource must have the sum of the "
9173 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009174 // baseArrayLayer + layerCount must be <= image's arrayLayers
9175 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009176 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9177 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009178 m_errorMonitor->VerifyFound();
9179 img_barrier.subresourceRange.baseArrayLayer = 0;
9180
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009182 // baseMipLevel + levelCount must be <= image's mipLevels
9183 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009184 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9185 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009186 m_errorMonitor->VerifyFound();
9187 img_barrier.subresourceRange.baseMipLevel = 0;
9188
Mike Weiblen7053aa32017-01-25 15:21:10 -07009189 // levelCount must be non-zero.
9190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9191 img_barrier.subresourceRange.levelCount = 0;
9192 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9193 nullptr, 0, nullptr, 1, &img_barrier);
9194 m_errorMonitor->VerifyFound();
9195 img_barrier.subresourceRange.levelCount = 1;
9196
9197 // layerCount must be non-zero.
9198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9199 img_barrier.subresourceRange.layerCount = 0;
9200 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9201 nullptr, 0, nullptr, 1, &img_barrier);
9202 m_errorMonitor->VerifyFound();
9203 img_barrier.subresourceRange.layerCount = 1;
9204
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009206 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009207 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9208 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009209 VkBufferMemoryBarrier buf_barrier = {};
9210 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9211 buf_barrier.pNext = NULL;
9212 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9213 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9214 buf_barrier.buffer = buffer.handle();
9215 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9216 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9217 buf_barrier.offset = 0;
9218 buf_barrier.size = VK_WHOLE_SIZE;
9219 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009220 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9221 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009222 m_errorMonitor->VerifyFound();
9223 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009226 buf_barrier.offset = 257;
9227 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009228 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9229 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009230 m_errorMonitor->VerifyFound();
9231 buf_barrier.offset = 0;
9232
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009234 buf_barrier.size = 257;
9235 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009236 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9237 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009238 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009239
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009240 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009241 m_errorMonitor->SetDesiredFailureMsg(
9242 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009243 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009244 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009245 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009246 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009247 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9248 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009249 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009250
9251 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009252 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009253 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9254 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009255 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009256
9257 // Having anything other than DEPTH or STENCIL is an error
9258 m_errorMonitor->SetDesiredFailureMsg(
9259 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9260 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9261 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9262 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9263 nullptr, 0, nullptr, 1, &img_barrier);
9264 m_errorMonitor->VerifyFound();
9265
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009266 // Now test depth-only
9267 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009268 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9269 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009270 VkDepthStencilObj d_image(m_device);
9271 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9272 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009273 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009274 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009275 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009276
9277 // DEPTH bit must be set
9278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9279 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009280 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009281 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9282 0, nullptr, 0, nullptr, 1, &img_barrier);
9283 m_errorMonitor->VerifyFound();
9284
9285 // No bits other than DEPTH may be set
9286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9287 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9288 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009289 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9290 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009291 m_errorMonitor->VerifyFound();
9292 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009293
9294 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009295 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9296 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009297 VkDepthStencilObj s_image(m_device);
9298 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9299 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009300 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009301 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009302 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009303 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9305 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009306 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009307 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9308 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009309 m_errorMonitor->VerifyFound();
9310 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009311
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009312 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009313 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009314 c_image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009315 ASSERT_TRUE(c_image.initialized());
9316 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9317 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9318 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009319
9320 // COLOR bit must be set
9321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9322 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009323 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009324 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9325 nullptr, 0, nullptr, 1, &img_barrier);
9326 m_errorMonitor->VerifyFound();
9327
9328 // No bits other than COLOR may be set
9329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9330 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9331 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009332 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9333 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009334 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009335
Mike Weiblene6e01172017-03-07 22:18:40 -07009336 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9337 {
9338 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009339 img_color.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009340 ASSERT_TRUE(img_color.initialized());
9341
9342 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009343 img_ds.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009344 ASSERT_TRUE(img_ds.initialized());
9345
9346 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009347 img_xfer_src.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009348 ASSERT_TRUE(img_xfer_src.initialized());
9349
9350 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009351 img_xfer_dst.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009352 ASSERT_TRUE(img_xfer_dst.initialized());
9353
9354 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009355 img_sampled.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009356 ASSERT_TRUE(img_sampled.initialized());
9357
9358 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009359 img_input.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009360 ASSERT_TRUE(img_input.initialized());
9361
9362 const struct {
9363 VkImageObj &image_obj;
9364 VkImageLayout bad_layout;
9365 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9366 } bad_buffer_layouts[] = {
9367 // clang-format off
9368 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9369 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9370 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9371 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9372 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9373 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9374 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9375 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9376 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9377 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9378 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9379 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9380 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9381 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9382 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9383 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9384 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9385 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9386 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9387 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9388 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9389 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9390 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9391 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9392 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9393 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9394 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9395 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9396 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9397 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9398 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9399 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9400 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9401 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9402 // clang-format on
9403 };
9404 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9405
9406 for (uint32_t i = 0; i < layout_count; ++i) {
9407 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9408 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9409 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9410 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9411 : VK_IMAGE_ASPECT_COLOR_BIT;
9412
9413 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9414 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9416 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9417 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9418 m_errorMonitor->VerifyFound();
9419
9420 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9421 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9423 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9424 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9425 m_errorMonitor->VerifyFound();
9426 }
9427
9428 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9429 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9430 }
9431
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009432 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9433
9434 // Create command pool with incompatible queueflags
9435 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009436 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009437 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009438 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009439 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009440 }
9441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9442
9443 VkCommandPool command_pool;
9444 VkCommandPoolCreateInfo pool_create_info{};
9445 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9446 pool_create_info.queueFamilyIndex = queue_family_index;
9447 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9448 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9449
9450 // Allocate a command buffer
9451 VkCommandBuffer bad_command_buffer;
9452 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9453 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9454 command_buffer_allocate_info.commandPool = command_pool;
9455 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9456 command_buffer_allocate_info.commandBufferCount = 1;
9457 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9458
9459 VkCommandBufferBeginInfo cbbi = {};
9460 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9461 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9462 buf_barrier.offset = 0;
9463 buf_barrier.size = VK_WHOLE_SIZE;
9464 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9465 &buf_barrier, 0, nullptr);
9466 m_errorMonitor->VerifyFound();
9467
9468 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9469 vkEndCommandBuffer(bad_command_buffer);
9470 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009471 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009472 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009473 }
9474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9475 VkEvent event;
9476 VkEventCreateInfo event_create_info{};
9477 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9478 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9479 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9480 nullptr, 0, nullptr);
9481 m_errorMonitor->VerifyFound();
9482
9483 vkEndCommandBuffer(bad_command_buffer);
9484 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009485}
9486
Tony Barbour18ba25c2016-09-29 13:42:40 -06009487TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9488 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9489
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009491 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009492 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009493 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
Mike Weiblen62d08a32017-03-07 22:18:27 -07009494 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009495 ASSERT_TRUE(image.initialized());
9496
9497 VkImageMemoryBarrier barrier = {};
9498 VkImageSubresourceRange range;
9499 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9500 barrier.srcAccessMask = 0;
9501 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9502 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9503 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9504 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9505 barrier.image = image.handle();
9506 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9507 range.baseMipLevel = 0;
9508 range.levelCount = 1;
9509 range.baseArrayLayer = 0;
9510 range.layerCount = 1;
9511 barrier.subresourceRange = range;
9512 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9513 cmdbuf.BeginCommandBuffer();
9514 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9515 &barrier);
9516 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9517 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9518 barrier.srcAccessMask = 0;
9519 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9520 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9521 &barrier);
9522
9523 m_errorMonitor->VerifyFound();
9524}
9525
Karl Schultz6addd812016-02-02 17:17:23 -07009526TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009527 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009530
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009531 uint32_t const indices[] = {0};
9532 VkBufferCreateInfo buf_info = {};
9533 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9534 buf_info.size = 1024;
9535 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9536 buf_info.queueFamilyIndexCount = 1;
9537 buf_info.pQueueFamilyIndices = indices;
9538
9539 VkBuffer buffer;
9540 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9541 ASSERT_VK_SUCCESS(err);
9542
9543 VkMemoryRequirements requirements;
9544 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9545
9546 VkMemoryAllocateInfo alloc_info{};
9547 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9548 alloc_info.pNext = NULL;
9549 alloc_info.memoryTypeIndex = 0;
9550 alloc_info.allocationSize = requirements.size;
9551 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9552 ASSERT_TRUE(pass);
9553
9554 VkDeviceMemory memory;
9555 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9556 ASSERT_VK_SUCCESS(err);
9557
9558 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009559 ASSERT_VK_SUCCESS(err);
9560
Tony Barbour552f6c02016-12-21 14:34:07 -07009561 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009562 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009563
Karl Schultz6addd812016-02-02 17:17:23 -07009564 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9565 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009566 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9568 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009569 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009570
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009571 vkFreeMemory(m_device->device(), memory, NULL);
9572 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009573}
9574
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009575TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9576 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009577 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9579 VkBufferCreateInfo buffCI = {};
9580 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9581 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009582 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009583 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009584 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009585 uint32_t qfi[2];
9586 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009587 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009588
9589 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009590 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009591
9592 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9594 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9595 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009596 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009597 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009598
9599 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009600 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9602
9603 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9604 buffCI.queueFamilyIndexCount = 2;
9605 qfi[0] = 1;
9606 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009607 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009608 VkDeviceMemory mem;
9609 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009610 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009611
9612 VkMemoryAllocateInfo alloc_info = {};
9613 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9614 alloc_info.allocationSize = 1024;
9615 bool pass = false;
9616 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9617 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009618 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009619 return;
9620 }
9621 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009622 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009623
9624 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009625 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009626 m_commandBuffer->end();
9627 QueueCommandBuffer(false);
9628 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009629 vkDestroyBuffer(m_device->device(), ib2, NULL);
9630 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009631 }
9632
Tony Barbourdf4c0042016-06-01 15:55:43 -06009633 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009634}
9635
Karl Schultz6addd812016-02-02 17:17:23 -07009636TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009637 TEST_DESCRIPTION(
9638 "Attempt vkCmdExecuteCommands with a primary command buffer"
9639 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009640
Tony Barbour1fa09702017-03-16 12:09:08 -06009641 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009642 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009643
Chris Forbesf29a84f2016-10-06 18:39:28 +13009644 // An empty primary command buffer
9645 VkCommandBufferObj cb(m_device, m_commandPool);
9646 cb.BeginCommandBuffer();
9647 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009648
Chris Forbesf29a84f2016-10-06 18:39:28 +13009649 m_commandBuffer->BeginCommandBuffer();
9650 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9651 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009652
Chris Forbesf29a84f2016-10-06 18:39:28 +13009653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9654 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009655 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009656
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -06009657 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009658}
9659
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009660TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009661 TEST_DESCRIPTION(
9662 "Attempt to update descriptor sets for images and buffers "
9663 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009664 VkResult err;
9665
Tony Barbour1fa09702017-03-16 12:09:08 -06009666 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009667 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9668 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9669 ds_type_count[i].type = VkDescriptorType(i);
9670 ds_type_count[i].descriptorCount = 1;
9671 }
9672 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9673 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9674 ds_pool_ci.pNext = NULL;
9675 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9676 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9677 ds_pool_ci.pPoolSizes = ds_type_count;
9678
9679 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009680 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009681 ASSERT_VK_SUCCESS(err);
9682
9683 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009684 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009685 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9686 dsl_binding[i].binding = 0;
9687 dsl_binding[i].descriptorType = VkDescriptorType(i);
9688 dsl_binding[i].descriptorCount = 1;
9689 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9690 dsl_binding[i].pImmutableSamplers = NULL;
9691 }
9692
9693 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9694 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9695 ds_layout_ci.pNext = NULL;
9696 ds_layout_ci.bindingCount = 1;
9697 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9698 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9699 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009700 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009701 ASSERT_VK_SUCCESS(err);
9702 }
9703 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9704 VkDescriptorSetAllocateInfo alloc_info = {};
9705 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9706 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9707 alloc_info.descriptorPool = ds_pool;
9708 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009709 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009710 ASSERT_VK_SUCCESS(err);
9711
9712 // Create a buffer & bufferView to be used for invalid updates
9713 VkBufferCreateInfo buff_ci = {};
9714 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009715 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009716 buff_ci.size = 256;
9717 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009718 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009719 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9720 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009721
9722 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9723 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9724 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9725 ASSERT_VK_SUCCESS(err);
9726
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009727 VkMemoryRequirements mem_reqs;
9728 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9729 VkMemoryAllocateInfo mem_alloc_info = {};
9730 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9731 mem_alloc_info.pNext = NULL;
9732 mem_alloc_info.memoryTypeIndex = 0;
9733 mem_alloc_info.allocationSize = mem_reqs.size;
9734 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9735 if (!pass) {
9736 vkDestroyBuffer(m_device->device(), buffer, NULL);
9737 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9738 return;
9739 }
9740 VkDeviceMemory mem;
9741 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9742 ASSERT_VK_SUCCESS(err);
9743 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9744 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009745
9746 VkBufferViewCreateInfo buff_view_ci = {};
9747 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9748 buff_view_ci.buffer = buffer;
9749 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9750 buff_view_ci.range = VK_WHOLE_SIZE;
9751 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009752 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009753 ASSERT_VK_SUCCESS(err);
9754
Tony Barbour415497c2017-01-24 10:06:09 -07009755 // Now get resources / view for storage_texel_buffer
9756 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9757 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9758 if (!pass) {
9759 vkDestroyBuffer(m_device->device(), buffer, NULL);
9760 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9761 vkFreeMemory(m_device->device(), mem, NULL);
9762 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9763 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9764 return;
9765 }
9766 VkDeviceMemory storage_texel_buffer_mem;
9767 VkBufferView storage_texel_buffer_view;
9768 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9769 ASSERT_VK_SUCCESS(err);
9770 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9771 ASSERT_VK_SUCCESS(err);
9772 buff_view_ci.buffer = storage_texel_buffer;
9773 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9774 ASSERT_VK_SUCCESS(err);
9775
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009776 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009777 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009778 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009779 image_ci.format = VK_FORMAT_UNDEFINED;
9780 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9781 VkFormat format = static_cast<VkFormat>(f);
9782 VkFormatProperties fProps = m_device->format_properties(format);
9783 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9784 image_ci.format = format;
9785 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9786 break;
9787 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9788 image_ci.format = format;
9789 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9790 break;
9791 }
9792 }
9793 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9794 return;
9795 }
9796
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009797 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9798 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009799 image_ci.extent.width = 64;
9800 image_ci.extent.height = 64;
9801 image_ci.extent.depth = 1;
9802 image_ci.mipLevels = 1;
9803 image_ci.arrayLayers = 1;
9804 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009805 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009806 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009807 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9808 VkImage image;
9809 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9810 ASSERT_VK_SUCCESS(err);
9811 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009812 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009813
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009814 VkMemoryAllocateInfo mem_alloc = {};
9815 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9816 mem_alloc.pNext = NULL;
9817 mem_alloc.allocationSize = 0;
9818 mem_alloc.memoryTypeIndex = 0;
9819 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9820 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009821 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009822 ASSERT_TRUE(pass);
9823 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9824 ASSERT_VK_SUCCESS(err);
9825 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9826 ASSERT_VK_SUCCESS(err);
9827 // Now create view for image
9828 VkImageViewCreateInfo image_view_ci = {};
9829 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9830 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009831 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009832 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9833 image_view_ci.subresourceRange.layerCount = 1;
9834 image_view_ci.subresourceRange.baseArrayLayer = 0;
9835 image_view_ci.subresourceRange.levelCount = 1;
9836 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9837 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009838 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009839 ASSERT_VK_SUCCESS(err);
9840
9841 VkDescriptorBufferInfo buff_info = {};
9842 buff_info.buffer = buffer;
9843 VkDescriptorImageInfo img_info = {};
9844 img_info.imageView = image_view;
9845 VkWriteDescriptorSet descriptor_write = {};
9846 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9847 descriptor_write.dstBinding = 0;
9848 descriptor_write.descriptorCount = 1;
9849 descriptor_write.pTexelBufferView = &buff_view;
9850 descriptor_write.pBufferInfo = &buff_info;
9851 descriptor_write.pImageInfo = &img_info;
9852
9853 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009854 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009855 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9856 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9857 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9858 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9859 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9860 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9861 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9862 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9863 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9864 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9865 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009866 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009867 // Start loop at 1 as SAMPLER desc type has no usage bit error
9868 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009869 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9870 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9871 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9872 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009873 descriptor_write.descriptorType = VkDescriptorType(i);
9874 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009876
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009877 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009878
9879 m_errorMonitor->VerifyFound();
9880 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009881 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9882 descriptor_write.pTexelBufferView = &buff_view;
9883 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009884 }
Tony Barbour415497c2017-01-24 10:06:09 -07009885
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009886 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9887 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009888 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009889 vkDestroyImageView(m_device->device(), image_view, NULL);
9890 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009891 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009892 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009893 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009894 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009895 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009896 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9897}
9898
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009899TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009900 TEST_DESCRIPTION(
9901 "Attempt to update buffer descriptor set that has incorrect "
9902 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009903 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009904 "2. range value of 0\n"
9905 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009906 VkResult err;
9907
Tony Barbour1fa09702017-03-16 12:09:08 -06009908 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009909 VkDescriptorPoolSize ds_type_count = {};
9910 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9911 ds_type_count.descriptorCount = 1;
9912
9913 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9914 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9915 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009916 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009917 ds_pool_ci.maxSets = 1;
9918 ds_pool_ci.poolSizeCount = 1;
9919 ds_pool_ci.pPoolSizes = &ds_type_count;
9920
9921 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009922 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009923 ASSERT_VK_SUCCESS(err);
9924
9925 // Create layout with single uniform buffer descriptor
9926 VkDescriptorSetLayoutBinding dsl_binding = {};
9927 dsl_binding.binding = 0;
9928 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9929 dsl_binding.descriptorCount = 1;
9930 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9931 dsl_binding.pImmutableSamplers = NULL;
9932
9933 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9934 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9935 ds_layout_ci.pNext = NULL;
9936 ds_layout_ci.bindingCount = 1;
9937 ds_layout_ci.pBindings = &dsl_binding;
9938 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009939 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009940 ASSERT_VK_SUCCESS(err);
9941
9942 VkDescriptorSet descriptor_set = {};
9943 VkDescriptorSetAllocateInfo alloc_info = {};
9944 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9945 alloc_info.descriptorSetCount = 1;
9946 alloc_info.descriptorPool = ds_pool;
9947 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009948 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009949 ASSERT_VK_SUCCESS(err);
9950
9951 // Create a buffer to be used for invalid updates
9952 VkBufferCreateInfo buff_ci = {};
9953 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9954 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009955 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009956 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9957 VkBuffer buffer;
9958 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9959 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009960
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009961 // Have to bind memory to buffer before descriptor update
9962 VkMemoryAllocateInfo mem_alloc = {};
9963 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9964 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009965 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009966 mem_alloc.memoryTypeIndex = 0;
9967
9968 VkMemoryRequirements mem_reqs;
9969 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009970 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009971 if (!pass) {
9972 vkDestroyBuffer(m_device->device(), buffer, NULL);
9973 return;
9974 }
9975
9976 VkDeviceMemory mem;
9977 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9978 ASSERT_VK_SUCCESS(err);
9979 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9980 ASSERT_VK_SUCCESS(err);
9981
9982 VkDescriptorBufferInfo buff_info = {};
9983 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009984 // Cause error due to offset out of range
9985 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009986 buff_info.range = VK_WHOLE_SIZE;
9987 VkWriteDescriptorSet descriptor_write = {};
9988 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9989 descriptor_write.dstBinding = 0;
9990 descriptor_write.descriptorCount = 1;
9991 descriptor_write.pTexelBufferView = nullptr;
9992 descriptor_write.pBufferInfo = &buff_info;
9993 descriptor_write.pImageInfo = nullptr;
9994
9995 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9996 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009998
9999 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10000
10001 m_errorMonitor->VerifyFound();
10002 // Now cause error due to range of 0
10003 buff_info.offset = 0;
10004 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010006
10007 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10008
10009 m_errorMonitor->VerifyFound();
10010 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010011 buff_info.offset = 0;
10012 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010014
10015 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10016
10017 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010018 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010019 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10020 vkDestroyBuffer(m_device->device(), buffer, NULL);
10021 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10022 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10023}
10024
Tobin Ehlis845887e2017-02-02 19:01:44 -070010025TEST_F(VkLayerTest, DSBufferLimitErrors) {
10026 TEST_DESCRIPTION(
10027 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10028 "Test cases include:\n"
10029 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10030 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10031 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10032 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10033 VkResult err;
10034
Tony Barbour1fa09702017-03-16 12:09:08 -060010035 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010036 VkDescriptorPoolSize ds_type_count[2] = {};
10037 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10038 ds_type_count[0].descriptorCount = 1;
10039 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10040 ds_type_count[1].descriptorCount = 1;
10041
10042 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10043 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10044 ds_pool_ci.pNext = NULL;
10045 ds_pool_ci.maxSets = 1;
10046 ds_pool_ci.poolSizeCount = 2;
10047 ds_pool_ci.pPoolSizes = ds_type_count;
10048
10049 VkDescriptorPool ds_pool;
10050 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10051 ASSERT_VK_SUCCESS(err);
10052
10053 // Create layout with single uniform buffer & single storage buffer descriptor
10054 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10055 dsl_binding[0].binding = 0;
10056 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10057 dsl_binding[0].descriptorCount = 1;
10058 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10059 dsl_binding[0].pImmutableSamplers = NULL;
10060 dsl_binding[1].binding = 1;
10061 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10062 dsl_binding[1].descriptorCount = 1;
10063 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10064 dsl_binding[1].pImmutableSamplers = NULL;
10065
10066 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10067 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10068 ds_layout_ci.pNext = NULL;
10069 ds_layout_ci.bindingCount = 2;
10070 ds_layout_ci.pBindings = dsl_binding;
10071 VkDescriptorSetLayout ds_layout;
10072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10073 ASSERT_VK_SUCCESS(err);
10074
10075 VkDescriptorSet descriptor_set = {};
10076 VkDescriptorSetAllocateInfo alloc_info = {};
10077 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10078 alloc_info.descriptorSetCount = 1;
10079 alloc_info.descriptorPool = ds_pool;
10080 alloc_info.pSetLayouts = &ds_layout;
10081 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10082 ASSERT_VK_SUCCESS(err);
10083
10084 // Create a buffer to be used for invalid updates
10085 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10086 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10087 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10088 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10089 VkBufferCreateInfo ub_ci = {};
10090 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10091 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10092 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10093 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10094 VkBuffer uniform_buffer;
10095 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10096 ASSERT_VK_SUCCESS(err);
10097 VkBufferCreateInfo sb_ci = {};
10098 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10099 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10100 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10101 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10102 VkBuffer storage_buffer;
10103 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10104 ASSERT_VK_SUCCESS(err);
10105 // Have to bind memory to buffer before descriptor update
10106 VkMemoryAllocateInfo mem_alloc = {};
10107 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10108 mem_alloc.pNext = NULL;
10109 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10110 mem_alloc.memoryTypeIndex = 0;
10111
Cort Stratton77a0d592017-02-17 13:14:13 -080010112 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10113 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10114 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10115 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10116 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010117 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010118 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010119 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010120 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010122 return;
10123 }
10124
10125 VkDeviceMemory mem;
10126 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010127 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010128 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010129 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10130 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10131 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10132 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10133 return;
10134 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010135 ASSERT_VK_SUCCESS(err);
10136 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10137 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010138 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010139 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10140 ASSERT_VK_SUCCESS(err);
10141
10142 VkDescriptorBufferInfo buff_info = {};
10143 buff_info.buffer = uniform_buffer;
10144 buff_info.range = ub_ci.size; // This will exceed limit
10145 VkWriteDescriptorSet descriptor_write = {};
10146 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10147 descriptor_write.dstBinding = 0;
10148 descriptor_write.descriptorCount = 1;
10149 descriptor_write.pTexelBufferView = nullptr;
10150 descriptor_write.pBufferInfo = &buff_info;
10151 descriptor_write.pImageInfo = nullptr;
10152
10153 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10154 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010155 if (max_ub_range != UINT32_MAX) {
10156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10157 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10158 m_errorMonitor->VerifyFound();
10159 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010160 // Reduce size of range to acceptable limit & cause offset error
10161 buff_info.range = max_ub_range;
10162 buff_info.offset = min_ub_align - 1;
10163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10164 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10165 m_errorMonitor->VerifyFound();
10166
10167 // Now break storage updates
10168 buff_info.buffer = storage_buffer;
10169 buff_info.range = sb_ci.size; // This will exceed limit
10170 buff_info.offset = 0; // Reset offset for this update
10171
10172 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10173 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010174 if (max_ub_range != UINT32_MAX) {
10175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10176 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10177 m_errorMonitor->VerifyFound();
10178 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010179
10180 // Reduce size of range to acceptable limit & cause offset error
10181 buff_info.range = max_sb_range;
10182 buff_info.offset = min_sb_align - 1;
10183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10184 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10185 m_errorMonitor->VerifyFound();
10186
10187 vkFreeMemory(m_device->device(), mem, NULL);
10188 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10189 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10190 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10191 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10192}
10193
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010194TEST_F(VkLayerTest, DSAspectBitsErrors) {
10195 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10196 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010197 TEST_DESCRIPTION(
10198 "Attempt to update descriptor sets for images "
10199 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010200 VkResult err;
10201
Tony Barbour1fa09702017-03-16 12:09:08 -060010202 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010203 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010204 if (!depth_format) {
10205 printf(" No Depth + Stencil format found. Skipped.\n");
10206 return;
10207 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010208 VkDescriptorPoolSize ds_type_count = {};
10209 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10210 ds_type_count.descriptorCount = 1;
10211
10212 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10213 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10214 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010215 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010216 ds_pool_ci.maxSets = 5;
10217 ds_pool_ci.poolSizeCount = 1;
10218 ds_pool_ci.pPoolSizes = &ds_type_count;
10219
10220 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010221 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010222 ASSERT_VK_SUCCESS(err);
10223
10224 VkDescriptorSetLayoutBinding dsl_binding = {};
10225 dsl_binding.binding = 0;
10226 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10227 dsl_binding.descriptorCount = 1;
10228 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10229 dsl_binding.pImmutableSamplers = NULL;
10230
10231 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10232 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10233 ds_layout_ci.pNext = NULL;
10234 ds_layout_ci.bindingCount = 1;
10235 ds_layout_ci.pBindings = &dsl_binding;
10236 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010237 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010238 ASSERT_VK_SUCCESS(err);
10239
10240 VkDescriptorSet descriptor_set = {};
10241 VkDescriptorSetAllocateInfo alloc_info = {};
10242 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10243 alloc_info.descriptorSetCount = 1;
10244 alloc_info.descriptorPool = ds_pool;
10245 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010246 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010247 ASSERT_VK_SUCCESS(err);
10248
10249 // Create an image to be used for invalid updates
10250 VkImageCreateInfo image_ci = {};
10251 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10252 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010253 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010254 image_ci.extent.width = 64;
10255 image_ci.extent.height = 64;
10256 image_ci.extent.depth = 1;
10257 image_ci.mipLevels = 1;
10258 image_ci.arrayLayers = 1;
10259 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010260 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010261 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10262 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10263 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10264 VkImage image;
10265 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10266 ASSERT_VK_SUCCESS(err);
10267 // Bind memory to image
10268 VkMemoryRequirements mem_reqs;
10269 VkDeviceMemory image_mem;
10270 bool pass;
10271 VkMemoryAllocateInfo mem_alloc = {};
10272 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10273 mem_alloc.pNext = NULL;
10274 mem_alloc.allocationSize = 0;
10275 mem_alloc.memoryTypeIndex = 0;
10276 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10277 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010278 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010279 ASSERT_TRUE(pass);
10280 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10281 ASSERT_VK_SUCCESS(err);
10282 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10283 ASSERT_VK_SUCCESS(err);
10284 // Now create view for image
10285 VkImageViewCreateInfo image_view_ci = {};
10286 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10287 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010288 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010289 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10290 image_view_ci.subresourceRange.layerCount = 1;
10291 image_view_ci.subresourceRange.baseArrayLayer = 0;
10292 image_view_ci.subresourceRange.levelCount = 1;
10293 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010294 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010295
10296 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010297 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010298 ASSERT_VK_SUCCESS(err);
10299
10300 VkDescriptorImageInfo img_info = {};
10301 img_info.imageView = image_view;
10302 VkWriteDescriptorSet descriptor_write = {};
10303 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10304 descriptor_write.dstBinding = 0;
10305 descriptor_write.descriptorCount = 1;
10306 descriptor_write.pTexelBufferView = NULL;
10307 descriptor_write.pBufferInfo = NULL;
10308 descriptor_write.pImageInfo = &img_info;
10309 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10310 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010311 const char *error_msg =
10312 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10313 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010315
10316 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10317
10318 m_errorMonitor->VerifyFound();
10319 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10320 vkDestroyImage(m_device->device(), image, NULL);
10321 vkFreeMemory(m_device->device(), image_mem, NULL);
10322 vkDestroyImageView(m_device->device(), image_view, NULL);
10323 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10324 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10325}
10326
Karl Schultz6addd812016-02-02 17:17:23 -070010327TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010328 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010329 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010330
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10332 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10333 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010334
Tony Barbour1fa09702017-03-16 12:09:08 -060010335 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010336 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010337 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010338 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10339 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010340
10341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10343 ds_pool_ci.pNext = NULL;
10344 ds_pool_ci.maxSets = 1;
10345 ds_pool_ci.poolSizeCount = 1;
10346 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010347
Tobin Ehlis3b780662015-05-28 12:11:26 -060010348 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010349 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010350 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010351 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010352 dsl_binding.binding = 0;
10353 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10354 dsl_binding.descriptorCount = 1;
10355 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10356 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010357
Tony Barboureb254902015-07-15 12:50:33 -060010358 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010359 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10360 ds_layout_ci.pNext = NULL;
10361 ds_layout_ci.bindingCount = 1;
10362 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010363
Tobin Ehlis3b780662015-05-28 12:11:26 -060010364 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010365 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010366 ASSERT_VK_SUCCESS(err);
10367
10368 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010369 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010370 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010371 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010372 alloc_info.descriptorPool = ds_pool;
10373 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010374 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010375 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010376
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010377 VkSamplerCreateInfo sampler_ci = {};
10378 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10379 sampler_ci.pNext = NULL;
10380 sampler_ci.magFilter = VK_FILTER_NEAREST;
10381 sampler_ci.minFilter = VK_FILTER_NEAREST;
10382 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10383 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10384 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10385 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10386 sampler_ci.mipLodBias = 1.0;
10387 sampler_ci.anisotropyEnable = VK_FALSE;
10388 sampler_ci.maxAnisotropy = 1;
10389 sampler_ci.compareEnable = VK_FALSE;
10390 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10391 sampler_ci.minLod = 1.0;
10392 sampler_ci.maxLod = 1.0;
10393 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10394 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10395 VkSampler sampler;
10396 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10397 ASSERT_VK_SUCCESS(err);
10398
10399 VkDescriptorImageInfo info = {};
10400 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010401
10402 VkWriteDescriptorSet descriptor_write;
10403 memset(&descriptor_write, 0, sizeof(descriptor_write));
10404 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010405 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010406 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010407 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010408 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010409 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010410
10411 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10412
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010413 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010414
Chia-I Wuf7458c52015-10-26 21:10:41 +080010415 vkDestroySampler(m_device->device(), sampler, NULL);
10416 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10417 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010418}
10419
Karl Schultz6addd812016-02-02 17:17:23 -070010420TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010421 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010422 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010423
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010425
Tony Barbour1fa09702017-03-16 12:09:08 -060010426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010427 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010428 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010429 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10430 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010431
10432 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010433 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10434 ds_pool_ci.pNext = NULL;
10435 ds_pool_ci.maxSets = 1;
10436 ds_pool_ci.poolSizeCount = 1;
10437 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010438
Tobin Ehlis3b780662015-05-28 12:11:26 -060010439 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010440 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010441 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010442
Tony Barboureb254902015-07-15 12:50:33 -060010443 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010444 dsl_binding.binding = 0;
10445 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10446 dsl_binding.descriptorCount = 1;
10447 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10448 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010449
10450 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010451 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10452 ds_layout_ci.pNext = NULL;
10453 ds_layout_ci.bindingCount = 1;
10454 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010455
Tobin Ehlis3b780662015-05-28 12:11:26 -060010456 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010457 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010458 ASSERT_VK_SUCCESS(err);
10459
10460 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010461 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010462 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010463 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010464 alloc_info.descriptorPool = ds_pool;
10465 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010466 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010467 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010468
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010469 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10470
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010471 // Correctly update descriptor to avoid "NOT_UPDATED" error
10472 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010473 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010474 buff_info.offset = 0;
10475 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010476
10477 VkWriteDescriptorSet descriptor_write;
10478 memset(&descriptor_write, 0, sizeof(descriptor_write));
10479 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010480 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010481 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010482 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010483 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10484 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010485
10486 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10487
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010488 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010489
Chia-I Wuf7458c52015-10-26 21:10:41 +080010490 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10491 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010492}
10493
Karl Schultz6addd812016-02-02 17:17:23 -070010494TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010495 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010496 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010497
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010499
Tony Barbour1fa09702017-03-16 12:09:08 -060010500 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010501 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010502 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010503 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10504 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010505
10506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010507 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10508 ds_pool_ci.pNext = NULL;
10509 ds_pool_ci.maxSets = 1;
10510 ds_pool_ci.poolSizeCount = 1;
10511 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010512
Tobin Ehlis3b780662015-05-28 12:11:26 -060010513 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010514 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010515 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010516
Tony Barboureb254902015-07-15 12:50:33 -060010517 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010518 dsl_binding.binding = 0;
10519 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10520 dsl_binding.descriptorCount = 1;
10521 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10522 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010523
10524 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010525 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10526 ds_layout_ci.pNext = NULL;
10527 ds_layout_ci.bindingCount = 1;
10528 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010529 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010530 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010531 ASSERT_VK_SUCCESS(err);
10532
10533 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010534 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010535 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010536 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010537 alloc_info.descriptorPool = ds_pool;
10538 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010539 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010540 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010541
Tony Barboureb254902015-07-15 12:50:33 -060010542 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010543 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10544 sampler_ci.pNext = NULL;
10545 sampler_ci.magFilter = VK_FILTER_NEAREST;
10546 sampler_ci.minFilter = VK_FILTER_NEAREST;
10547 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10548 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10549 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10550 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10551 sampler_ci.mipLodBias = 1.0;
10552 sampler_ci.anisotropyEnable = VK_FALSE;
10553 sampler_ci.maxAnisotropy = 1;
10554 sampler_ci.compareEnable = VK_FALSE;
10555 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10556 sampler_ci.minLod = 1.0;
10557 sampler_ci.maxLod = 1.0;
10558 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10559 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010560
Tobin Ehlis3b780662015-05-28 12:11:26 -060010561 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010562 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010563 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010564
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010565 VkDescriptorImageInfo info = {};
10566 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010567
10568 VkWriteDescriptorSet descriptor_write;
10569 memset(&descriptor_write, 0, sizeof(descriptor_write));
10570 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010571 descriptor_write.dstSet = descriptorSet;
10572 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010573 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010574 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010575 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010576 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010577
10578 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10579
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010580 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010581
Chia-I Wuf7458c52015-10-26 21:10:41 +080010582 vkDestroySampler(m_device->device(), sampler, NULL);
10583 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10584 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010585}
10586
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010587TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10588 // Create layout w/ empty binding and attempt to update it
10589 VkResult err;
10590
Tony Barbour1fa09702017-03-16 12:09:08 -060010591 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010592
10593 VkDescriptorPoolSize ds_type_count = {};
10594 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10595 ds_type_count.descriptorCount = 1;
10596
10597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10599 ds_pool_ci.pNext = NULL;
10600 ds_pool_ci.maxSets = 1;
10601 ds_pool_ci.poolSizeCount = 1;
10602 ds_pool_ci.pPoolSizes = &ds_type_count;
10603
10604 VkDescriptorPool ds_pool;
10605 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10606 ASSERT_VK_SUCCESS(err);
10607
10608 VkDescriptorSetLayoutBinding dsl_binding = {};
10609 dsl_binding.binding = 0;
10610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10611 dsl_binding.descriptorCount = 0;
10612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10613 dsl_binding.pImmutableSamplers = NULL;
10614
10615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10617 ds_layout_ci.pNext = NULL;
10618 ds_layout_ci.bindingCount = 1;
10619 ds_layout_ci.pBindings = &dsl_binding;
10620 VkDescriptorSetLayout ds_layout;
10621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10622 ASSERT_VK_SUCCESS(err);
10623
10624 VkDescriptorSet descriptor_set;
10625 VkDescriptorSetAllocateInfo alloc_info = {};
10626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10627 alloc_info.descriptorSetCount = 1;
10628 alloc_info.descriptorPool = ds_pool;
10629 alloc_info.pSetLayouts = &ds_layout;
10630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10631 ASSERT_VK_SUCCESS(err);
10632
10633 VkSamplerCreateInfo sampler_ci = {};
10634 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10635 sampler_ci.magFilter = VK_FILTER_NEAREST;
10636 sampler_ci.minFilter = VK_FILTER_NEAREST;
10637 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10638 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10639 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10640 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10641 sampler_ci.mipLodBias = 1.0;
10642 sampler_ci.maxAnisotropy = 1;
10643 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10644 sampler_ci.minLod = 1.0;
10645 sampler_ci.maxLod = 1.0;
10646 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10647
10648 VkSampler sampler;
10649 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10650 ASSERT_VK_SUCCESS(err);
10651
10652 VkDescriptorImageInfo info = {};
10653 info.sampler = sampler;
10654
10655 VkWriteDescriptorSet descriptor_write;
10656 memset(&descriptor_write, 0, sizeof(descriptor_write));
10657 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10658 descriptor_write.dstSet = descriptor_set;
10659 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010660 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010661 // This is the wrong type, but empty binding error will be flagged first
10662 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10663 descriptor_write.pImageInfo = &info;
10664
10665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10666 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10667 m_errorMonitor->VerifyFound();
10668
10669 vkDestroySampler(m_device->device(), sampler, NULL);
10670 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10671 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10672}
10673
Karl Schultz6addd812016-02-02 17:17:23 -070010674TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10675 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10676 // types
10677 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010678
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010680
Tony Barbour1fa09702017-03-16 12:09:08 -060010681 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010682
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010683 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010684 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10685 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010686
10687 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010688 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10689 ds_pool_ci.pNext = NULL;
10690 ds_pool_ci.maxSets = 1;
10691 ds_pool_ci.poolSizeCount = 1;
10692 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010693
Tobin Ehlis3b780662015-05-28 12:11:26 -060010694 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010695 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010696 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010697 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010698 dsl_binding.binding = 0;
10699 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10700 dsl_binding.descriptorCount = 1;
10701 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10702 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010703
Tony Barboureb254902015-07-15 12:50:33 -060010704 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010705 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10706 ds_layout_ci.pNext = NULL;
10707 ds_layout_ci.bindingCount = 1;
10708 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010709
Tobin Ehlis3b780662015-05-28 12:11:26 -060010710 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010711 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010712 ASSERT_VK_SUCCESS(err);
10713
10714 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010715 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010716 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010717 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010718 alloc_info.descriptorPool = ds_pool;
10719 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010720 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010721 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010722
Tony Barboureb254902015-07-15 12:50:33 -060010723 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010724 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10725 sampler_ci.pNext = NULL;
10726 sampler_ci.magFilter = VK_FILTER_NEAREST;
10727 sampler_ci.minFilter = VK_FILTER_NEAREST;
10728 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10729 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10730 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10731 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10732 sampler_ci.mipLodBias = 1.0;
10733 sampler_ci.anisotropyEnable = VK_FALSE;
10734 sampler_ci.maxAnisotropy = 1;
10735 sampler_ci.compareEnable = VK_FALSE;
10736 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10737 sampler_ci.minLod = 1.0;
10738 sampler_ci.maxLod = 1.0;
10739 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10740 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010741 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010742 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010743 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010744
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010745 VkDescriptorImageInfo info = {};
10746 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010747
10748 VkWriteDescriptorSet descriptor_write;
10749 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010750 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010751 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010752 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010753 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010754 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010755 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010756
10757 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10758
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010759 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010760
Chia-I Wuf7458c52015-10-26 21:10:41 +080010761 vkDestroySampler(m_device->device(), sampler, NULL);
10762 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10763 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010764}
10765
Karl Schultz6addd812016-02-02 17:17:23 -070010766TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010767 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010768 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010769
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010771
Tony Barbour1fa09702017-03-16 12:09:08 -060010772 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010773 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10774 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010775 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010776 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10777 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010778
10779 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010780 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10781 ds_pool_ci.pNext = NULL;
10782 ds_pool_ci.maxSets = 1;
10783 ds_pool_ci.poolSizeCount = 1;
10784 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010785
10786 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010787 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010788 ASSERT_VK_SUCCESS(err);
10789
10790 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010791 dsl_binding.binding = 0;
10792 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10793 dsl_binding.descriptorCount = 1;
10794 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10795 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010796
10797 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010798 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10799 ds_layout_ci.pNext = NULL;
10800 ds_layout_ci.bindingCount = 1;
10801 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010802 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010803 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010804 ASSERT_VK_SUCCESS(err);
10805
10806 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010807 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010808 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010809 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010810 alloc_info.descriptorPool = ds_pool;
10811 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010812 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010813 ASSERT_VK_SUCCESS(err);
10814
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010815 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010816
10817 VkDescriptorImageInfo descriptor_info;
10818 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10819 descriptor_info.sampler = sampler;
10820
10821 VkWriteDescriptorSet descriptor_write;
10822 memset(&descriptor_write, 0, sizeof(descriptor_write));
10823 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010824 descriptor_write.dstSet = descriptorSet;
10825 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010826 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010827 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10828 descriptor_write.pImageInfo = &descriptor_info;
10829
10830 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10831
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010832 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010833
Chia-I Wuf7458c52015-10-26 21:10:41 +080010834 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10835 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010836}
10837
Karl Schultz6addd812016-02-02 17:17:23 -070010838TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10839 // Create a single combined Image/Sampler descriptor and send it an invalid
10840 // imageView
10841 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010842
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010844
Tony Barbour1fa09702017-03-16 12:09:08 -060010845 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010846 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010847 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10848 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010849
10850 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010851 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10852 ds_pool_ci.pNext = NULL;
10853 ds_pool_ci.maxSets = 1;
10854 ds_pool_ci.poolSizeCount = 1;
10855 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010856
10857 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010858 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010859 ASSERT_VK_SUCCESS(err);
10860
10861 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010862 dsl_binding.binding = 0;
10863 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10864 dsl_binding.descriptorCount = 1;
10865 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10866 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010867
10868 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010869 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10870 ds_layout_ci.pNext = NULL;
10871 ds_layout_ci.bindingCount = 1;
10872 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010873 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010874 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010875 ASSERT_VK_SUCCESS(err);
10876
10877 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010878 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010879 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010880 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010881 alloc_info.descriptorPool = ds_pool;
10882 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010883 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010884 ASSERT_VK_SUCCESS(err);
10885
10886 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010887 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10888 sampler_ci.pNext = NULL;
10889 sampler_ci.magFilter = VK_FILTER_NEAREST;
10890 sampler_ci.minFilter = VK_FILTER_NEAREST;
10891 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10892 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10893 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10894 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10895 sampler_ci.mipLodBias = 1.0;
10896 sampler_ci.anisotropyEnable = VK_FALSE;
10897 sampler_ci.maxAnisotropy = 1;
10898 sampler_ci.compareEnable = VK_FALSE;
10899 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10900 sampler_ci.minLod = 1.0;
10901 sampler_ci.maxLod = 1.0;
10902 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10903 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010904
10905 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010906 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010907 ASSERT_VK_SUCCESS(err);
10908
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010909 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010910
10911 VkDescriptorImageInfo descriptor_info;
10912 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10913 descriptor_info.sampler = sampler;
10914 descriptor_info.imageView = view;
10915
10916 VkWriteDescriptorSet descriptor_write;
10917 memset(&descriptor_write, 0, sizeof(descriptor_write));
10918 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010919 descriptor_write.dstSet = descriptorSet;
10920 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010921 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010922 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10923 descriptor_write.pImageInfo = &descriptor_info;
10924
10925 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10926
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010927 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010928
Chia-I Wuf7458c52015-10-26 21:10:41 +080010929 vkDestroySampler(m_device->device(), sampler, NULL);
10930 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10931 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010932}
10933
Karl Schultz6addd812016-02-02 17:17:23 -070010934TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10935 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10936 // into the other
10937 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010938
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10940 " binding #1 with type "
10941 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10942 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010943
Tony Barbour1fa09702017-03-16 12:09:08 -060010944 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010945 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010946 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010947 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10948 ds_type_count[0].descriptorCount = 1;
10949 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10950 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010951
10952 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010953 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10954 ds_pool_ci.pNext = NULL;
10955 ds_pool_ci.maxSets = 1;
10956 ds_pool_ci.poolSizeCount = 2;
10957 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010958
10959 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010960 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010961 ASSERT_VK_SUCCESS(err);
10962 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010963 dsl_binding[0].binding = 0;
10964 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10965 dsl_binding[0].descriptorCount = 1;
10966 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10967 dsl_binding[0].pImmutableSamplers = NULL;
10968 dsl_binding[1].binding = 1;
10969 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10970 dsl_binding[1].descriptorCount = 1;
10971 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10972 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010973
10974 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010975 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10976 ds_layout_ci.pNext = NULL;
10977 ds_layout_ci.bindingCount = 2;
10978 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010979
10980 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010981 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010982 ASSERT_VK_SUCCESS(err);
10983
10984 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010985 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010986 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010987 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010988 alloc_info.descriptorPool = ds_pool;
10989 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010990 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010991 ASSERT_VK_SUCCESS(err);
10992
10993 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010994 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10995 sampler_ci.pNext = NULL;
10996 sampler_ci.magFilter = VK_FILTER_NEAREST;
10997 sampler_ci.minFilter = VK_FILTER_NEAREST;
10998 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10999 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11000 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11001 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11002 sampler_ci.mipLodBias = 1.0;
11003 sampler_ci.anisotropyEnable = VK_FALSE;
11004 sampler_ci.maxAnisotropy = 1;
11005 sampler_ci.compareEnable = VK_FALSE;
11006 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11007 sampler_ci.minLod = 1.0;
11008 sampler_ci.maxLod = 1.0;
11009 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11010 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011011
11012 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011013 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011014 ASSERT_VK_SUCCESS(err);
11015
11016 VkDescriptorImageInfo info = {};
11017 info.sampler = sampler;
11018
11019 VkWriteDescriptorSet descriptor_write;
11020 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11021 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011022 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011023 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011024 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011025 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11026 descriptor_write.pImageInfo = &info;
11027 // This write update should succeed
11028 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11029 // Now perform a copy update that fails due to type mismatch
11030 VkCopyDescriptorSet copy_ds_update;
11031 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11032 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11033 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011034 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011035 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011036 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11037 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011038 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11039
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011040 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011041 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060011043 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11044 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11045 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011046 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011047 copy_ds_update.dstSet = descriptorSet;
11048 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011049 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011050 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11051
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011052 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011053
Tobin Ehlis04356f92015-10-27 16:35:27 -060011054 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11056 " binding#1 with offset index of 1 plus "
11057 "update array offset of 0 and update of "
11058 "5 descriptors oversteps total number "
11059 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011060
Tobin Ehlis04356f92015-10-27 16:35:27 -060011061 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11062 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11063 copy_ds_update.srcSet = descriptorSet;
11064 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011065 copy_ds_update.dstSet = descriptorSet;
11066 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011067 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011068 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11069
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011070 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011071
Chia-I Wuf7458c52015-10-26 21:10:41 +080011072 vkDestroySampler(m_device->device(), sampler, NULL);
11073 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11074 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011075}
11076
Karl Schultz6addd812016-02-02 17:17:23 -070011077TEST_F(VkLayerTest, NumSamplesMismatch) {
11078 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11079 // sampleCount
11080 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011081
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011083
Tony Barbour1fa09702017-03-16 12:09:08 -060011084 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011085 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011086 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011087 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011088 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011089
11090 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011091 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11092 ds_pool_ci.pNext = NULL;
11093 ds_pool_ci.maxSets = 1;
11094 ds_pool_ci.poolSizeCount = 1;
11095 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011096
Tobin Ehlis3b780662015-05-28 12:11:26 -060011097 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011098 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011099 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011100
Tony Barboureb254902015-07-15 12:50:33 -060011101 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011102 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011103 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011104 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011105 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11106 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011107
Tony Barboureb254902015-07-15 12:50:33 -060011108 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11109 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11110 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011111 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011112 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011113
Tobin Ehlis3b780662015-05-28 12:11:26 -060011114 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011115 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011116 ASSERT_VK_SUCCESS(err);
11117
11118 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011119 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011120 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011121 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011122 alloc_info.descriptorPool = ds_pool;
11123 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011124 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011125 ASSERT_VK_SUCCESS(err);
11126
Tony Barboureb254902015-07-15 12:50:33 -060011127 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011128 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011129 pipe_ms_state_ci.pNext = NULL;
11130 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11131 pipe_ms_state_ci.sampleShadingEnable = 0;
11132 pipe_ms_state_ci.minSampleShading = 1.0;
11133 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011134
Tony Barboureb254902015-07-15 12:50:33 -060011135 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011136 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11137 pipeline_layout_ci.pNext = NULL;
11138 pipeline_layout_ci.setLayoutCount = 1;
11139 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011140
11141 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011142 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011143 ASSERT_VK_SUCCESS(err);
11144
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011145 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011146 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011147 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011148 VkPipelineObj pipe(m_device);
11149 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011150 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011151 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011152 pipe.SetMSAA(&pipe_ms_state_ci);
11153 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011154
Tony Barbour552f6c02016-12-21 14:34:07 -070011155 m_commandBuffer->BeginCommandBuffer();
11156 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011157 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011158
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011159 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11160 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11161 VkRect2D scissor = {{0, 0}, {16, 16}};
11162 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11163
Mark Young29927482016-05-04 14:38:51 -060011164 // Render triangle (the error should trigger on the attempt to draw).
11165 Draw(3, 1, 0, 0);
11166
11167 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011168 m_commandBuffer->EndRenderPass();
11169 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011170
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011171 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011172
Chia-I Wuf7458c52015-10-26 21:10:41 +080011173 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11174 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11175 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011176}
Mark Young29927482016-05-04 14:38:51 -060011177
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011178TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011179 TEST_DESCRIPTION(
11180 "Hit RenderPass incompatible cases. "
11181 "Initial case is drawing with an active renderpass that's "
11182 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011183 VkResult err;
11184
Tony Barbour1fa09702017-03-16 12:09:08 -060011185 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011186 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11187
11188 VkDescriptorSetLayoutBinding dsl_binding = {};
11189 dsl_binding.binding = 0;
11190 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11191 dsl_binding.descriptorCount = 1;
11192 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11193 dsl_binding.pImmutableSamplers = NULL;
11194
11195 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11196 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11197 ds_layout_ci.pNext = NULL;
11198 ds_layout_ci.bindingCount = 1;
11199 ds_layout_ci.pBindings = &dsl_binding;
11200
11201 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011202 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011203 ASSERT_VK_SUCCESS(err);
11204
11205 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11206 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11207 pipeline_layout_ci.pNext = NULL;
11208 pipeline_layout_ci.setLayoutCount = 1;
11209 pipeline_layout_ci.pSetLayouts = &ds_layout;
11210
11211 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011212 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011213 ASSERT_VK_SUCCESS(err);
11214
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011215 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011216 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011217 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011218 // Create a renderpass that will be incompatible with default renderpass
11219 VkAttachmentReference attach = {};
11220 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11221 VkAttachmentReference color_att = {};
11222 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11223 VkSubpassDescription subpass = {};
11224 subpass.inputAttachmentCount = 1;
11225 subpass.pInputAttachments = &attach;
11226 subpass.colorAttachmentCount = 1;
11227 subpass.pColorAttachments = &color_att;
11228 VkRenderPassCreateInfo rpci = {};
11229 rpci.subpassCount = 1;
11230 rpci.pSubpasses = &subpass;
11231 rpci.attachmentCount = 1;
11232 VkAttachmentDescription attach_desc = {};
11233 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011234 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11235 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011236 rpci.pAttachments = &attach_desc;
11237 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11238 VkRenderPass rp;
11239 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11240 VkPipelineObj pipe(m_device);
11241 pipe.AddShader(&vs);
11242 pipe.AddShader(&fs);
11243 pipe.AddColorAttachment();
11244 VkViewport view_port = {};
11245 m_viewports.push_back(view_port);
11246 pipe.SetViewport(m_viewports);
11247 VkRect2D rect = {};
11248 m_scissors.push_back(rect);
11249 pipe.SetScissor(m_scissors);
11250 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11251
11252 VkCommandBufferInheritanceInfo cbii = {};
11253 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11254 cbii.renderPass = rp;
11255 cbii.subpass = 0;
11256 VkCommandBufferBeginInfo cbbi = {};
11257 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11258 cbbi.pInheritanceInfo = &cbii;
11259 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11260 VkRenderPassBeginInfo rpbi = {};
11261 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11262 rpbi.framebuffer = m_framebuffer;
11263 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011264 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11265 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011266
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011268 // Render triangle (the error should trigger on the attempt to draw).
11269 Draw(3, 1, 0, 0);
11270
11271 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011272 m_commandBuffer->EndRenderPass();
11273 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011274
11275 m_errorMonitor->VerifyFound();
11276
11277 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11278 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11279 vkDestroyRenderPass(m_device->device(), rp, NULL);
11280}
11281
Mark Youngc89c6312016-03-31 16:03:20 -060011282TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11283 // Create Pipeline where the number of blend attachments doesn't match the
11284 // number of color attachments. In this case, we don't add any color
11285 // blend attachments even though we have a color attachment.
11286 VkResult err;
11287
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011289
Tony Barbour1fa09702017-03-16 12:09:08 -060011290 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011291 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11292 VkDescriptorPoolSize ds_type_count = {};
11293 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11294 ds_type_count.descriptorCount = 1;
11295
11296 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11297 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11298 ds_pool_ci.pNext = NULL;
11299 ds_pool_ci.maxSets = 1;
11300 ds_pool_ci.poolSizeCount = 1;
11301 ds_pool_ci.pPoolSizes = &ds_type_count;
11302
11303 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011304 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011305 ASSERT_VK_SUCCESS(err);
11306
11307 VkDescriptorSetLayoutBinding dsl_binding = {};
11308 dsl_binding.binding = 0;
11309 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11310 dsl_binding.descriptorCount = 1;
11311 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11312 dsl_binding.pImmutableSamplers = NULL;
11313
11314 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11315 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11316 ds_layout_ci.pNext = NULL;
11317 ds_layout_ci.bindingCount = 1;
11318 ds_layout_ci.pBindings = &dsl_binding;
11319
11320 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011321 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011322 ASSERT_VK_SUCCESS(err);
11323
11324 VkDescriptorSet descriptorSet;
11325 VkDescriptorSetAllocateInfo alloc_info = {};
11326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11327 alloc_info.descriptorSetCount = 1;
11328 alloc_info.descriptorPool = ds_pool;
11329 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011330 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011331 ASSERT_VK_SUCCESS(err);
11332
11333 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011334 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011335 pipe_ms_state_ci.pNext = NULL;
11336 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11337 pipe_ms_state_ci.sampleShadingEnable = 0;
11338 pipe_ms_state_ci.minSampleShading = 1.0;
11339 pipe_ms_state_ci.pSampleMask = NULL;
11340
11341 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11342 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11343 pipeline_layout_ci.pNext = NULL;
11344 pipeline_layout_ci.setLayoutCount = 1;
11345 pipeline_layout_ci.pSetLayouts = &ds_layout;
11346
11347 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011348 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011349 ASSERT_VK_SUCCESS(err);
11350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011351 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011352 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011353 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011354 VkPipelineObj pipe(m_device);
11355 pipe.AddShader(&vs);
11356 pipe.AddShader(&fs);
11357 pipe.SetMSAA(&pipe_ms_state_ci);
11358 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011359 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011360
11361 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11362 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11363 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11364}
Mark Young29927482016-05-04 14:38:51 -060011365
Mark Muellerd4914412016-06-13 17:52:06 -060011366TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011367 TEST_DESCRIPTION(
11368 "Points to a wrong colorAttachment index in a VkClearAttachment "
11369 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011370 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011372
11373 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11374 m_errorMonitor->VerifyFound();
11375}
11376
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011377TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011378 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11379 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011380
Tony Barbour1fa09702017-03-16 12:09:08 -060011381 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011383
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011384 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011385 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11386 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011387
11388 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011389 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11390 ds_pool_ci.pNext = NULL;
11391 ds_pool_ci.maxSets = 1;
11392 ds_pool_ci.poolSizeCount = 1;
11393 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011394
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011395 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011396 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011397 ASSERT_VK_SUCCESS(err);
11398
Tony Barboureb254902015-07-15 12:50:33 -060011399 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011400 dsl_binding.binding = 0;
11401 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11402 dsl_binding.descriptorCount = 1;
11403 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11404 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011405
Tony Barboureb254902015-07-15 12:50:33 -060011406 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011407 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11408 ds_layout_ci.pNext = NULL;
11409 ds_layout_ci.bindingCount = 1;
11410 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011411
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011412 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011413 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011414 ASSERT_VK_SUCCESS(err);
11415
11416 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011417 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011418 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011419 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011420 alloc_info.descriptorPool = ds_pool;
11421 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011422 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011423 ASSERT_VK_SUCCESS(err);
11424
Tony Barboureb254902015-07-15 12:50:33 -060011425 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011426 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011427 pipe_ms_state_ci.pNext = NULL;
11428 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11429 pipe_ms_state_ci.sampleShadingEnable = 0;
11430 pipe_ms_state_ci.minSampleShading = 1.0;
11431 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011432
Tony Barboureb254902015-07-15 12:50:33 -060011433 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011434 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11435 pipeline_layout_ci.pNext = NULL;
11436 pipeline_layout_ci.setLayoutCount = 1;
11437 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011438
11439 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011441 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011442
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011443 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011444 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011445 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011446 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011447
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011448 VkPipelineObj pipe(m_device);
11449 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011450 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011451 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011452 pipe.SetMSAA(&pipe_ms_state_ci);
11453 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011454
Tony Barbour552f6c02016-12-21 14:34:07 -070011455 m_commandBuffer->BeginCommandBuffer();
11456 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011457
Karl Schultz6addd812016-02-02 17:17:23 -070011458 // Main thing we care about for this test is that the VkImage obj we're
11459 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011460 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011461 VkClearAttachment color_attachment;
11462 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11463 color_attachment.clearValue.color.float32[0] = 1.0;
11464 color_attachment.clearValue.color.float32[1] = 1.0;
11465 color_attachment.clearValue.color.float32[2] = 1.0;
11466 color_attachment.clearValue.color.float32[3] = 1.0;
11467 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011468 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011469
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011470 // Call for full-sized FB Color attachment prior to issuing a Draw
11471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011472 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011473 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011474 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011475
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011476 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11477 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11479 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11480 m_errorMonitor->VerifyFound();
11481
11482 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11483 clear_rect.layerCount = 2;
11484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11485 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011486 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011487
Chia-I Wuf7458c52015-10-26 21:10:41 +080011488 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11489 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11490 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011491}
11492
Karl Schultz6addd812016-02-02 17:17:23 -070011493TEST_F(VkLayerTest, VtxBufferBadIndex) {
11494 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011495
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11497 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011498
Tony Barbour1fa09702017-03-16 12:09:08 -060011499 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011500 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011501 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011502
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011503 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011504 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11505 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011506
11507 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011508 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11509 ds_pool_ci.pNext = NULL;
11510 ds_pool_ci.maxSets = 1;
11511 ds_pool_ci.poolSizeCount = 1;
11512 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011513
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011514 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011515 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011516 ASSERT_VK_SUCCESS(err);
11517
Tony Barboureb254902015-07-15 12:50:33 -060011518 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011519 dsl_binding.binding = 0;
11520 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11521 dsl_binding.descriptorCount = 1;
11522 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11523 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011524
Tony Barboureb254902015-07-15 12:50:33 -060011525 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011526 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11527 ds_layout_ci.pNext = NULL;
11528 ds_layout_ci.bindingCount = 1;
11529 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011530
Tobin Ehlis502480b2015-06-24 15:53:07 -060011531 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011532 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011533 ASSERT_VK_SUCCESS(err);
11534
11535 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011536 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011537 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011538 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011539 alloc_info.descriptorPool = ds_pool;
11540 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011541 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011542 ASSERT_VK_SUCCESS(err);
11543
Tony Barboureb254902015-07-15 12:50:33 -060011544 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011545 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011546 pipe_ms_state_ci.pNext = NULL;
11547 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11548 pipe_ms_state_ci.sampleShadingEnable = 0;
11549 pipe_ms_state_ci.minSampleShading = 1.0;
11550 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011551
Tony Barboureb254902015-07-15 12:50:33 -060011552 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011553 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11554 pipeline_layout_ci.pNext = NULL;
11555 pipeline_layout_ci.setLayoutCount = 1;
11556 pipeline_layout_ci.pSetLayouts = &ds_layout;
11557 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011558
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011559 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011560 ASSERT_VK_SUCCESS(err);
11561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011562 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011563 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011564 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011565 VkPipelineObj pipe(m_device);
11566 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011567 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011568 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011569 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011570 pipe.SetViewport(m_viewports);
11571 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011572 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011573
Tony Barbour552f6c02016-12-21 14:34:07 -070011574 m_commandBuffer->BeginCommandBuffer();
11575 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011576 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011577 // Don't care about actual data, just need to get to draw to flag error
11578 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011579 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011580 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011581 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011582
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011583 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011584
Chia-I Wuf7458c52015-10-26 21:10:41 +080011585 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11586 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11587 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011588}
Mark Muellerdfe37552016-07-07 14:47:42 -060011589
Mark Mueller2ee294f2016-08-04 12:59:48 -060011590TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011591 TEST_DESCRIPTION(
11592 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11593 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011594 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011595
Mark Mueller880fce52016-08-17 15:23:23 -060011596 // The following test fails with recent NVidia drivers.
11597 // By the time core_validation is reached, the NVidia
11598 // driver has sanitized the invalid condition and core_validation
11599 // is not introduced to the failure condition. This is not the case
11600 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011601 // uint32_t count = static_cast<uint32_t>(~0);
11602 // VkPhysicalDevice physical_device;
11603 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11604 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011605
Mark Mueller2ee294f2016-08-04 12:59:48 -060011606 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011607 VkDeviceQueueCreateInfo queue_create_info = {};
11608 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11609 queue_create_info.queueCount = 1;
11610 queue_create_info.pQueuePriorities = &queue_priority;
11611 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11612
11613 VkPhysicalDeviceFeatures features = m_device->phy().features();
11614 VkDevice testDevice;
11615 VkDeviceCreateInfo device_create_info = {};
11616 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11617 device_create_info.queueCreateInfoCount = 1;
11618 device_create_info.pQueueCreateInfos = &queue_create_info;
11619 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011620
11621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11622 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011623 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11624 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11625 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011626 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11627 m_errorMonitor->VerifyFound();
11628
11629 queue_create_info.queueFamilyIndex = 1;
11630
11631 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11632 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11633 for (unsigned i = 0; i < feature_count; i++) {
11634 if (VK_FALSE == feature_array[i]) {
11635 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011636 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11638 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011639 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11640 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11641 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11643 "You requested features that are unavailable on this device. You should first "
11644 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011645 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11646 m_errorMonitor->VerifyFound();
11647 break;
11648 }
11649 }
11650}
11651
Tobin Ehlis16edf082016-11-21 12:33:49 -070011652TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11653 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11654
Tony Barbour1fa09702017-03-16 12:09:08 -060011655 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011656
11657 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11658 std::vector<VkDeviceQueueCreateInfo> queue_info;
11659 queue_info.reserve(queue_props.size());
11660 std::vector<std::vector<float>> queue_priorities;
11661 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11662 VkDeviceQueueCreateInfo qi{};
11663 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11664 qi.queueFamilyIndex = i;
11665 qi.queueCount = queue_props[i].queueCount;
11666 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11667 qi.pQueuePriorities = queue_priorities[i].data();
11668 queue_info.push_back(qi);
11669 }
11670
11671 std::vector<const char *> device_extension_names;
11672
11673 VkDevice local_device;
11674 VkDeviceCreateInfo device_create_info = {};
11675 auto features = m_device->phy().features();
11676 // Intentionally disable pipeline stats
11677 features.pipelineStatisticsQuery = VK_FALSE;
11678 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11679 device_create_info.pNext = NULL;
11680 device_create_info.queueCreateInfoCount = queue_info.size();
11681 device_create_info.pQueueCreateInfos = queue_info.data();
11682 device_create_info.enabledLayerCount = 0;
11683 device_create_info.ppEnabledLayerNames = NULL;
11684 device_create_info.pEnabledFeatures = &features;
11685 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11686 ASSERT_VK_SUCCESS(err);
11687
11688 VkQueryPoolCreateInfo qpci{};
11689 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11690 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11691 qpci.queryCount = 1;
11692 VkQueryPool query_pool;
11693
11694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11695 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11696 m_errorMonitor->VerifyFound();
11697
11698 vkDestroyDevice(local_device, nullptr);
11699}
11700
Mark Mueller2ee294f2016-08-04 12:59:48 -060011701TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011702 TEST_DESCRIPTION(
11703 "Use an invalid queue index in a vkCmdWaitEvents call."
11704 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011706 const char *invalid_queue_index =
11707 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11708 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11709 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011710
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011711 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011712
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011714
Tony Barbour1fa09702017-03-16 12:09:08 -060011715 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011716
11717 VkEvent event;
11718 VkEventCreateInfo event_create_info{};
11719 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11720 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11721
Mark Mueller2ee294f2016-08-04 12:59:48 -060011722 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011723 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011724
Tony Barbour552f6c02016-12-21 14:34:07 -070011725 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011726
11727 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060011728 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011729 ASSERT_TRUE(image.initialized());
11730 VkImageMemoryBarrier img_barrier = {};
11731 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11732 img_barrier.pNext = NULL;
11733 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11734 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11735 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11736 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11737 img_barrier.image = image.handle();
11738 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011739
11740 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11741 // that layer validation catches the case when it is not.
11742 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011743 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11744 img_barrier.subresourceRange.baseArrayLayer = 0;
11745 img_barrier.subresourceRange.baseMipLevel = 0;
11746 img_barrier.subresourceRange.layerCount = 1;
11747 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011748 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11749 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011750 m_errorMonitor->VerifyFound();
11751
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011753
11754 VkQueryPool query_pool;
11755 VkQueryPoolCreateInfo query_pool_create_info = {};
11756 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11757 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11758 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011759 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011760
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011761 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011762 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11763
11764 vkEndCommandBuffer(m_commandBuffer->handle());
11765 m_errorMonitor->VerifyFound();
11766
11767 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11768 vkDestroyEvent(m_device->device(), event, nullptr);
11769}
11770
Mark Muellerdfe37552016-07-07 14:47:42 -060011771TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011772 TEST_DESCRIPTION(
11773 "Submit a command buffer using deleted vertex buffer, "
11774 "delete a buffer twice, use an invalid offset for each "
11775 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011776
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011777 const char *deleted_buffer_in_command_buffer =
11778 "Cannot submit cmd buffer "
11779 "using deleted buffer ";
11780 const char *invalid_offset_message =
11781 "vkBindBufferMemory(): "
11782 "memoryOffset is 0x";
11783 const char *invalid_storage_buffer_offset_message =
11784 "vkBindBufferMemory(): "
11785 "storage memoryOffset "
11786 "is 0x";
11787 const char *invalid_texel_buffer_offset_message =
11788 "vkBindBufferMemory(): "
11789 "texel memoryOffset "
11790 "is 0x";
11791 const char *invalid_uniform_buffer_offset_message =
11792 "vkBindBufferMemory(): "
11793 "uniform memoryOffset "
11794 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011795
Tony Barbour1fa09702017-03-16 12:09:08 -060011796 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011797 ASSERT_NO_FATAL_FAILURE(InitViewport());
11798 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11799
11800 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011801 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011802 pipe_ms_state_ci.pNext = NULL;
11803 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11804 pipe_ms_state_ci.sampleShadingEnable = 0;
11805 pipe_ms_state_ci.minSampleShading = 1.0;
11806 pipe_ms_state_ci.pSampleMask = nullptr;
11807
11808 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11809 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11810 VkPipelineLayout pipeline_layout;
11811
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011812 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011813 ASSERT_VK_SUCCESS(err);
11814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011815 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11816 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011817 VkPipelineObj pipe(m_device);
11818 pipe.AddShader(&vs);
11819 pipe.AddShader(&fs);
11820 pipe.AddColorAttachment();
11821 pipe.SetMSAA(&pipe_ms_state_ci);
11822 pipe.SetViewport(m_viewports);
11823 pipe.SetScissor(m_scissors);
11824 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11825
Tony Barbour552f6c02016-12-21 14:34:07 -070011826 m_commandBuffer->BeginCommandBuffer();
11827 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011828 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011829
11830 {
11831 // Create and bind a vertex buffer in a reduced scope, which will cause
11832 // it to be deleted upon leaving this scope
11833 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011834 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011835 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11836 draw_verticies.AddVertexInputToPipe(pipe);
11837 }
11838
11839 Draw(1, 0, 0, 0);
11840
Tony Barbour552f6c02016-12-21 14:34:07 -070011841 m_commandBuffer->EndRenderPass();
11842 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011843
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011845 QueueCommandBuffer(false);
11846 m_errorMonitor->VerifyFound();
11847
11848 {
11849 // Create and bind a vertex buffer in a reduced scope, and delete it
11850 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011851 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011853 buffer_test.TestDoubleDestroy();
11854 }
11855 m_errorMonitor->VerifyFound();
11856
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011857 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011858 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011859 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011861 m_errorMonitor->SetUnexpectedError(
11862 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11863 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011864 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11865 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011866 m_errorMonitor->VerifyFound();
11867 }
11868
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011869 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11870 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011871 // Create and bind a memory buffer with an invalid offset again,
11872 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011874 m_errorMonitor->SetUnexpectedError(
11875 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11876 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011877 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11878 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011879 m_errorMonitor->VerifyFound();
11880 }
11881
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011882 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011883 // Create and bind a memory buffer with an invalid offset again, but
11884 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011886 m_errorMonitor->SetUnexpectedError(
11887 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11888 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011889 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11890 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011891 m_errorMonitor->VerifyFound();
11892 }
11893
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011894 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011895 // Create and bind a memory buffer with an invalid offset again, but
11896 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011898 m_errorMonitor->SetUnexpectedError(
11899 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11900 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011901 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11902 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011903 m_errorMonitor->VerifyFound();
11904 }
11905
11906 {
11907 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011909 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11910 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011911 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11912 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011913 m_errorMonitor->VerifyFound();
11914 }
11915
11916 {
11917 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011919 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11920 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011921 }
11922 m_errorMonitor->VerifyFound();
11923
11924 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11925}
11926
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011927// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11928TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011929 TEST_DESCRIPTION(
11930 "Hit all possible validation checks associated with the "
11931 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11932 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011933 // 3 in ValidateCmdBufImageLayouts
11934 // * -1 Attempt to submit cmd buf w/ deleted image
11935 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11936 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011937
Tony Barbour1fa09702017-03-16 12:09:08 -060011938 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011939 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011940 if (!depth_format) {
11941 printf(" No Depth + Stencil format found. Skipped.\n");
11942 return;
11943 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011944 // Create src & dst images to use for copy operations
11945 VkImage src_image;
11946 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011947 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011948
11949 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11950 const int32_t tex_width = 32;
11951 const int32_t tex_height = 32;
11952
11953 VkImageCreateInfo image_create_info = {};
11954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11955 image_create_info.pNext = NULL;
11956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11957 image_create_info.format = tex_format;
11958 image_create_info.extent.width = tex_width;
11959 image_create_info.extent.height = tex_height;
11960 image_create_info.extent.depth = 1;
11961 image_create_info.mipLevels = 1;
11962 image_create_info.arrayLayers = 4;
11963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11964 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11965 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011966 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011967 image_create_info.flags = 0;
11968
11969 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11970 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011971 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011972 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11973 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011974 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11975 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11976 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11977 ASSERT_VK_SUCCESS(err);
11978
11979 // Allocate memory
11980 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011981 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011982 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011983 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11984 mem_alloc.pNext = NULL;
11985 mem_alloc.allocationSize = 0;
11986 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011987
11988 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011989 mem_alloc.allocationSize = img_mem_reqs.size;
11990 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011991 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011992 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011993 ASSERT_VK_SUCCESS(err);
11994
11995 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011996 mem_alloc.allocationSize = img_mem_reqs.size;
11997 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011998 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011999 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012000 ASSERT_VK_SUCCESS(err);
12001
12002 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012003 mem_alloc.allocationSize = img_mem_reqs.size;
12004 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012005 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012006 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012007 ASSERT_VK_SUCCESS(err);
12008
12009 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12010 ASSERT_VK_SUCCESS(err);
12011 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12012 ASSERT_VK_SUCCESS(err);
12013 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12014 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012015
Tony Barbour552f6c02016-12-21 14:34:07 -070012016 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012017 VkImageCopy copy_region;
12018 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12019 copy_region.srcSubresource.mipLevel = 0;
12020 copy_region.srcSubresource.baseArrayLayer = 0;
12021 copy_region.srcSubresource.layerCount = 1;
12022 copy_region.srcOffset.x = 0;
12023 copy_region.srcOffset.y = 0;
12024 copy_region.srcOffset.z = 0;
12025 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12026 copy_region.dstSubresource.mipLevel = 0;
12027 copy_region.dstSubresource.baseArrayLayer = 0;
12028 copy_region.dstSubresource.layerCount = 1;
12029 copy_region.dstOffset.x = 0;
12030 copy_region.dstOffset.y = 0;
12031 copy_region.dstOffset.z = 0;
12032 copy_region.extent.width = 1;
12033 copy_region.extent.height = 1;
12034 copy_region.extent.depth = 1;
12035
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12037 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12038 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012039
Cort530cf382016-12-08 09:59:47 -080012040 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012041 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012042 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12043 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012044 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12045 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012046 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012047 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012049 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12050 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012051 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080012052 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012053 m_errorMonitor->VerifyFound();
12054 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012056 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012057 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012058 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012059 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012060 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012061 m_errorMonitor->VerifyFound();
12062 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12064 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12065 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012066 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012067 m_errorMonitor->VerifyFound();
12068 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012070 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012071 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012072 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012073 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012074 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012075 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012077 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12078 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012079 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012080 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012081 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012082 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012083
Cort3b021012016-12-07 12:00:57 -080012084 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12085 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12086 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12087 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12088 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12089 transfer_dst_image_barrier[0].srcAccessMask = 0;
12090 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12091 transfer_dst_image_barrier[0].image = dst_image;
12092 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12093 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12094 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12095 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12096 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12097 transfer_dst_image_barrier[0].image = depth_image;
12098 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12099 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12100 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12101
12102 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012103 VkClearColorValue color_clear_value = {};
12104 VkImageSubresourceRange clear_range;
12105 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12106 clear_range.baseMipLevel = 0;
12107 clear_range.baseArrayLayer = 0;
12108 clear_range.layerCount = 1;
12109 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012110
Cort3b021012016-12-07 12:00:57 -080012111 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12112 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012115 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012116 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012117 // Fail due to provided layout not matching actual current layout for color clear.
12118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012119 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012120 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012121
Cort530cf382016-12-08 09:59:47 -080012122 VkClearDepthStencilValue depth_clear_value = {};
12123 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012124
12125 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12126 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012129 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012130 m_errorMonitor->VerifyFound();
12131 // Fail due to provided layout not matching actual current layout for depth clear.
12132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012133 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012134 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012135
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012136 // Now cause error due to bad image layout transition in PipelineBarrier
12137 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012138 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012139 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012140 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012141 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012142 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12143 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012144 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012146 "you cannot transition the layout of aspect 1 from "
12147 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12148 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012150 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12151 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012152 m_errorMonitor->VerifyFound();
12153
12154 // Finally some layout errors at RenderPass create time
12155 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12156 VkAttachmentReference attach = {};
12157 // perf warning for GENERAL layout w/ non-DS input attachment
12158 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12159 VkSubpassDescription subpass = {};
12160 subpass.inputAttachmentCount = 1;
12161 subpass.pInputAttachments = &attach;
12162 VkRenderPassCreateInfo rpci = {};
12163 rpci.subpassCount = 1;
12164 rpci.pSubpasses = &subpass;
12165 rpci.attachmentCount = 1;
12166 VkAttachmentDescription attach_desc = {};
12167 attach_desc.format = VK_FORMAT_UNDEFINED;
12168 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012169 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012170 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12172 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012173 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12174 m_errorMonitor->VerifyFound();
12175 // error w/ non-general layout
12176 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12177
12178 m_errorMonitor->SetDesiredFailureMsg(
12179 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12180 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12181 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12182 m_errorMonitor->VerifyFound();
12183 subpass.inputAttachmentCount = 0;
12184 subpass.colorAttachmentCount = 1;
12185 subpass.pColorAttachments = &attach;
12186 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12187 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12189 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012190 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12191 m_errorMonitor->VerifyFound();
12192 // error w/ non-color opt or GENERAL layout for color attachment
12193 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12194 m_errorMonitor->SetDesiredFailureMsg(
12195 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12196 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12197 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12198 m_errorMonitor->VerifyFound();
12199 subpass.colorAttachmentCount = 0;
12200 subpass.pDepthStencilAttachment = &attach;
12201 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12202 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12204 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012205 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12206 m_errorMonitor->VerifyFound();
12207 // error w/ non-ds opt or GENERAL layout for color attachment
12208 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12210 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12211 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012212 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12213 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012214 // For this error we need a valid renderpass so create default one
12215 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12216 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012217 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012218 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12219 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12220 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12221 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12222 // Can't do a CLEAR load on READ_ONLY initialLayout
12223 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12224 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12225 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012227 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012228 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12229 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012230
Cort3b021012016-12-07 12:00:57 -080012231 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12232 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12233 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012234 vkDestroyImage(m_device->device(), src_image, NULL);
12235 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012236 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012237}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012238
Tobin Ehlise0936662016-10-11 08:10:51 -060012239TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12240 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12241 VkResult err;
12242
Tony Barbour1fa09702017-03-16 12:09:08 -060012243 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012244
12245 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12246 VkImageTiling tiling;
12247 VkFormatProperties format_properties;
12248 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12249 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12250 tiling = VK_IMAGE_TILING_LINEAR;
12251 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12252 tiling = VK_IMAGE_TILING_OPTIMAL;
12253 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012254 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012255 return;
12256 }
12257
12258 VkDescriptorPoolSize ds_type = {};
12259 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12260 ds_type.descriptorCount = 1;
12261
12262 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12263 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12264 ds_pool_ci.maxSets = 1;
12265 ds_pool_ci.poolSizeCount = 1;
12266 ds_pool_ci.pPoolSizes = &ds_type;
12267 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12268
12269 VkDescriptorPool ds_pool;
12270 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12271 ASSERT_VK_SUCCESS(err);
12272
12273 VkDescriptorSetLayoutBinding dsl_binding = {};
12274 dsl_binding.binding = 0;
12275 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12276 dsl_binding.descriptorCount = 1;
12277 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12278 dsl_binding.pImmutableSamplers = NULL;
12279
12280 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12281 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12282 ds_layout_ci.pNext = NULL;
12283 ds_layout_ci.bindingCount = 1;
12284 ds_layout_ci.pBindings = &dsl_binding;
12285
12286 VkDescriptorSetLayout ds_layout;
12287 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12288 ASSERT_VK_SUCCESS(err);
12289
12290 VkDescriptorSetAllocateInfo alloc_info = {};
12291 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12292 alloc_info.descriptorSetCount = 1;
12293 alloc_info.descriptorPool = ds_pool;
12294 alloc_info.pSetLayouts = &ds_layout;
12295 VkDescriptorSet descriptor_set;
12296 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12297 ASSERT_VK_SUCCESS(err);
12298
12299 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12300 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12301 pipeline_layout_ci.pNext = NULL;
12302 pipeline_layout_ci.setLayoutCount = 1;
12303 pipeline_layout_ci.pSetLayouts = &ds_layout;
12304 VkPipelineLayout pipeline_layout;
12305 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12306 ASSERT_VK_SUCCESS(err);
12307
12308 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012309 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012310 ASSERT_TRUE(image.initialized());
12311 VkImageView view = image.targetView(tex_format);
12312
12313 VkDescriptorImageInfo image_info = {};
12314 image_info.imageView = view;
12315 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12316
12317 VkWriteDescriptorSet descriptor_write = {};
12318 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12319 descriptor_write.dstSet = descriptor_set;
12320 descriptor_write.dstBinding = 0;
12321 descriptor_write.descriptorCount = 1;
12322 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12323 descriptor_write.pImageInfo = &image_info;
12324
12325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12326 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12327 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12328 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12329 m_errorMonitor->VerifyFound();
12330
12331 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12332 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12333 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12334 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12335}
12336
Mark Mueller93b938f2016-08-18 10:27:40 -060012337TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012338 TEST_DESCRIPTION(
12339 "Use vkCmdExecuteCommands with invalid state "
12340 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012341
Tony Barbour1fa09702017-03-16 12:09:08 -060012342 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012343 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12344
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012345 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012346 const char *simultaneous_use_message2 =
12347 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12348 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012349
12350 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012351 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012352 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012353 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12354 command_buffer_allocate_info.commandBufferCount = 1;
12355
12356 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012357 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012358 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12359 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012360 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012361 command_buffer_inheritance_info.renderPass = m_renderPass;
12362 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012363
Mark Mueller93b938f2016-08-18 10:27:40 -060012364 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012365 command_buffer_begin_info.flags =
12366 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012367 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12368
12369 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12370 vkEndCommandBuffer(secondary_command_buffer);
12371
Mark Mueller93b938f2016-08-18 10:27:40 -060012372 VkSubmitInfo submit_info = {};
12373 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12374 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012375 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012376
Mark Mueller4042b652016-09-05 22:52:21 -060012377 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012378 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12380 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012381 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012382 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012383 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12384 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012385
Dave Houltonfbf52152017-01-06 12:55:29 -070012386 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012387 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012388 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012389
Mark Mueller4042b652016-09-05 22:52:21 -060012390 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012391 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012392 m_errorMonitor->SetUnexpectedError(
12393 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12394 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012395 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012396 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012397
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12399 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012400 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012401 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12402 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012403
12404 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012405
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012406 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012407}
12408
Tony Barbour626994c2017-02-08 15:29:37 -070012409TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12410 TEST_DESCRIPTION(
12411 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12412 "errors");
12413 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12414 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
Tony Barbour1fa09702017-03-16 12:09:08 -060012415 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012416
12417 VkCommandBuffer cmd_bufs[2];
12418 VkCommandBufferAllocateInfo alloc_info;
12419 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12420 alloc_info.pNext = NULL;
12421 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012422 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012423 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12424 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12425
12426 VkCommandBufferBeginInfo cb_binfo;
12427 cb_binfo.pNext = NULL;
12428 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12429 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12430 cb_binfo.flags = 0;
12431 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12432 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12433 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12434 vkEndCommandBuffer(cmd_bufs[0]);
12435 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12436
12437 VkSubmitInfo submit_info = {};
12438 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12439 submit_info.commandBufferCount = 2;
12440 submit_info.pCommandBuffers = duplicates;
12441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12442 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12443 m_errorMonitor->VerifyFound();
12444 vkQueueWaitIdle(m_device->m_queue);
12445
12446 // Set one time use and now look for one time submit
12447 duplicates[0] = duplicates[1] = cmd_bufs[1];
12448 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12449 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12450 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12451 vkEndCommandBuffer(cmd_bufs[1]);
12452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12453 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12454 m_errorMonitor->VerifyFound();
12455 vkQueueWaitIdle(m_device->m_queue);
12456}
12457
Tobin Ehlisb093da82017-01-19 12:05:27 -070012458TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012459 TEST_DESCRIPTION(
12460 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12461 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012462
Tony Barbour1fa09702017-03-16 12:09:08 -060012463 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12465
12466 std::vector<const char *> device_extension_names;
12467 auto features = m_device->phy().features();
12468 // Make sure gs & ts are disabled
12469 features.geometryShader = false;
12470 features.tessellationShader = false;
12471 // The sacrificial device object
12472 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12473
12474 VkCommandPoolCreateInfo pool_create_info{};
12475 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12476 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12477
12478 VkCommandPool command_pool;
12479 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12480
12481 VkCommandBufferAllocateInfo cmd = {};
12482 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12483 cmd.pNext = NULL;
12484 cmd.commandPool = command_pool;
12485 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12486 cmd.commandBufferCount = 1;
12487
12488 VkCommandBuffer cmd_buffer;
12489 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12490 ASSERT_VK_SUCCESS(err);
12491
12492 VkEvent event;
12493 VkEventCreateInfo evci = {};
12494 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12495 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12496 ASSERT_VK_SUCCESS(result);
12497
12498 VkCommandBufferBeginInfo cbbi = {};
12499 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12500 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12502 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12503 m_errorMonitor->VerifyFound();
12504
12505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12506 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12507 m_errorMonitor->VerifyFound();
12508
12509 vkDestroyEvent(test_device.handle(), event, NULL);
12510 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12511}
12512
Chris Forbesd70103a2017-04-13 11:34:09 -070012513TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012514 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12516
Tony Barbour552f6c02016-12-21 14:34:07 -070012517 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012518
12519 VkEvent event;
12520 VkEventCreateInfo event_create_info = {};
12521 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12522 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012523 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012524
Tony Barbour552f6c02016-12-21 14:34:07 -070012525 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012526 vkDestroyEvent(m_device->device(), event, nullptr);
12527
12528 VkSubmitInfo submit_info = {};
12529 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12530 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012531 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012533 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12534 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070012535}
Mark Muellerc8d441e2016-08-23 17:36:00 -060012536
Chris Forbesd70103a2017-04-13 11:34:09 -070012537TEST_F(VkLayerTest, InUseDestroyedSignaled) {
12538 TEST_DESCRIPTION(
12539 "Use vkCmdExecuteCommands with invalid state "
12540 "in primary and secondary command buffers. "
12541 "Delete objects that are inuse. Call VkQueueSubmit "
12542 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012543
Chris Forbesd70103a2017-04-13 11:34:09 -070012544 ASSERT_NO_FATAL_FAILURE(Init());
12545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12546
12547 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012548
Mark Mueller917f6bc2016-08-30 10:57:19 -060012549 VkSemaphoreCreateInfo semaphore_create_info = {};
12550 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12551 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012552 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012553 VkFenceCreateInfo fence_create_info = {};
12554 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12555 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012556 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012557
12558 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012559 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012560 descriptor_pool_type_count.descriptorCount = 1;
12561
12562 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12563 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12564 descriptor_pool_create_info.maxSets = 1;
12565 descriptor_pool_create_info.poolSizeCount = 1;
12566 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012567 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012568
12569 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012570 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012571
12572 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012573 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012574 descriptorset_layout_binding.descriptorCount = 1;
12575 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12576
12577 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012578 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012579 descriptorset_layout_create_info.bindingCount = 1;
12580 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12581
12582 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012583 ASSERT_VK_SUCCESS(
12584 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012585
12586 VkDescriptorSet descriptorset;
12587 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012588 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012589 descriptorset_allocate_info.descriptorSetCount = 1;
12590 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12591 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012592 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012593
Mark Mueller4042b652016-09-05 22:52:21 -060012594 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12595
12596 VkDescriptorBufferInfo buffer_info = {};
12597 buffer_info.buffer = buffer_test.GetBuffer();
12598 buffer_info.offset = 0;
12599 buffer_info.range = 1024;
12600
12601 VkWriteDescriptorSet write_descriptor_set = {};
12602 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12603 write_descriptor_set.dstSet = descriptorset;
12604 write_descriptor_set.descriptorCount = 1;
12605 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12606 write_descriptor_set.pBufferInfo = &buffer_info;
12607
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012608 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012609
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012610 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12611 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012612
12613 VkPipelineObj pipe(m_device);
12614 pipe.AddColorAttachment();
12615 pipe.AddShader(&vs);
12616 pipe.AddShader(&fs);
12617
12618 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012619 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012620 pipeline_layout_create_info.setLayoutCount = 1;
12621 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12622
12623 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012624 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012625
12626 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12627
Chris Forbesd70103a2017-04-13 11:34:09 -070012628 VkEvent event;
12629 VkEventCreateInfo event_create_info = {};
12630 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12631 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12632
Tony Barbour552f6c02016-12-21 14:34:07 -070012633 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070012634
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012635 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012636
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012637 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12638 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12639 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012640
Tony Barbour552f6c02016-12-21 14:34:07 -070012641 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012642
Chris Forbesd70103a2017-04-13 11:34:09 -070012643 VkSubmitInfo submit_info = {};
12644 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12645 submit_info.commandBufferCount = 1;
12646 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012647 submit_info.signalSemaphoreCount = 1;
12648 submit_info.pSignalSemaphores = &semaphore;
12649 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012650 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012651
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012653 vkDestroyEvent(m_device->device(), event, nullptr);
12654 m_errorMonitor->VerifyFound();
12655
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012657 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12658 m_errorMonitor->VerifyFound();
12659
Jeremy Hayes08369882017-02-02 10:31:06 -070012660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012661 vkDestroyFence(m_device->device(), fence, nullptr);
12662 m_errorMonitor->VerifyFound();
12663
Tobin Ehlis122207b2016-09-01 08:50:06 -070012664 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012665 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12666 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012667 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012668 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12669 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012670 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012671 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12672 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012673 vkDestroyEvent(m_device->device(), event, nullptr);
12674 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012675 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012676 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12677}
12678
Tobin Ehlis2adda372016-09-01 08:51:06 -070012679TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12680 TEST_DESCRIPTION("Delete in-use query pool.");
12681
Tony Barbour1fa09702017-03-16 12:09:08 -060012682 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12684
12685 VkQueryPool query_pool;
12686 VkQueryPoolCreateInfo query_pool_ci{};
12687 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12688 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12689 query_pool_ci.queryCount = 1;
12690 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012691 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012692 // Reset query pool to create binding with cmd buffer
12693 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12694
Tony Barbour552f6c02016-12-21 14:34:07 -070012695 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012696
12697 VkSubmitInfo submit_info = {};
12698 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12699 submit_info.commandBufferCount = 1;
12700 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12701 // Submit cmd buffer and then destroy query pool while in-flight
12702 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12703
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012705 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12706 m_errorMonitor->VerifyFound();
12707
12708 vkQueueWaitIdle(m_device->m_queue);
12709 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012710 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012711 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012712 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12713}
12714
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012715TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12716 TEST_DESCRIPTION("Delete in-use pipeline.");
12717
Tony Barbour1fa09702017-03-16 12:09:08 -060012718 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12720
12721 // Empty pipeline layout used for binding PSO
12722 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12723 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12724 pipeline_layout_ci.setLayoutCount = 0;
12725 pipeline_layout_ci.pSetLayouts = NULL;
12726
12727 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012728 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012729 ASSERT_VK_SUCCESS(err);
12730
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012732 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012733 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12734 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012735 // Store pipeline handle so we can actually delete it before test finishes
12736 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012737 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012738 VkPipelineObj pipe(m_device);
12739 pipe.AddShader(&vs);
12740 pipe.AddShader(&fs);
12741 pipe.AddColorAttachment();
12742 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12743 delete_this_pipeline = pipe.handle();
12744
Tony Barbour552f6c02016-12-21 14:34:07 -070012745 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012746 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012747 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012748
Tony Barbour552f6c02016-12-21 14:34:07 -070012749 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012750
12751 VkSubmitInfo submit_info = {};
12752 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12753 submit_info.commandBufferCount = 1;
12754 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12755 // Submit cmd buffer and then pipeline destroyed while in-flight
12756 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012757 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012758 m_errorMonitor->VerifyFound();
12759 // Make sure queue finished and then actually delete pipeline
12760 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012761 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12762 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012763 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12764 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12765}
12766
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012767TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12768 TEST_DESCRIPTION("Delete in-use imageView.");
12769
Tony Barbour1fa09702017-03-16 12:09:08 -060012770 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12772
12773 VkDescriptorPoolSize ds_type_count;
12774 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12775 ds_type_count.descriptorCount = 1;
12776
12777 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12778 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12779 ds_pool_ci.maxSets = 1;
12780 ds_pool_ci.poolSizeCount = 1;
12781 ds_pool_ci.pPoolSizes = &ds_type_count;
12782
12783 VkDescriptorPool ds_pool;
12784 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12785 ASSERT_VK_SUCCESS(err);
12786
12787 VkSamplerCreateInfo sampler_ci = {};
12788 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12789 sampler_ci.pNext = NULL;
12790 sampler_ci.magFilter = VK_FILTER_NEAREST;
12791 sampler_ci.minFilter = VK_FILTER_NEAREST;
12792 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12793 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12794 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12795 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12796 sampler_ci.mipLodBias = 1.0;
12797 sampler_ci.anisotropyEnable = VK_FALSE;
12798 sampler_ci.maxAnisotropy = 1;
12799 sampler_ci.compareEnable = VK_FALSE;
12800 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12801 sampler_ci.minLod = 1.0;
12802 sampler_ci.maxLod = 1.0;
12803 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12804 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12805 VkSampler sampler;
12806
12807 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12808 ASSERT_VK_SUCCESS(err);
12809
12810 VkDescriptorSetLayoutBinding layout_binding;
12811 layout_binding.binding = 0;
12812 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12813 layout_binding.descriptorCount = 1;
12814 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12815 layout_binding.pImmutableSamplers = NULL;
12816
12817 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12818 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12819 ds_layout_ci.bindingCount = 1;
12820 ds_layout_ci.pBindings = &layout_binding;
12821 VkDescriptorSetLayout ds_layout;
12822 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12823 ASSERT_VK_SUCCESS(err);
12824
12825 VkDescriptorSetAllocateInfo alloc_info = {};
12826 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12827 alloc_info.descriptorSetCount = 1;
12828 alloc_info.descriptorPool = ds_pool;
12829 alloc_info.pSetLayouts = &ds_layout;
12830 VkDescriptorSet descriptor_set;
12831 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12832 ASSERT_VK_SUCCESS(err);
12833
12834 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12835 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12836 pipeline_layout_ci.pNext = NULL;
12837 pipeline_layout_ci.setLayoutCount = 1;
12838 pipeline_layout_ci.pSetLayouts = &ds_layout;
12839
12840 VkPipelineLayout pipeline_layout;
12841 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12842 ASSERT_VK_SUCCESS(err);
12843
12844 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012845 image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012846 ASSERT_TRUE(image.initialized());
12847
12848 VkImageView view;
12849 VkImageViewCreateInfo ivci = {};
12850 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12851 ivci.image = image.handle();
12852 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12853 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12854 ivci.subresourceRange.layerCount = 1;
12855 ivci.subresourceRange.baseMipLevel = 0;
12856 ivci.subresourceRange.levelCount = 1;
12857 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12858
12859 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12860 ASSERT_VK_SUCCESS(err);
12861
12862 VkDescriptorImageInfo image_info{};
12863 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12864 image_info.imageView = view;
12865 image_info.sampler = sampler;
12866
12867 VkWriteDescriptorSet descriptor_write = {};
12868 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12869 descriptor_write.dstSet = descriptor_set;
12870 descriptor_write.dstBinding = 0;
12871 descriptor_write.descriptorCount = 1;
12872 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12873 descriptor_write.pImageInfo = &image_info;
12874
12875 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12876
12877 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012878 char const *vsSource =
12879 "#version 450\n"
12880 "\n"
12881 "out gl_PerVertex { \n"
12882 " vec4 gl_Position;\n"
12883 "};\n"
12884 "void main(){\n"
12885 " gl_Position = vec4(1);\n"
12886 "}\n";
12887 char const *fsSource =
12888 "#version 450\n"
12889 "\n"
12890 "layout(set=0, binding=0) uniform sampler2D s;\n"
12891 "layout(location=0) out vec4 x;\n"
12892 "void main(){\n"
12893 " x = texture(s, vec2(1));\n"
12894 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012895 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12896 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12897 VkPipelineObj pipe(m_device);
12898 pipe.AddShader(&vs);
12899 pipe.AddShader(&fs);
12900 pipe.AddColorAttachment();
12901 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12902
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012904
Tony Barbour552f6c02016-12-21 14:34:07 -070012905 m_commandBuffer->BeginCommandBuffer();
12906 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012907 // Bind pipeline to cmd buffer
12908 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12909 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12910 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012911
12912 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12913 VkRect2D scissor = {{0, 0}, {16, 16}};
12914 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12915 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12916
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012917 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012918 m_commandBuffer->EndRenderPass();
12919 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012920 // Submit cmd buffer then destroy sampler
12921 VkSubmitInfo submit_info = {};
12922 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12923 submit_info.commandBufferCount = 1;
12924 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12925 // Submit cmd buffer and then destroy imageView while in-flight
12926 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12927
12928 vkDestroyImageView(m_device->device(), view, nullptr);
12929 m_errorMonitor->VerifyFound();
12930 vkQueueWaitIdle(m_device->m_queue);
12931 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012932 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012933 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012934 vkDestroyImageView(m_device->device(), view, NULL);
12935 vkDestroySampler(m_device->device(), sampler, nullptr);
12936 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12937 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12938 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12939}
12940
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012941TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12942 TEST_DESCRIPTION("Delete in-use bufferView.");
12943
Tony Barbour1fa09702017-03-16 12:09:08 -060012944 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12946
12947 VkDescriptorPoolSize ds_type_count;
12948 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12949 ds_type_count.descriptorCount = 1;
12950
12951 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12952 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12953 ds_pool_ci.maxSets = 1;
12954 ds_pool_ci.poolSizeCount = 1;
12955 ds_pool_ci.pPoolSizes = &ds_type_count;
12956
12957 VkDescriptorPool ds_pool;
12958 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12959 ASSERT_VK_SUCCESS(err);
12960
12961 VkDescriptorSetLayoutBinding layout_binding;
12962 layout_binding.binding = 0;
12963 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12964 layout_binding.descriptorCount = 1;
12965 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12966 layout_binding.pImmutableSamplers = NULL;
12967
12968 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12969 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12970 ds_layout_ci.bindingCount = 1;
12971 ds_layout_ci.pBindings = &layout_binding;
12972 VkDescriptorSetLayout ds_layout;
12973 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12974 ASSERT_VK_SUCCESS(err);
12975
12976 VkDescriptorSetAllocateInfo alloc_info = {};
12977 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12978 alloc_info.descriptorSetCount = 1;
12979 alloc_info.descriptorPool = ds_pool;
12980 alloc_info.pSetLayouts = &ds_layout;
12981 VkDescriptorSet descriptor_set;
12982 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12983 ASSERT_VK_SUCCESS(err);
12984
12985 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12986 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12987 pipeline_layout_ci.pNext = NULL;
12988 pipeline_layout_ci.setLayoutCount = 1;
12989 pipeline_layout_ci.pSetLayouts = &ds_layout;
12990
12991 VkPipelineLayout pipeline_layout;
12992 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12993 ASSERT_VK_SUCCESS(err);
12994
12995 VkBuffer buffer;
12996 uint32_t queue_family_index = 0;
12997 VkBufferCreateInfo buffer_create_info = {};
12998 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12999 buffer_create_info.size = 1024;
13000 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13001 buffer_create_info.queueFamilyIndexCount = 1;
13002 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13003
13004 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13005 ASSERT_VK_SUCCESS(err);
13006
13007 VkMemoryRequirements memory_reqs;
13008 VkDeviceMemory buffer_memory;
13009
13010 VkMemoryAllocateInfo memory_info = {};
13011 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13012 memory_info.allocationSize = 0;
13013 memory_info.memoryTypeIndex = 0;
13014
13015 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13016 memory_info.allocationSize = memory_reqs.size;
13017 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13018 ASSERT_TRUE(pass);
13019
13020 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13021 ASSERT_VK_SUCCESS(err);
13022 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13023 ASSERT_VK_SUCCESS(err);
13024
13025 VkBufferView view;
13026 VkBufferViewCreateInfo bvci = {};
13027 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13028 bvci.buffer = buffer;
13029 bvci.format = VK_FORMAT_R8_UNORM;
13030 bvci.range = VK_WHOLE_SIZE;
13031
13032 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13033 ASSERT_VK_SUCCESS(err);
13034
13035 VkWriteDescriptorSet descriptor_write = {};
13036 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13037 descriptor_write.dstSet = descriptor_set;
13038 descriptor_write.dstBinding = 0;
13039 descriptor_write.descriptorCount = 1;
13040 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13041 descriptor_write.pTexelBufferView = &view;
13042
13043 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13044
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013045 char const *vsSource =
13046 "#version 450\n"
13047 "\n"
13048 "out gl_PerVertex { \n"
13049 " vec4 gl_Position;\n"
13050 "};\n"
13051 "void main(){\n"
13052 " gl_Position = vec4(1);\n"
13053 "}\n";
13054 char const *fsSource =
13055 "#version 450\n"
13056 "\n"
13057 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13058 "layout(location=0) out vec4 x;\n"
13059 "void main(){\n"
13060 " x = imageLoad(s, 0);\n"
13061 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013062 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13063 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13064 VkPipelineObj pipe(m_device);
13065 pipe.AddShader(&vs);
13066 pipe.AddShader(&fs);
13067 pipe.AddColorAttachment();
13068 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13069
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013071
Tony Barbour552f6c02016-12-21 14:34:07 -070013072 m_commandBuffer->BeginCommandBuffer();
13073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013074 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13075 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13076 VkRect2D scissor = {{0, 0}, {16, 16}};
13077 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13078 // Bind pipeline to cmd buffer
13079 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13080 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13081 &descriptor_set, 0, nullptr);
13082 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013083 m_commandBuffer->EndRenderPass();
13084 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013085
13086 VkSubmitInfo submit_info = {};
13087 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13088 submit_info.commandBufferCount = 1;
13089 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13090 // Submit cmd buffer and then destroy bufferView while in-flight
13091 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13092
13093 vkDestroyBufferView(m_device->device(), view, nullptr);
13094 m_errorMonitor->VerifyFound();
13095 vkQueueWaitIdle(m_device->m_queue);
13096 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013097 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013098 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013099 vkDestroyBufferView(m_device->device(), view, NULL);
13100 vkDestroyBuffer(m_device->device(), buffer, NULL);
13101 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13102 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13103 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13104 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13105}
13106
Tobin Ehlis209532e2016-09-07 13:52:18 -060013107TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13108 TEST_DESCRIPTION("Delete in-use sampler.");
13109
Tony Barbour1fa09702017-03-16 12:09:08 -060013110 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13112
13113 VkDescriptorPoolSize ds_type_count;
13114 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13115 ds_type_count.descriptorCount = 1;
13116
13117 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13118 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13119 ds_pool_ci.maxSets = 1;
13120 ds_pool_ci.poolSizeCount = 1;
13121 ds_pool_ci.pPoolSizes = &ds_type_count;
13122
13123 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013124 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013125 ASSERT_VK_SUCCESS(err);
13126
13127 VkSamplerCreateInfo sampler_ci = {};
13128 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13129 sampler_ci.pNext = NULL;
13130 sampler_ci.magFilter = VK_FILTER_NEAREST;
13131 sampler_ci.minFilter = VK_FILTER_NEAREST;
13132 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13133 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13134 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13135 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13136 sampler_ci.mipLodBias = 1.0;
13137 sampler_ci.anisotropyEnable = VK_FALSE;
13138 sampler_ci.maxAnisotropy = 1;
13139 sampler_ci.compareEnable = VK_FALSE;
13140 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13141 sampler_ci.minLod = 1.0;
13142 sampler_ci.maxLod = 1.0;
13143 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13144 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13145 VkSampler sampler;
13146
13147 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13148 ASSERT_VK_SUCCESS(err);
13149
13150 VkDescriptorSetLayoutBinding layout_binding;
13151 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013152 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013153 layout_binding.descriptorCount = 1;
13154 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13155 layout_binding.pImmutableSamplers = NULL;
13156
13157 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13158 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13159 ds_layout_ci.bindingCount = 1;
13160 ds_layout_ci.pBindings = &layout_binding;
13161 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013162 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013163 ASSERT_VK_SUCCESS(err);
13164
13165 VkDescriptorSetAllocateInfo alloc_info = {};
13166 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13167 alloc_info.descriptorSetCount = 1;
13168 alloc_info.descriptorPool = ds_pool;
13169 alloc_info.pSetLayouts = &ds_layout;
13170 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013171 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013172 ASSERT_VK_SUCCESS(err);
13173
13174 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13175 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13176 pipeline_layout_ci.pNext = NULL;
13177 pipeline_layout_ci.setLayoutCount = 1;
13178 pipeline_layout_ci.pSetLayouts = &ds_layout;
13179
13180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013181 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013182 ASSERT_VK_SUCCESS(err);
13183
13184 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013185 image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013186 ASSERT_TRUE(image.initialized());
13187
13188 VkImageView view;
13189 VkImageViewCreateInfo ivci = {};
13190 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13191 ivci.image = image.handle();
13192 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13193 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13194 ivci.subresourceRange.layerCount = 1;
13195 ivci.subresourceRange.baseMipLevel = 0;
13196 ivci.subresourceRange.levelCount = 1;
13197 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13198
13199 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13200 ASSERT_VK_SUCCESS(err);
13201
13202 VkDescriptorImageInfo image_info{};
13203 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13204 image_info.imageView = view;
13205 image_info.sampler = sampler;
13206
13207 VkWriteDescriptorSet descriptor_write = {};
13208 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13209 descriptor_write.dstSet = descriptor_set;
13210 descriptor_write.dstBinding = 0;
13211 descriptor_write.descriptorCount = 1;
13212 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13213 descriptor_write.pImageInfo = &image_info;
13214
13215 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13216
13217 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013218 char const *vsSource =
13219 "#version 450\n"
13220 "\n"
13221 "out gl_PerVertex { \n"
13222 " vec4 gl_Position;\n"
13223 "};\n"
13224 "void main(){\n"
13225 " gl_Position = vec4(1);\n"
13226 "}\n";
13227 char const *fsSource =
13228 "#version 450\n"
13229 "\n"
13230 "layout(set=0, binding=0) uniform sampler2D s;\n"
13231 "layout(location=0) out vec4 x;\n"
13232 "void main(){\n"
13233 " x = texture(s, vec2(1));\n"
13234 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013235 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13236 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13237 VkPipelineObj pipe(m_device);
13238 pipe.AddShader(&vs);
13239 pipe.AddShader(&fs);
13240 pipe.AddColorAttachment();
13241 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13242
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013244
Tony Barbour552f6c02016-12-21 14:34:07 -070013245 m_commandBuffer->BeginCommandBuffer();
13246 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013247 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013248 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13249 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13250 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013251
13252 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13253 VkRect2D scissor = {{0, 0}, {16, 16}};
13254 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13255 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13256
Tobin Ehlis209532e2016-09-07 13:52:18 -060013257 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013258 m_commandBuffer->EndRenderPass();
13259 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013260 // Submit cmd buffer then destroy sampler
13261 VkSubmitInfo submit_info = {};
13262 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13263 submit_info.commandBufferCount = 1;
13264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13265 // Submit cmd buffer and then destroy sampler while in-flight
13266 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13267
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013268 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013269 m_errorMonitor->VerifyFound();
13270 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013271
Tobin Ehlis209532e2016-09-07 13:52:18 -060013272 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013273 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13274 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013275 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013276 vkDestroyImageView(m_device->device(), view, NULL);
13277 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13278 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13279 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13280}
13281
Mark Mueller1cd9f412016-08-25 13:23:52 -060013282TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013283 TEST_DESCRIPTION(
13284 "Call VkQueueSubmit with a semaphore that is already "
13285 "signaled but not waited on by the queue. Wait on a "
13286 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013287
Tony Barbour1fa09702017-03-16 12:09:08 -060013288 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013289 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13290
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013291 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013292 const char *invalid_fence_wait_message =
13293 " which has not been submitted on a Queue or during "
13294 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013295
Tony Barbour552f6c02016-12-21 14:34:07 -070013296 m_commandBuffer->BeginCommandBuffer();
13297 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013298
13299 VkSemaphoreCreateInfo semaphore_create_info = {};
13300 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13301 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013302 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013303 VkSubmitInfo submit_info = {};
13304 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13305 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013306 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013307 submit_info.signalSemaphoreCount = 1;
13308 submit_info.pSignalSemaphores = &semaphore;
13309 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013310 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013311 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013312 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013313 m_commandBuffer->BeginCommandBuffer();
13314 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013316 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13317 m_errorMonitor->VerifyFound();
13318
Mark Mueller1cd9f412016-08-25 13:23:52 -060013319 VkFenceCreateInfo fence_create_info = {};
13320 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13321 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013322 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013325 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13326 m_errorMonitor->VerifyFound();
13327
Mark Mueller4042b652016-09-05 22:52:21 -060013328 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013329 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013330 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13331}
13332
Tobin Ehlis4af23302016-07-19 10:50:30 -060013333TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013334 TEST_DESCRIPTION(
13335 "Bind a secondary command buffer with with a framebuffer "
13336 "that does not match the framebuffer for the active "
13337 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013338 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13340
13341 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013342 VkAttachmentDescription attachment = {0,
13343 VK_FORMAT_B8G8R8A8_UNORM,
13344 VK_SAMPLE_COUNT_1_BIT,
13345 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13346 VK_ATTACHMENT_STORE_OP_STORE,
13347 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13348 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13349 VK_IMAGE_LAYOUT_UNDEFINED,
13350 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013351
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013352 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013353
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013354 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013355
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013356 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013357
13358 VkRenderPass rp;
13359 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13360 ASSERT_VK_SUCCESS(err);
13361
13362 // A compatible framebuffer.
13363 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013364 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013365 ASSERT_TRUE(image.initialized());
13366
13367 VkImageViewCreateInfo ivci = {
13368 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13369 nullptr,
13370 0,
13371 image.handle(),
13372 VK_IMAGE_VIEW_TYPE_2D,
13373 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013374 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13375 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013376 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13377 };
13378 VkImageView view;
13379 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13380 ASSERT_VK_SUCCESS(err);
13381
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013382 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013383 VkFramebuffer fb;
13384 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13385 ASSERT_VK_SUCCESS(err);
13386
13387 VkCommandBufferAllocateInfo cbai = {};
13388 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013389 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013390 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13391 cbai.commandBufferCount = 1;
13392
13393 VkCommandBuffer sec_cb;
13394 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13395 ASSERT_VK_SUCCESS(err);
13396 VkCommandBufferBeginInfo cbbi = {};
13397 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013398 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013399 cbii.renderPass = renderPass();
13400 cbii.framebuffer = fb;
13401 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13402 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013403 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013404 cbbi.pInheritanceInfo = &cbii;
13405 vkBeginCommandBuffer(sec_cb, &cbbi);
13406 vkEndCommandBuffer(sec_cb);
13407
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013408 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013409 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13410 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013411
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013413 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013414 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13415 m_errorMonitor->VerifyFound();
13416 // Cleanup
13417 vkDestroyImageView(m_device->device(), view, NULL);
13418 vkDestroyRenderPass(m_device->device(), rp, NULL);
13419 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13420}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013421
13422TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013423 TEST_DESCRIPTION(
13424 "If logicOp is available on the device, set it to an "
13425 "invalid value. If logicOp is not available, attempt to "
13426 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013427 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13429
13430 auto features = m_device->phy().features();
13431 // Set the expected error depending on whether or not logicOp available
13432 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13434 "If logic operations feature not "
13435 "enabled, logicOpEnable must be "
13436 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013437 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013439 }
13440 // Create a pipeline using logicOp
13441 VkResult err;
13442
13443 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13444 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13445
13446 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013447 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013448 ASSERT_VK_SUCCESS(err);
13449
13450 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13451 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13452 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013453 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013454 vp_state_ci.pViewports = &vp;
13455 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013456 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013457 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013458
13459 VkPipelineShaderStageCreateInfo shaderStages[2];
13460 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13461
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013462 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13463 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013464 shaderStages[0] = vs.GetStageCreateInfo();
13465 shaderStages[1] = fs.GetStageCreateInfo();
13466
13467 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13468 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13469
13470 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13471 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13472 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13473
13474 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13475 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013476 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013477
13478 VkPipelineColorBlendAttachmentState att = {};
13479 att.blendEnable = VK_FALSE;
13480 att.colorWriteMask = 0xf;
13481
13482 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13483 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13484 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13485 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013486 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013487 cb_ci.attachmentCount = 1;
13488 cb_ci.pAttachments = &att;
13489
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013490 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13491 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13492 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13493
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013494 VkGraphicsPipelineCreateInfo gp_ci = {};
13495 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13496 gp_ci.stageCount = 2;
13497 gp_ci.pStages = shaderStages;
13498 gp_ci.pVertexInputState = &vi_ci;
13499 gp_ci.pInputAssemblyState = &ia_ci;
13500 gp_ci.pViewportState = &vp_state_ci;
13501 gp_ci.pRasterizationState = &rs_ci;
13502 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013503 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013504 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13505 gp_ci.layout = pipeline_layout;
13506 gp_ci.renderPass = renderPass();
13507
13508 VkPipelineCacheCreateInfo pc_ci = {};
13509 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13510
13511 VkPipeline pipeline;
13512 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013513 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013514 ASSERT_VK_SUCCESS(err);
13515
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013516 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013517 m_errorMonitor->VerifyFound();
13518 if (VK_SUCCESS == err) {
13519 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13520 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013521 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13522 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13523}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013524
Mike Stroyanaccf7692015-05-12 16:00:45 -060013525#if GTEST_IS_THREADSAFE
13526struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013527 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013528 VkEvent event;
13529 bool bailout;
13530};
13531
Karl Schultz6addd812016-02-02 17:17:23 -070013532extern "C" void *AddToCommandBuffer(void *arg) {
13533 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013534
Mike Stroyana6d14942016-07-13 15:10:05 -060013535 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013536 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013537 if (data->bailout) {
13538 break;
13539 }
13540 }
13541 return NULL;
13542}
13543
Karl Schultz6addd812016-02-02 17:17:23 -070013544TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013545 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013546
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013548
Tony Barbour1fa09702017-03-16 12:09:08 -060013549 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013550 ASSERT_NO_FATAL_FAILURE(InitViewport());
13551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13552
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013553 // Calls AllocateCommandBuffers
13554 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013555
13556 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013557 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013558
13559 VkEventCreateInfo event_info;
13560 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013561 VkResult err;
13562
13563 memset(&event_info, 0, sizeof(event_info));
13564 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13565
Chia-I Wuf7458c52015-10-26 21:10:41 +080013566 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013567 ASSERT_VK_SUCCESS(err);
13568
Mike Stroyanaccf7692015-05-12 16:00:45 -060013569 err = vkResetEvent(device(), event);
13570 ASSERT_VK_SUCCESS(err);
13571
13572 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013573 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013574 data.event = event;
13575 data.bailout = false;
13576 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013577
13578 // First do some correct operations using multiple threads.
13579 // Add many entries to command buffer from another thread.
13580 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13581 // Make non-conflicting calls from this thread at the same time.
13582 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013583 uint32_t count;
13584 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013585 }
13586 test_platform_thread_join(thread, NULL);
13587
13588 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013589 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013590 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013591 // Add many entries to command buffer from this thread at the same time.
13592 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013593
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013594 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013595 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013596
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013597 m_errorMonitor->SetBailout(NULL);
13598
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013599 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013600
Chia-I Wuf7458c52015-10-26 21:10:41 +080013601 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013602}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013603#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013604
Karl Schultz6addd812016-02-02 17:17:23 -070013605TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013606 TEST_DESCRIPTION(
13607 "Test that an error is produced for a spirv module "
13608 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013609
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013611
Tony Barbour1fa09702017-03-16 12:09:08 -060013612 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13614
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013615 VkShaderModule module;
13616 VkShaderModuleCreateInfo moduleCreateInfo;
13617 struct icd_spv_header spv;
13618
13619 spv.magic = ICD_SPV_MAGIC;
13620 spv.version = ICD_SPV_VERSION;
13621 spv.gen_magic = 0;
13622
13623 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13624 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013625 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013626 moduleCreateInfo.codeSize = 4;
13627 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013628 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013629
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013630 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013631}
13632
Karl Schultz6addd812016-02-02 17:17:23 -070013633TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013634 TEST_DESCRIPTION(
13635 "Test that an error is produced for a spirv module "
13636 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013637
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013639
Tony Barbour1fa09702017-03-16 12:09:08 -060013640 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13642
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013643 VkShaderModule module;
13644 VkShaderModuleCreateInfo moduleCreateInfo;
13645 struct icd_spv_header spv;
13646
13647 spv.magic = ~ICD_SPV_MAGIC;
13648 spv.version = ICD_SPV_VERSION;
13649 spv.gen_magic = 0;
13650
13651 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13652 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013653 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013654 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13655 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013656 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013657
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013658 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013659}
13660
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013661#if 0
13662// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013663TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013665 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013666
Tony Barbour1fa09702017-03-16 12:09:08 -060013667 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13669
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013670 VkShaderModule module;
13671 VkShaderModuleCreateInfo moduleCreateInfo;
13672 struct icd_spv_header spv;
13673
13674 spv.magic = ICD_SPV_MAGIC;
13675 spv.version = ~ICD_SPV_VERSION;
13676 spv.gen_magic = 0;
13677
13678 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13679 moduleCreateInfo.pNext = NULL;
13680
Karl Schultz6addd812016-02-02 17:17:23 -070013681 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013682 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13683 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013684 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013685
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013686 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013687}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013688#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013689
Karl Schultz6addd812016-02-02 17:17:23 -070013690TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013691 TEST_DESCRIPTION(
13692 "Test that a warning is produced for a vertex output that "
13693 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013695
Tony Barbour1fa09702017-03-16 12:09:08 -060013696 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013698
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013699 char const *vsSource =
13700 "#version 450\n"
13701 "\n"
13702 "layout(location=0) out float x;\n"
13703 "out gl_PerVertex {\n"
13704 " vec4 gl_Position;\n"
13705 "};\n"
13706 "void main(){\n"
13707 " gl_Position = vec4(1);\n"
13708 " x = 0;\n"
13709 "}\n";
13710 char const *fsSource =
13711 "#version 450\n"
13712 "\n"
13713 "layout(location=0) out vec4 color;\n"
13714 "void main(){\n"
13715 " color = vec4(1);\n"
13716 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013717
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013718 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13719 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013720
13721 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013722 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013723 pipe.AddShader(&vs);
13724 pipe.AddShader(&fs);
13725
Chris Forbes9f7ff632015-05-25 11:13:08 +120013726 VkDescriptorSetObj descriptorSet(m_device);
13727 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013728 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013729
Tony Barbour5781e8f2015-08-04 16:23:11 -060013730 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013731
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013732 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013733}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013734
Mark Mueller098c9cb2016-09-08 09:01:57 -060013735TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13736 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13737
Tony Barbour1fa09702017-03-16 12:09:08 -060013738 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013739 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13740
13741 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013742 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013743
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013744 char const *vsSource =
13745 "#version 450\n"
13746 "\n"
13747 "out gl_PerVertex {\n"
13748 " vec4 gl_Position;\n"
13749 "};\n"
13750 "void main(){\n"
13751 " gl_Position = vec4(1);\n"
13752 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013753
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013754 char const *fsSource =
13755 "#version 450\n"
13756 "\n"
13757 "layout (constant_id = 0) const float r = 0.0f;\n"
13758 "layout(location = 0) out vec4 uFragColor;\n"
13759 "void main(){\n"
13760 " uFragColor = vec4(r,1,0,1);\n"
13761 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013762
13763 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13764 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13765
13766 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13767 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13768
13769 VkPipelineLayout pipeline_layout;
13770 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13771
13772 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13773 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13774 vp_state_create_info.viewportCount = 1;
13775 VkViewport viewport = {};
13776 vp_state_create_info.pViewports = &viewport;
13777 vp_state_create_info.scissorCount = 1;
13778 VkRect2D scissors = {};
13779 vp_state_create_info.pScissors = &scissors;
13780
13781 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13782
13783 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13784 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13785 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13786 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13787
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013788 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013789
13790 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13791 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13792
13793 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13794 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13795 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13796
13797 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13798 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13799 rasterization_state_create_info.pNext = nullptr;
13800 rasterization_state_create_info.lineWidth = 1.0f;
13801 rasterization_state_create_info.rasterizerDiscardEnable = true;
13802
13803 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13804 color_blend_attachment_state.blendEnable = VK_FALSE;
13805 color_blend_attachment_state.colorWriteMask = 0xf;
13806
13807 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13808 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13809 color_blend_state_create_info.attachmentCount = 1;
13810 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13811
13812 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13813 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13814 graphicspipe_create_info.stageCount = 2;
13815 graphicspipe_create_info.pStages = shader_stage_create_info;
13816 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13817 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13818 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13819 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13820 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13821 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13822 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13823 graphicspipe_create_info.layout = pipeline_layout;
13824 graphicspipe_create_info.renderPass = renderPass();
13825
13826 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13827 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13828
13829 VkPipelineCache pipelineCache;
13830 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13831
13832 // This structure maps constant ids to data locations.
13833 const VkSpecializationMapEntry entry =
13834 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013835 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013836
13837 uint32_t data = 1;
13838
13839 // Set up the info describing spec map and data
13840 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013841 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013842 };
13843 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13844
13845 VkPipeline pipeline;
13846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13847 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13848 m_errorMonitor->VerifyFound();
13849
13850 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13851 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13852}
13853
13854TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13855 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13856
Tony Barbour1fa09702017-03-16 12:09:08 -060013857 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013858 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13859
13860 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13861
13862 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13863 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13864 descriptor_pool_type_count[0].descriptorCount = 1;
13865 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13866 descriptor_pool_type_count[1].descriptorCount = 1;
13867
13868 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13869 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13870 descriptor_pool_create_info.maxSets = 1;
13871 descriptor_pool_create_info.poolSizeCount = 2;
13872 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13873 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13874
13875 VkDescriptorPool descriptorset_pool;
13876 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13877
13878 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13879 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13880 descriptorset_layout_binding.descriptorCount = 1;
13881 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013882 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013883
13884 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13885 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13886 descriptorset_layout_create_info.bindingCount = 1;
13887 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13888
13889 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013890 ASSERT_VK_SUCCESS(
13891 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013892
13893 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13894 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13895 descriptorset_allocate_info.descriptorSetCount = 1;
13896 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13897 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13898 VkDescriptorSet descriptorset;
13899 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13900
13901 // Challenge core_validation with a non uniform buffer type.
13902 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13903
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013904 char const *vsSource =
13905 "#version 450\n"
13906 "\n"
13907 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13908 " mat4 mvp;\n"
13909 "} ubuf;\n"
13910 "out gl_PerVertex {\n"
13911 " vec4 gl_Position;\n"
13912 "};\n"
13913 "void main(){\n"
13914 " gl_Position = ubuf.mvp * vec4(1);\n"
13915 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013916
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013917 char const *fsSource =
13918 "#version 450\n"
13919 "\n"
13920 "layout(location = 0) out vec4 uFragColor;\n"
13921 "void main(){\n"
13922 " uFragColor = vec4(0,1,0,1);\n"
13923 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013924
13925 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13926 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13927
13928 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13929 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13930 pipeline_layout_create_info.setLayoutCount = 1;
13931 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13932
13933 VkPipelineLayout pipeline_layout;
13934 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13935
13936 VkPipelineObj pipe(m_device);
13937 pipe.AddColorAttachment();
13938 pipe.AddShader(&vs);
13939 pipe.AddShader(&fs);
13940
13941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13942 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13943 m_errorMonitor->VerifyFound();
13944
13945 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13946 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13947 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13948}
13949
13950TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13951 TEST_DESCRIPTION(
13952 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13953
Tony Barbour1fa09702017-03-16 12:09:08 -060013954 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013955 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13956
13957 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13958
13959 VkDescriptorPoolSize descriptor_pool_type_count = {};
13960 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13961 descriptor_pool_type_count.descriptorCount = 1;
13962
13963 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13964 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13965 descriptor_pool_create_info.maxSets = 1;
13966 descriptor_pool_create_info.poolSizeCount = 1;
13967 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13968 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13969
13970 VkDescriptorPool descriptorset_pool;
13971 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13972
13973 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13974 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13975 descriptorset_layout_binding.descriptorCount = 1;
13976 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13977 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013978 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013979
13980 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13981 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13982 descriptorset_layout_create_info.bindingCount = 1;
13983 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13984
13985 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013986 ASSERT_VK_SUCCESS(
13987 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013988
13989 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13990 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13991 descriptorset_allocate_info.descriptorSetCount = 1;
13992 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13993 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13994 VkDescriptorSet descriptorset;
13995 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13996
13997 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013999 char const *vsSource =
14000 "#version 450\n"
14001 "\n"
14002 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14003 " mat4 mvp;\n"
14004 "} ubuf;\n"
14005 "out gl_PerVertex {\n"
14006 " vec4 gl_Position;\n"
14007 "};\n"
14008 "void main(){\n"
14009 " gl_Position = ubuf.mvp * vec4(1);\n"
14010 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014011
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014012 char const *fsSource =
14013 "#version 450\n"
14014 "\n"
14015 "layout(location = 0) out vec4 uFragColor;\n"
14016 "void main(){\n"
14017 " uFragColor = vec4(0,1,0,1);\n"
14018 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014019
14020 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14021 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14022
14023 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14024 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14025 pipeline_layout_create_info.setLayoutCount = 1;
14026 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14027
14028 VkPipelineLayout pipeline_layout;
14029 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14030
14031 VkPipelineObj pipe(m_device);
14032 pipe.AddColorAttachment();
14033 pipe.AddShader(&vs);
14034 pipe.AddShader(&fs);
14035
14036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14037 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14038 m_errorMonitor->VerifyFound();
14039
14040 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14041 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14042 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14043}
14044
14045TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014046 TEST_DESCRIPTION(
14047 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14048 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014049
Tony Barbour1fa09702017-03-16 12:09:08 -060014050 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14052
14053 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014054 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014055
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014056 char const *vsSource =
14057 "#version 450\n"
14058 "\n"
14059 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14060 "out gl_PerVertex {\n"
14061 " vec4 gl_Position;\n"
14062 "};\n"
14063 "void main(){\n"
14064 " gl_Position = vec4(consts.x);\n"
14065 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014066
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014067 char const *fsSource =
14068 "#version 450\n"
14069 "\n"
14070 "layout(location = 0) out vec4 uFragColor;\n"
14071 "void main(){\n"
14072 " uFragColor = vec4(0,1,0,1);\n"
14073 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014074
14075 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14076 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14077
14078 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14079 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14080
14081 // Set up a push constant range
14082 VkPushConstantRange push_constant_ranges = {};
14083 // Set to the wrong stage to challenge core_validation
14084 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14085 push_constant_ranges.size = 4;
14086
14087 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14088 pipeline_layout_create_info.pushConstantRangeCount = 1;
14089
14090 VkPipelineLayout pipeline_layout;
14091 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14092
14093 VkPipelineObj pipe(m_device);
14094 pipe.AddColorAttachment();
14095 pipe.AddShader(&vs);
14096 pipe.AddShader(&fs);
14097
14098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14099 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14100 m_errorMonitor->VerifyFound();
14101
14102 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14103}
14104
14105TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14106 TEST_DESCRIPTION(
14107 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14108
Tony Barbour1fa09702017-03-16 12:09:08 -060014109 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14111
14112 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014113 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014114
14115 // Some awkward steps are required to test with custom device features.
14116 std::vector<const char *> device_extension_names;
14117 auto features = m_device->phy().features();
14118 // Disable support for 64 bit floats
14119 features.shaderFloat64 = false;
14120 // The sacrificial device object
14121 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14122
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014123 char const *vsSource =
14124 "#version 450\n"
14125 "\n"
14126 "out gl_PerVertex {\n"
14127 " vec4 gl_Position;\n"
14128 "};\n"
14129 "void main(){\n"
14130 " gl_Position = vec4(1);\n"
14131 "}\n";
14132 char const *fsSource =
14133 "#version 450\n"
14134 "\n"
14135 "layout(location=0) out vec4 color;\n"
14136 "void main(){\n"
14137 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14138 " color = vec4(green);\n"
14139 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014140
14141 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14142 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14143
14144 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014145
14146 VkPipelineObj pipe(&test_device);
14147 pipe.AddColorAttachment();
14148 pipe.AddShader(&vs);
14149 pipe.AddShader(&fs);
14150
14151 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14152 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14153 VkPipelineLayout pipeline_layout;
14154 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14155
14156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14157 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14158 m_errorMonitor->VerifyFound();
14159
14160 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14161}
14162
Mark Lobodzinski20832822017-03-24 14:49:45 -060014163TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14164 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14165 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014166
Tony Barbour1fa09702017-03-16 12:09:08 -060014167 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14169
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014170 char const *vsSource =
14171 "#version 450\n"
14172 "\n"
14173 "out gl_PerVertex {\n"
14174 " vec4 gl_Position;\n"
14175 "};\n"
14176 "layout(xfb_buffer = 1) out;"
14177 "void main(){\n"
14178 " gl_Position = vec4(1);\n"
14179 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014180
Mark Lobodzinski20832822017-03-24 14:49:45 -060014181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014182
Mark Lobodzinski20832822017-03-24 14:49:45 -060014183 std::vector<unsigned int> spv;
14184 VkShaderModuleCreateInfo module_create_info;
14185 VkShaderModule shader_module;
14186 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14187 module_create_info.pNext = NULL;
14188 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14189 module_create_info.pCode = spv.data();
14190 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14191 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014192
Mark Lobodzinski20832822017-03-24 14:49:45 -060014193 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014194
Mark Lobodzinski20832822017-03-24 14:49:45 -060014195 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014196}
14197
Karl Schultz6addd812016-02-02 17:17:23 -070014198TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014199 TEST_DESCRIPTION(
14200 "Test that an error is produced for a fragment shader input "
14201 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014202
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014204
Tony Barbour1fa09702017-03-16 12:09:08 -060014205 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014206 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014207
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014208 char const *vsSource =
14209 "#version 450\n"
14210 "\n"
14211 "out gl_PerVertex {\n"
14212 " vec4 gl_Position;\n"
14213 "};\n"
14214 "void main(){\n"
14215 " gl_Position = vec4(1);\n"
14216 "}\n";
14217 char const *fsSource =
14218 "#version 450\n"
14219 "\n"
14220 "layout(location=0) in float x;\n"
14221 "layout(location=0) out vec4 color;\n"
14222 "void main(){\n"
14223 " color = vec4(x);\n"
14224 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014225
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014226 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14227 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014228
14229 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014230 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014231 pipe.AddShader(&vs);
14232 pipe.AddShader(&fs);
14233
Chris Forbes59cb88d2015-05-25 11:13:13 +120014234 VkDescriptorSetObj descriptorSet(m_device);
14235 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014236 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014237
Tony Barbour5781e8f2015-08-04 16:23:11 -060014238 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014239
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014240 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014241}
14242
Karl Schultz6addd812016-02-02 17:17:23 -070014243TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014244 TEST_DESCRIPTION(
14245 "Test that an error is produced for a fragment shader input "
14246 "within an interace block, which is not present in the outputs "
14247 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014249
Tony Barbour1fa09702017-03-16 12:09:08 -060014250 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14252
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014253 char const *vsSource =
14254 "#version 450\n"
14255 "\n"
14256 "out gl_PerVertex {\n"
14257 " vec4 gl_Position;\n"
14258 "};\n"
14259 "void main(){\n"
14260 " gl_Position = vec4(1);\n"
14261 "}\n";
14262 char const *fsSource =
14263 "#version 450\n"
14264 "\n"
14265 "in block { layout(location=0) float x; } ins;\n"
14266 "layout(location=0) out vec4 color;\n"
14267 "void main(){\n"
14268 " color = vec4(ins.x);\n"
14269 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014270
14271 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14272 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14273
14274 VkPipelineObj pipe(m_device);
14275 pipe.AddColorAttachment();
14276 pipe.AddShader(&vs);
14277 pipe.AddShader(&fs);
14278
14279 VkDescriptorSetObj descriptorSet(m_device);
14280 descriptorSet.AppendDummy();
14281 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14282
14283 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14284
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014285 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014286}
14287
Karl Schultz6addd812016-02-02 17:17:23 -070014288TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014289 TEST_DESCRIPTION(
14290 "Test that an error is produced for mismatched array sizes "
14291 "across the vertex->fragment shader interface");
14292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14293 "Type mismatch on location 0.0: 'ptr to "
14294 "output arr[2] of float32' vs 'ptr to "
14295 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014296
Tony Barbour1fa09702017-03-16 12:09:08 -060014297 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14299
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014300 char const *vsSource =
14301 "#version 450\n"
14302 "\n"
14303 "layout(location=0) out float x[2];\n"
14304 "out gl_PerVertex {\n"
14305 " vec4 gl_Position;\n"
14306 "};\n"
14307 "void main(){\n"
14308 " x[0] = 0; x[1] = 0;\n"
14309 " gl_Position = vec4(1);\n"
14310 "}\n";
14311 char const *fsSource =
14312 "#version 450\n"
14313 "\n"
14314 "layout(location=0) in float x[1];\n"
14315 "layout(location=0) out vec4 color;\n"
14316 "void main(){\n"
14317 " color = vec4(x[0]);\n"
14318 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014319
14320 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14321 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14322
14323 VkPipelineObj pipe(m_device);
14324 pipe.AddColorAttachment();
14325 pipe.AddShader(&vs);
14326 pipe.AddShader(&fs);
14327
14328 VkDescriptorSetObj descriptorSet(m_device);
14329 descriptorSet.AppendDummy();
14330 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14331
14332 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14333
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014334 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014335}
14336
Karl Schultz6addd812016-02-02 17:17:23 -070014337TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014338 TEST_DESCRIPTION(
14339 "Test that an error is produced for mismatched types across "
14340 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014342
Tony Barbour1fa09702017-03-16 12:09:08 -060014343 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014344 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014345
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014346 char const *vsSource =
14347 "#version 450\n"
14348 "\n"
14349 "layout(location=0) out int x;\n"
14350 "out gl_PerVertex {\n"
14351 " vec4 gl_Position;\n"
14352 "};\n"
14353 "void main(){\n"
14354 " x = 0;\n"
14355 " gl_Position = vec4(1);\n"
14356 "}\n";
14357 char const *fsSource =
14358 "#version 450\n"
14359 "\n"
14360 "layout(location=0) in float x;\n" /* VS writes int */
14361 "layout(location=0) out vec4 color;\n"
14362 "void main(){\n"
14363 " color = vec4(x);\n"
14364 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014365
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014366 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14367 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014368
14369 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014370 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014371 pipe.AddShader(&vs);
14372 pipe.AddShader(&fs);
14373
Chris Forbesb56af562015-05-25 11:13:17 +120014374 VkDescriptorSetObj descriptorSet(m_device);
14375 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014376 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014377
Tony Barbour5781e8f2015-08-04 16:23:11 -060014378 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014379
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014380 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014381}
14382
Karl Schultz6addd812016-02-02 17:17:23 -070014383TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014384 TEST_DESCRIPTION(
14385 "Test that an error is produced for mismatched types across "
14386 "the vertex->fragment shader interface, when the variable is contained within "
14387 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014389
Tony Barbour1fa09702017-03-16 12:09:08 -060014390 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14392
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014393 char const *vsSource =
14394 "#version 450\n"
14395 "\n"
14396 "out block { layout(location=0) int x; } outs;\n"
14397 "out gl_PerVertex {\n"
14398 " vec4 gl_Position;\n"
14399 "};\n"
14400 "void main(){\n"
14401 " outs.x = 0;\n"
14402 " gl_Position = vec4(1);\n"
14403 "}\n";
14404 char const *fsSource =
14405 "#version 450\n"
14406 "\n"
14407 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14408 "layout(location=0) out vec4 color;\n"
14409 "void main(){\n"
14410 " color = vec4(ins.x);\n"
14411 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014412
14413 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14414 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14415
14416 VkPipelineObj pipe(m_device);
14417 pipe.AddColorAttachment();
14418 pipe.AddShader(&vs);
14419 pipe.AddShader(&fs);
14420
14421 VkDescriptorSetObj descriptorSet(m_device);
14422 descriptorSet.AppendDummy();
14423 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14424
14425 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014427 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014428}
14429
14430TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014431 TEST_DESCRIPTION(
14432 "Test that an error is produced for location mismatches across "
14433 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14434 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0.0 which is not written by vertex shader");
Chris Forbese9928822016-02-17 14:44:52 +130014436
Tony Barbour1fa09702017-03-16 12:09:08 -060014437 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14439
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014440 char const *vsSource =
14441 "#version 450\n"
14442 "\n"
14443 "out block { layout(location=1) float x; } outs;\n"
14444 "out gl_PerVertex {\n"
14445 " vec4 gl_Position;\n"
14446 "};\n"
14447 "void main(){\n"
14448 " outs.x = 0;\n"
14449 " gl_Position = vec4(1);\n"
14450 "}\n";
14451 char const *fsSource =
14452 "#version 450\n"
14453 "\n"
14454 "in block { layout(location=0) float x; } ins;\n"
14455 "layout(location=0) out vec4 color;\n"
14456 "void main(){\n"
14457 " color = vec4(ins.x);\n"
14458 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014459
14460 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14461 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14462
14463 VkPipelineObj pipe(m_device);
14464 pipe.AddColorAttachment();
14465 pipe.AddShader(&vs);
14466 pipe.AddShader(&fs);
14467
14468 VkDescriptorSetObj descriptorSet(m_device);
14469 descriptorSet.AppendDummy();
14470 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14471
14472 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14473
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014474 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014475}
14476
14477TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014478 TEST_DESCRIPTION(
14479 "Test that an error is produced for component mismatches across the "
14480 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14481 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0.1 which is not written by vertex shader");
Chris Forbese9928822016-02-17 14:44:52 +130014483
Tony Barbour1fa09702017-03-16 12:09:08 -060014484 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14486
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014487 char const *vsSource =
14488 "#version 450\n"
14489 "\n"
14490 "out block { layout(location=0, component=0) float x; } outs;\n"
14491 "out gl_PerVertex {\n"
14492 " vec4 gl_Position;\n"
14493 "};\n"
14494 "void main(){\n"
14495 " outs.x = 0;\n"
14496 " gl_Position = vec4(1);\n"
14497 "}\n";
14498 char const *fsSource =
14499 "#version 450\n"
14500 "\n"
14501 "in block { layout(location=0, component=1) float x; } ins;\n"
14502 "layout(location=0) out vec4 color;\n"
14503 "void main(){\n"
14504 " color = vec4(ins.x);\n"
14505 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014506
14507 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14508 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14509
14510 VkPipelineObj pipe(m_device);
14511 pipe.AddColorAttachment();
14512 pipe.AddShader(&vs);
14513 pipe.AddShader(&fs);
14514
14515 VkDescriptorSetObj descriptorSet(m_device);
14516 descriptorSet.AppendDummy();
14517 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14518
14519 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14520
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014521 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014522}
14523
Chris Forbes1f3b0152016-11-30 12:48:40 +130014524TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14525 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14526
Tony Barbour1fa09702017-03-16 12:09:08 -060014527 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14529
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014530 char const *vsSource =
14531 "#version 450\n"
14532 "layout(location=0) out mediump float x;\n"
14533 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14534 char const *fsSource =
14535 "#version 450\n"
14536 "layout(location=0) in highp float x;\n"
14537 "layout(location=0) out vec4 color;\n"
14538 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014539
14540 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14541 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14542
14543 VkPipelineObj pipe(m_device);
14544 pipe.AddColorAttachment();
14545 pipe.AddShader(&vs);
14546 pipe.AddShader(&fs);
14547
14548 VkDescriptorSetObj descriptorSet(m_device);
14549 descriptorSet.AppendDummy();
14550 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14551
14552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14553
14554 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14555
14556 m_errorMonitor->VerifyFound();
14557}
14558
Chris Forbes870a39e2016-11-30 12:55:56 +130014559TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14560 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14561
Tony Barbour1fa09702017-03-16 12:09:08 -060014562 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14564
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014565 char const *vsSource =
14566 "#version 450\n"
14567 "out block { layout(location=0) mediump float x; };\n"
14568 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14569 char const *fsSource =
14570 "#version 450\n"
14571 "in block { layout(location=0) highp float x; };\n"
14572 "layout(location=0) out vec4 color;\n"
14573 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014574
14575 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14576 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14577
14578 VkPipelineObj pipe(m_device);
14579 pipe.AddColorAttachment();
14580 pipe.AddShader(&vs);
14581 pipe.AddShader(&fs);
14582
14583 VkDescriptorSetObj descriptorSet(m_device);
14584 descriptorSet.AppendDummy();
14585 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14586
14587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14588
14589 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14590
14591 m_errorMonitor->VerifyFound();
14592}
14593
Karl Schultz6addd812016-02-02 17:17:23 -070014594TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014595 TEST_DESCRIPTION(
14596 "Test that a warning is produced for a vertex attribute which is "
14597 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014599
Tony Barbour1fa09702017-03-16 12:09:08 -060014600 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014601 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014602
14603 VkVertexInputBindingDescription input_binding;
14604 memset(&input_binding, 0, sizeof(input_binding));
14605
14606 VkVertexInputAttributeDescription input_attrib;
14607 memset(&input_attrib, 0, sizeof(input_attrib));
14608 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14609
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014610 char const *vsSource =
14611 "#version 450\n"
14612 "\n"
14613 "out gl_PerVertex {\n"
14614 " vec4 gl_Position;\n"
14615 "};\n"
14616 "void main(){\n"
14617 " gl_Position = vec4(1);\n"
14618 "}\n";
14619 char const *fsSource =
14620 "#version 450\n"
14621 "\n"
14622 "layout(location=0) out vec4 color;\n"
14623 "void main(){\n"
14624 " color = vec4(1);\n"
14625 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014626
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014627 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14628 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014629
14630 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014631 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014632 pipe.AddShader(&vs);
14633 pipe.AddShader(&fs);
14634
14635 pipe.AddVertexInputBindings(&input_binding, 1);
14636 pipe.AddVertexInputAttribs(&input_attrib, 1);
14637
Chris Forbesde136e02015-05-25 11:13:28 +120014638 VkDescriptorSetObj descriptorSet(m_device);
14639 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014640 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014641
Tony Barbour5781e8f2015-08-04 16:23:11 -060014642 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014643
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014644 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014645}
14646
Karl Schultz6addd812016-02-02 17:17:23 -070014647TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014648 TEST_DESCRIPTION(
14649 "Test that a warning is produced for a location mismatch on "
14650 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014652
Tony Barbour1fa09702017-03-16 12:09:08 -060014653 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14655
14656 VkVertexInputBindingDescription input_binding;
14657 memset(&input_binding, 0, sizeof(input_binding));
14658
14659 VkVertexInputAttributeDescription input_attrib;
14660 memset(&input_attrib, 0, sizeof(input_attrib));
14661 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14662
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014663 char const *vsSource =
14664 "#version 450\n"
14665 "\n"
14666 "layout(location=1) in float x;\n"
14667 "out gl_PerVertex {\n"
14668 " vec4 gl_Position;\n"
14669 "};\n"
14670 "void main(){\n"
14671 " gl_Position = vec4(x);\n"
14672 "}\n";
14673 char const *fsSource =
14674 "#version 450\n"
14675 "\n"
14676 "layout(location=0) out vec4 color;\n"
14677 "void main(){\n"
14678 " color = vec4(1);\n"
14679 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014680
14681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14683
14684 VkPipelineObj pipe(m_device);
14685 pipe.AddColorAttachment();
14686 pipe.AddShader(&vs);
14687 pipe.AddShader(&fs);
14688
14689 pipe.AddVertexInputBindings(&input_binding, 1);
14690 pipe.AddVertexInputAttribs(&input_attrib, 1);
14691
14692 VkDescriptorSetObj descriptorSet(m_device);
14693 descriptorSet.AppendDummy();
14694 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14695
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014696 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014697 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14698
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014699 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014700}
14701
Karl Schultz6addd812016-02-02 17:17:23 -070014702TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014703 TEST_DESCRIPTION(
14704 "Test that an error is produced for a vertex shader input which is not "
14705 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14707 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014708
Tony Barbour1fa09702017-03-16 12:09:08 -060014709 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014710 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014711
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014712 char const *vsSource =
14713 "#version 450\n"
14714 "\n"
14715 "layout(location=0) in vec4 x;\n" /* not provided */
14716 "out gl_PerVertex {\n"
14717 " vec4 gl_Position;\n"
14718 "};\n"
14719 "void main(){\n"
14720 " gl_Position = x;\n"
14721 "}\n";
14722 char const *fsSource =
14723 "#version 450\n"
14724 "\n"
14725 "layout(location=0) out vec4 color;\n"
14726 "void main(){\n"
14727 " color = vec4(1);\n"
14728 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014729
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014730 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14731 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014732
14733 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014734 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014735 pipe.AddShader(&vs);
14736 pipe.AddShader(&fs);
14737
Chris Forbes62e8e502015-05-25 11:13:29 +120014738 VkDescriptorSetObj descriptorSet(m_device);
14739 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014740 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014741
Tony Barbour5781e8f2015-08-04 16:23:11 -060014742 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014743
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014744 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014745}
14746
Karl Schultz6addd812016-02-02 17:17:23 -070014747TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014748 TEST_DESCRIPTION(
14749 "Test that an error is produced for a mismatch between the "
14750 "fundamental type (float/int/uint) of an attribute and the "
14751 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0 does not match vertex shader input type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014753
Tony Barbour1fa09702017-03-16 12:09:08 -060014754 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014756
14757 VkVertexInputBindingDescription input_binding;
14758 memset(&input_binding, 0, sizeof(input_binding));
14759
14760 VkVertexInputAttributeDescription input_attrib;
14761 memset(&input_attrib, 0, sizeof(input_attrib));
14762 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14763
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014764 char const *vsSource =
14765 "#version 450\n"
14766 "\n"
14767 "layout(location=0) in int x;\n" /* attrib provided float */
14768 "out gl_PerVertex {\n"
14769 " vec4 gl_Position;\n"
14770 "};\n"
14771 "void main(){\n"
14772 " gl_Position = vec4(x);\n"
14773 "}\n";
14774 char const *fsSource =
14775 "#version 450\n"
14776 "\n"
14777 "layout(location=0) out vec4 color;\n"
14778 "void main(){\n"
14779 " color = vec4(1);\n"
14780 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014781
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014782 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14783 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014784
14785 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014786 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014787 pipe.AddShader(&vs);
14788 pipe.AddShader(&fs);
14789
14790 pipe.AddVertexInputBindings(&input_binding, 1);
14791 pipe.AddVertexInputAttribs(&input_attrib, 1);
14792
Chris Forbesc97d98e2015-05-25 11:13:31 +120014793 VkDescriptorSetObj descriptorSet(m_device);
14794 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014795 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014796
Tony Barbour5781e8f2015-08-04 16:23:11 -060014797 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014798
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014799 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014800}
14801
Chris Forbesc68b43c2016-04-06 11:18:47 +120014802TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014803 TEST_DESCRIPTION(
14804 "Test that an error is produced for a pipeline containing multiple "
14805 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14807 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014808
Tony Barbour1fa09702017-03-16 12:09:08 -060014809 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14811
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014812 char const *vsSource =
14813 "#version 450\n"
14814 "\n"
14815 "out gl_PerVertex {\n"
14816 " vec4 gl_Position;\n"
14817 "};\n"
14818 "void main(){\n"
14819 " gl_Position = vec4(1);\n"
14820 "}\n";
14821 char const *fsSource =
14822 "#version 450\n"
14823 "\n"
14824 "layout(location=0) out vec4 color;\n"
14825 "void main(){\n"
14826 " color = vec4(1);\n"
14827 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014828
14829 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14830 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14831
14832 VkPipelineObj pipe(m_device);
14833 pipe.AddColorAttachment();
14834 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014835 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014836 pipe.AddShader(&fs);
14837
14838 VkDescriptorSetObj descriptorSet(m_device);
14839 descriptorSet.AppendDummy();
14840 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14841
14842 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14843
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014844 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014845}
14846
Chris Forbes82ff92a2016-09-09 10:50:24 +120014847TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014849
Tony Barbour1fa09702017-03-16 12:09:08 -060014850 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14852
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014853 char const *vsSource =
14854 "#version 450\n"
14855 "out gl_PerVertex {\n"
14856 " vec4 gl_Position;\n"
14857 "};\n"
14858 "void main(){\n"
14859 " gl_Position = vec4(0);\n"
14860 "}\n";
14861 char const *fsSource =
14862 "#version 450\n"
14863 "\n"
14864 "layout(location=0) out vec4 color;\n"
14865 "void main(){\n"
14866 " color = vec4(1);\n"
14867 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014868
14869 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14870 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14871
14872 VkPipelineObj pipe(m_device);
14873 pipe.AddColorAttachment();
14874 pipe.AddShader(&vs);
14875 pipe.AddShader(&fs);
14876
14877 VkDescriptorSetObj descriptorSet(m_device);
14878 descriptorSet.AppendDummy();
14879 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14880
14881 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14882
14883 m_errorMonitor->VerifyFound();
14884}
14885
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014886TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14888 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14889 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014890
Tony Barbour1fa09702017-03-16 12:09:08 -060014891 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14893
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014894 char const *vsSource =
14895 "#version 450\n"
14896 "void main(){ gl_Position = vec4(0); }\n";
14897 char const *fsSource =
14898 "#version 450\n"
14899 "\n"
14900 "layout(location=0) out vec4 color;\n"
14901 "void main(){\n"
14902 " color = vec4(1);\n"
14903 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014904
14905 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14906 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14907
14908 VkPipelineObj pipe(m_device);
14909 pipe.AddColorAttachment();
14910 pipe.AddShader(&vs);
14911 pipe.AddShader(&fs);
14912
14913 VkDescriptorSetObj descriptorSet(m_device);
14914 descriptorSet.AppendDummy();
14915 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14916
14917 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014918 {
14919 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14920 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14921 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014922 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014923 {
14924 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14925 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14926 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014927 },
14928 };
14929 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014930 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014931 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014932 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14933 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014934 VkRenderPass rp;
14935 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14936 ASSERT_VK_SUCCESS(err);
14937
14938 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14939
14940 m_errorMonitor->VerifyFound();
14941
14942 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14943}
14944
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014945TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014946 TEST_DESCRIPTION(
14947 "Test that an error is produced for a variable output from "
14948 "the TCS without the patch decoration, but consumed in the TES "
14949 "with the decoration.");
14950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14951 "is per-vertex in tessellation control shader stage "
14952 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014953
Tony Barbour1fa09702017-03-16 12:09:08 -060014954 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014955 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14956
Chris Forbesc1e852d2016-04-04 19:26:42 +120014957 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014958 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014959 return;
14960 }
14961
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014962 char const *vsSource =
14963 "#version 450\n"
14964 "void main(){}\n";
14965 char const *tcsSource =
14966 "#version 450\n"
14967 "layout(location=0) out int x[];\n"
14968 "layout(vertices=3) out;\n"
14969 "void main(){\n"
14970 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14971 " gl_TessLevelInner[0] = 1;\n"
14972 " x[gl_InvocationID] = gl_InvocationID;\n"
14973 "}\n";
14974 char const *tesSource =
14975 "#version 450\n"
14976 "layout(triangles, equal_spacing, cw) in;\n"
14977 "layout(location=0) patch in int x;\n"
14978 "out gl_PerVertex { vec4 gl_Position; };\n"
14979 "void main(){\n"
14980 " gl_Position.xyz = gl_TessCoord;\n"
14981 " gl_Position.w = x;\n"
14982 "}\n";
14983 char const *fsSource =
14984 "#version 450\n"
14985 "layout(location=0) out vec4 color;\n"
14986 "void main(){\n"
14987 " color = vec4(1);\n"
14988 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014989
14990 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14991 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14992 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14993 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14994
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014995 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14996 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014997
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014998 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014999
15000 VkPipelineObj pipe(m_device);
15001 pipe.SetInputAssembly(&iasci);
15002 pipe.SetTessellation(&tsci);
15003 pipe.AddColorAttachment();
15004 pipe.AddShader(&vs);
15005 pipe.AddShader(&tcs);
15006 pipe.AddShader(&tes);
15007 pipe.AddShader(&fs);
15008
15009 VkDescriptorSetObj descriptorSet(m_device);
15010 descriptorSet.AppendDummy();
15011 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15012
15013 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15014
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015015 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015016}
15017
Karl Schultz6addd812016-02-02 17:17:23 -070015018TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015019 TEST_DESCRIPTION(
15020 "Test that an error is produced for a vertex attribute setup where multiple "
15021 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15023 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015024
Tony Barbour1fa09702017-03-16 12:09:08 -060015025 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015027
15028 /* Two binding descriptions for binding 0 */
15029 VkVertexInputBindingDescription input_bindings[2];
15030 memset(input_bindings, 0, sizeof(input_bindings));
15031
15032 VkVertexInputAttributeDescription input_attrib;
15033 memset(&input_attrib, 0, sizeof(input_attrib));
15034 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15035
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015036 char const *vsSource =
15037 "#version 450\n"
15038 "\n"
15039 "layout(location=0) in float x;\n" /* attrib provided float */
15040 "out gl_PerVertex {\n"
15041 " vec4 gl_Position;\n"
15042 "};\n"
15043 "void main(){\n"
15044 " gl_Position = vec4(x);\n"
15045 "}\n";
15046 char const *fsSource =
15047 "#version 450\n"
15048 "\n"
15049 "layout(location=0) out vec4 color;\n"
15050 "void main(){\n"
15051 " color = vec4(1);\n"
15052 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015053
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015054 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15055 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015056
15057 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015058 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015059 pipe.AddShader(&vs);
15060 pipe.AddShader(&fs);
15061
15062 pipe.AddVertexInputBindings(input_bindings, 2);
15063 pipe.AddVertexInputAttribs(&input_attrib, 1);
15064
Chris Forbes280ba2c2015-06-12 11:16:41 +120015065 VkDescriptorSetObj descriptorSet(m_device);
15066 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015067 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015068
Tony Barbour5781e8f2015-08-04 16:23:11 -060015069 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015070
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015071 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015072}
Chris Forbes8f68b562015-05-25 11:13:32 +120015073
Karl Schultz6addd812016-02-02 17:17:23 -070015074TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015075 TEST_DESCRIPTION(
15076 "Test that an error is produced for a fragment shader which does not "
15077 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015079
Tony Barbour1fa09702017-03-16 12:09:08 -060015080 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015081
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015082 char const *vsSource =
15083 "#version 450\n"
15084 "\n"
15085 "out gl_PerVertex {\n"
15086 " vec4 gl_Position;\n"
15087 "};\n"
15088 "void main(){\n"
15089 " gl_Position = vec4(1);\n"
15090 "}\n";
15091 char const *fsSource =
15092 "#version 450\n"
15093 "\n"
15094 "void main(){\n"
15095 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015096
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015097 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15098 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015099
15100 VkPipelineObj pipe(m_device);
15101 pipe.AddShader(&vs);
15102 pipe.AddShader(&fs);
15103
Chia-I Wu08accc62015-07-07 11:50:03 +080015104 /* set up CB 0, not written */
15105 pipe.AddColorAttachment();
15106 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015107
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015108 VkDescriptorSetObj descriptorSet(m_device);
15109 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015110 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015111
Tony Barbour5781e8f2015-08-04 16:23:11 -060015112 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015113
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015114 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015115}
15116
Karl Schultz6addd812016-02-02 17:17:23 -070015117TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015118 TEST_DESCRIPTION(
15119 "Test that a warning is produced for a fragment shader which provides a spurious "
15120 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015122 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015123
Tony Barbour1fa09702017-03-16 12:09:08 -060015124 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015125
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015126 char const *vsSource =
15127 "#version 450\n"
15128 "\n"
15129 "out gl_PerVertex {\n"
15130 " vec4 gl_Position;\n"
15131 "};\n"
15132 "void main(){\n"
15133 " gl_Position = vec4(1);\n"
15134 "}\n";
15135 char const *fsSource =
15136 "#version 450\n"
15137 "\n"
15138 "layout(location=0) out vec4 x;\n"
15139 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15140 "void main(){\n"
15141 " x = vec4(1);\n"
15142 " y = vec4(1);\n"
15143 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015144
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015145 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15146 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015147
15148 VkPipelineObj pipe(m_device);
15149 pipe.AddShader(&vs);
15150 pipe.AddShader(&fs);
15151
Chia-I Wu08accc62015-07-07 11:50:03 +080015152 /* set up CB 0, not written */
15153 pipe.AddColorAttachment();
15154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015155 /* FS writes CB 1, but we don't configure it */
15156
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015157 VkDescriptorSetObj descriptorSet(m_device);
15158 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015159 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015160
Tony Barbour5781e8f2015-08-04 16:23:11 -060015161 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015162
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015163 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015164}
15165
Karl Schultz6addd812016-02-02 17:17:23 -070015166TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015167 TEST_DESCRIPTION(
15168 "Test that an error is produced for a mismatch between the fundamental "
15169 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015171
Tony Barbour1fa09702017-03-16 12:09:08 -060015172 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015173
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015174 char const *vsSource =
15175 "#version 450\n"
15176 "\n"
15177 "out gl_PerVertex {\n"
15178 " vec4 gl_Position;\n"
15179 "};\n"
15180 "void main(){\n"
15181 " gl_Position = vec4(1);\n"
15182 "}\n";
15183 char const *fsSource =
15184 "#version 450\n"
15185 "\n"
15186 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15187 "void main(){\n"
15188 " x = ivec4(1);\n"
15189 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015190
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015191 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15192 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015193
15194 VkPipelineObj pipe(m_device);
15195 pipe.AddShader(&vs);
15196 pipe.AddShader(&fs);
15197
Chia-I Wu08accc62015-07-07 11:50:03 +080015198 /* set up CB 0; type is UNORM by default */
15199 pipe.AddColorAttachment();
15200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015201
Chris Forbesa36d69e2015-05-25 11:13:44 +120015202 VkDescriptorSetObj descriptorSet(m_device);
15203 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015204 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015205
Tony Barbour5781e8f2015-08-04 16:23:11 -060015206 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015207
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015208 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015209}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015210
Karl Schultz6addd812016-02-02 17:17:23 -070015211TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015212 TEST_DESCRIPTION(
15213 "Test that an error is produced for a shader consuming a uniform "
15214 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015216
Tony Barbour1fa09702017-03-16 12:09:08 -060015217 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015218
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015219 char const *vsSource =
15220 "#version 450\n"
15221 "\n"
15222 "out gl_PerVertex {\n"
15223 " vec4 gl_Position;\n"
15224 "};\n"
15225 "void main(){\n"
15226 " gl_Position = vec4(1);\n"
15227 "}\n";
15228 char const *fsSource =
15229 "#version 450\n"
15230 "\n"
15231 "layout(location=0) out vec4 x;\n"
15232 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15233 "void main(){\n"
15234 " x = vec4(bar.y);\n"
15235 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015236
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015237 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15238 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015239
Chris Forbes556c76c2015-08-14 12:04:59 +120015240 VkPipelineObj pipe(m_device);
15241 pipe.AddShader(&vs);
15242 pipe.AddShader(&fs);
15243
15244 /* set up CB 0; type is UNORM by default */
15245 pipe.AddColorAttachment();
15246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15247
15248 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015249 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015250
15251 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15252
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015253 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015254}
15255
Chris Forbes5c59e902016-02-26 16:56:09 +130015256TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015257 TEST_DESCRIPTION(
15258 "Test that an error is produced for a shader consuming push constants "
15259 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015261
Tony Barbour1fa09702017-03-16 12:09:08 -060015262 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015263
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015264 char const *vsSource =
15265 "#version 450\n"
15266 "\n"
15267 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15268 "out gl_PerVertex {\n"
15269 " vec4 gl_Position;\n"
15270 "};\n"
15271 "void main(){\n"
15272 " gl_Position = vec4(consts.x);\n"
15273 "}\n";
15274 char const *fsSource =
15275 "#version 450\n"
15276 "\n"
15277 "layout(location=0) out vec4 x;\n"
15278 "void main(){\n"
15279 " x = vec4(1);\n"
15280 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015281
15282 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15283 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15284
15285 VkPipelineObj pipe(m_device);
15286 pipe.AddShader(&vs);
15287 pipe.AddShader(&fs);
15288
15289 /* set up CB 0; type is UNORM by default */
15290 pipe.AddColorAttachment();
15291 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15292
15293 VkDescriptorSetObj descriptorSet(m_device);
15294 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15295
15296 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15297
15298 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015299 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015300}
15301
Chris Forbes3fb17902016-08-22 14:57:55 +120015302TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015303 TEST_DESCRIPTION(
15304 "Test that an error is produced for a shader consuming an input attachment "
15305 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15307 "consumes input attachment index 0 but not provided in subpass");
15308
Tony Barbour1fa09702017-03-16 12:09:08 -060015309 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015311 char const *vsSource =
15312 "#version 450\n"
15313 "\n"
15314 "out gl_PerVertex {\n"
15315 " vec4 gl_Position;\n"
15316 "};\n"
15317 "void main(){\n"
15318 " gl_Position = vec4(1);\n"
15319 "}\n";
15320 char const *fsSource =
15321 "#version 450\n"
15322 "\n"
15323 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15324 "layout(location=0) out vec4 color;\n"
15325 "void main() {\n"
15326 " color = subpassLoad(x);\n"
15327 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015328
15329 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15330 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15331
15332 VkPipelineObj pipe(m_device);
15333 pipe.AddShader(&vs);
15334 pipe.AddShader(&fs);
15335 pipe.AddColorAttachment();
15336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015338 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15339 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015340 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015341 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015342 ASSERT_VK_SUCCESS(err);
15343
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015344 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015345 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015346 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015347 ASSERT_VK_SUCCESS(err);
15348
15349 // error here.
15350 pipe.CreateVKPipeline(pl, renderPass());
15351
15352 m_errorMonitor->VerifyFound();
15353
15354 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15355 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15356}
15357
Chris Forbes5a9a0472016-08-22 16:02:09 +120015358TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015359 TEST_DESCRIPTION(
15360 "Test that an error is produced for a shader consuming an input attachment "
15361 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15363 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15364
Tony Barbour1fa09702017-03-16 12:09:08 -060015365 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015366
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015367 char const *vsSource =
15368 "#version 450\n"
15369 "\n"
15370 "out gl_PerVertex {\n"
15371 " vec4 gl_Position;\n"
15372 "};\n"
15373 "void main(){\n"
15374 " gl_Position = vec4(1);\n"
15375 "}\n";
15376 char const *fsSource =
15377 "#version 450\n"
15378 "\n"
15379 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15380 "layout(location=0) out vec4 color;\n"
15381 "void main() {\n"
15382 " color = subpassLoad(x);\n"
15383 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015384
15385 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15386 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15387
15388 VkPipelineObj pipe(m_device);
15389 pipe.AddShader(&vs);
15390 pipe.AddShader(&fs);
15391 pipe.AddColorAttachment();
15392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15393
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015394 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15395 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015396 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015397 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015398 ASSERT_VK_SUCCESS(err);
15399
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015400 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015401 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015402 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015403 ASSERT_VK_SUCCESS(err);
15404
15405 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015406 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15407 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15408 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15409 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15410 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Chris Forbes5a9a0472016-08-22 16:02:09 +120015411 };
15412 VkAttachmentReference color = {
15413 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15414 };
15415 VkAttachmentReference input = {
15416 1, VK_IMAGE_LAYOUT_GENERAL,
15417 };
15418
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015419 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015420
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015421 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015422 VkRenderPass rp;
15423 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15424 ASSERT_VK_SUCCESS(err);
15425
15426 // error here.
15427 pipe.CreateVKPipeline(pl, rp);
15428
15429 m_errorMonitor->VerifyFound();
15430
15431 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15432 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15433 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15434}
15435
Chris Forbes541f7b02016-08-22 15:30:27 +120015436TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015437 TEST_DESCRIPTION(
15438 "Test that an error is produced for a shader consuming an input attachment "
15439 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015441 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015442
Tony Barbour1fa09702017-03-16 12:09:08 -060015443 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015444
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015445 char const *vsSource =
15446 "#version 450\n"
15447 "\n"
15448 "out gl_PerVertex {\n"
15449 " vec4 gl_Position;\n"
15450 "};\n"
15451 "void main(){\n"
15452 " gl_Position = vec4(1);\n"
15453 "}\n";
15454 char const *fsSource =
15455 "#version 450\n"
15456 "\n"
15457 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15458 "layout(location=0) out vec4 color;\n"
15459 "void main() {\n"
15460 " color = subpassLoad(xs[0]);\n"
15461 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015462
15463 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15464 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15465
15466 VkPipelineObj pipe(m_device);
15467 pipe.AddShader(&vs);
15468 pipe.AddShader(&fs);
15469 pipe.AddColorAttachment();
15470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15471
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015472 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15473 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015474 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015475 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015476 ASSERT_VK_SUCCESS(err);
15477
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015478 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015479 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015480 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015481 ASSERT_VK_SUCCESS(err);
15482
15483 // error here.
15484 pipe.CreateVKPipeline(pl, renderPass());
15485
15486 m_errorMonitor->VerifyFound();
15487
15488 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15489 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15490}
15491
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015492TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015493 TEST_DESCRIPTION(
15494 "Test that an error is produced for a compute pipeline consuming a "
15495 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015497
Tony Barbour1fa09702017-03-16 12:09:08 -060015498 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015499
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015500 char const *csSource =
15501 "#version 450\n"
15502 "\n"
15503 "layout(local_size_x=1) in;\n"
15504 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15505 "void main(){\n"
15506 " x = vec4(1);\n"
15507 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015508
15509 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15510
15511 VkDescriptorSetObj descriptorSet(m_device);
15512 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15513
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015514 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15515 nullptr,
15516 0,
15517 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15518 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15519 descriptorSet.GetPipelineLayout(),
15520 VK_NULL_HANDLE,
15521 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015522
15523 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015524 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015525
15526 m_errorMonitor->VerifyFound();
15527
15528 if (err == VK_SUCCESS) {
15529 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15530 }
15531}
15532
Chris Forbes22a9b092016-07-19 14:34:05 +120015533TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015534 TEST_DESCRIPTION(
15535 "Test that an error is produced for a pipeline consuming a "
15536 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15538 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015539
Tony Barbour1fa09702017-03-16 12:09:08 -060015540 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015542 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15543 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015544 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015545 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015546 ASSERT_VK_SUCCESS(err);
15547
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015548 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015549 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015550 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015551 ASSERT_VK_SUCCESS(err);
15552
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015553 char const *csSource =
15554 "#version 450\n"
15555 "\n"
15556 "layout(local_size_x=1) in;\n"
15557 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15558 "void main() {\n"
15559 " x.x = 1.0f;\n"
15560 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015561 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15562
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015563 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15564 nullptr,
15565 0,
15566 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15567 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15568 pl,
15569 VK_NULL_HANDLE,
15570 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015571
15572 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015573 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015574
15575 m_errorMonitor->VerifyFound();
15576
15577 if (err == VK_SUCCESS) {
15578 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15579 }
15580
15581 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15582 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15583}
15584
Chris Forbes50020592016-07-27 13:52:41 +120015585TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015586 TEST_DESCRIPTION(
15587 "Test that an error is produced when an image view type "
15588 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015589
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
Chris Forbes50020592016-07-27 13:52:41 +120015591
Tony Barbour1fa09702017-03-16 12:09:08 -060015592 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15594
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015595 char const *vsSource =
15596 "#version 450\n"
15597 "\n"
15598 "out gl_PerVertex { vec4 gl_Position; };\n"
15599 "void main() { gl_Position = vec4(0); }\n";
15600 char const *fsSource =
15601 "#version 450\n"
15602 "\n"
15603 "layout(set=0, binding=0) uniform sampler3D s;\n"
15604 "layout(location=0) out vec4 color;\n"
15605 "void main() {\n"
15606 " color = texture(s, vec3(0));\n"
15607 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015608 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15609 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15610
15611 VkPipelineObj pipe(m_device);
15612 pipe.AddShader(&vs);
15613 pipe.AddShader(&fs);
15614 pipe.AddColorAttachment();
15615
15616 VkTextureObj texture(m_device, nullptr);
15617 VkSamplerObj sampler(m_device);
15618
15619 VkDescriptorSetObj descriptorSet(m_device);
15620 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15621 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15622
15623 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15624 ASSERT_VK_SUCCESS(err);
15625
Tony Barbour552f6c02016-12-21 14:34:07 -070015626 m_commandBuffer->BeginCommandBuffer();
15627 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015628
15629 m_commandBuffer->BindPipeline(pipe);
15630 m_commandBuffer->BindDescriptorSet(descriptorSet);
15631
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015632 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015633 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015634 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015635 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15636
15637 // error produced here.
15638 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15639
15640 m_errorMonitor->VerifyFound();
15641
Tony Barbour552f6c02016-12-21 14:34:07 -070015642 m_commandBuffer->EndRenderPass();
15643 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015644}
15645
Chris Forbes5533bfc2016-07-27 14:12:34 +120015646TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015647 TEST_DESCRIPTION(
15648 "Test that an error is produced when a multisampled images "
15649 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015650
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015652
Tony Barbour1fa09702017-03-16 12:09:08 -060015653 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15655
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015656 char const *vsSource =
15657 "#version 450\n"
15658 "\n"
15659 "out gl_PerVertex { vec4 gl_Position; };\n"
15660 "void main() { gl_Position = vec4(0); }\n";
15661 char const *fsSource =
15662 "#version 450\n"
15663 "\n"
15664 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15665 "layout(location=0) out vec4 color;\n"
15666 "void main() {\n"
15667 " color = texelFetch(s, ivec2(0), 0);\n"
15668 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015669 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15670 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15671
15672 VkPipelineObj pipe(m_device);
15673 pipe.AddShader(&vs);
15674 pipe.AddShader(&fs);
15675 pipe.AddColorAttachment();
15676
15677 VkTextureObj texture(m_device, nullptr);
15678 VkSamplerObj sampler(m_device);
15679
15680 VkDescriptorSetObj descriptorSet(m_device);
15681 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15682 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15683
15684 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15685 ASSERT_VK_SUCCESS(err);
15686
Tony Barbour552f6c02016-12-21 14:34:07 -070015687 m_commandBuffer->BeginCommandBuffer();
15688 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015689
15690 m_commandBuffer->BindPipeline(pipe);
15691 m_commandBuffer->BindDescriptorSet(descriptorSet);
15692
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015693 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015694 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015695 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015696 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15697
15698 // error produced here.
15699 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15700
15701 m_errorMonitor->VerifyFound();
15702
Tony Barbour552f6c02016-12-21 14:34:07 -070015703 m_commandBuffer->EndRenderPass();
15704 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015705}
15706
Mark Youngc48c4c12016-04-11 14:26:49 -060015707TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015708 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015709
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015710 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15711 {
15712 VkFormatProperties properties;
15713 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15714 if (properties.optimalTilingFeatures == 0) {
15715 printf(" Image format not supported; skipped.\n");
15716 return;
15717 }
15718 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015719
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015720 VkImageCreateInfo info = {};
15721 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15722 info.pNext = NULL;
15723 info.imageType = VK_IMAGE_TYPE_2D;
15724 info.format = format;
15725 info.extent.height = 32;
15726 info.extent.depth = 1;
15727 info.mipLevels = 1;
15728 info.arrayLayers = 1;
15729 info.samples = VK_SAMPLE_COUNT_1_BIT;
15730 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15731 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15732 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015733
15734 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015735 {
15736 VkImageFormatProperties properties;
15737 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15738 info.tiling, info.usage, info.flags, &properties);
15739 ASSERT_VK_SUCCESS(result);
15740 info.extent.width = properties.maxExtent.width + 1;
15741 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015742
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015743 VkImage image;
15744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15745 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015746 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015747}
15748
Mark Youngc48c4c12016-04-11 14:26:49 -060015749TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015750 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015751
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015752 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15753 {
15754 VkFormatProperties properties;
15755 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15756 if (properties.optimalTilingFeatures == 0) {
15757 printf(" Image format not supported; skipped.\n");
15758 return;
15759 }
15760 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015761
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015762 VkImageCreateInfo info = {};
15763 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15764 info.pNext = NULL;
15765 info.imageType = VK_IMAGE_TYPE_2D;
15766 info.format = format;
15767 info.extent.height = 32;
15768 info.extent.depth = 1;
15769 info.mipLevels = 1;
15770 info.arrayLayers = 1;
15771 info.samples = VK_SAMPLE_COUNT_1_BIT;
15772 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15773 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15774 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015775
15776 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015777 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015778
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015779 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015781 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15782 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015783 m_errorMonitor->VerifyFound();
15784}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015785
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015786TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015787 TEST_DESCRIPTION(
15788 "Create a render pass with an attachment description "
15789 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015790
Tony Barbour1fa09702017-03-16 12:09:08 -060015791 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015792 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15793
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015795
15796 VkAttachmentReference color_attach = {};
15797 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15798 color_attach.attachment = 0;
15799 VkSubpassDescription subpass = {};
15800 subpass.colorAttachmentCount = 1;
15801 subpass.pColorAttachments = &color_attach;
15802
15803 VkRenderPassCreateInfo rpci = {};
15804 rpci.subpassCount = 1;
15805 rpci.pSubpasses = &subpass;
15806 rpci.attachmentCount = 1;
15807 VkAttachmentDescription attach_desc = {};
15808 attach_desc.format = VK_FORMAT_UNDEFINED;
15809 rpci.pAttachments = &attach_desc;
15810 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15811 VkRenderPass rp;
15812 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15813
15814 m_errorMonitor->VerifyFound();
15815
15816 if (result == VK_SUCCESS) {
15817 vkDestroyRenderPass(m_device->device(), rp, NULL);
15818 }
15819}
15820
Karl Schultz6addd812016-02-02 17:17:23 -070015821TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015822 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015823
Mike Stroyana3082432015-09-25 13:39:21 -060015824 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015825 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15826 const int32_t tex_width = 32;
15827 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015828
15829 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015830 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15831 image_create_info.pNext = NULL;
15832 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15833 image_create_info.format = tex_format;
15834 image_create_info.extent.width = tex_width;
15835 image_create_info.extent.height = tex_height;
15836 image_create_info.extent.depth = 1;
15837 image_create_info.mipLevels = 1;
15838 image_create_info.arrayLayers = 1;
15839 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15840 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15841 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15842 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015843
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015844 VkImage image;
15845 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015846 ASSERT_VK_SUCCESS(err);
15847
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015848 VkMemoryRequirements requirements;
15849 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15850
15851 VkMemoryAllocateInfo alloc_info{};
15852 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15853 alloc_info.pNext = NULL;
15854 alloc_info.memoryTypeIndex = 0;
15855 alloc_info.allocationSize = requirements.size;
15856 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15857 ASSERT_TRUE(pass);
15858
15859 VkDeviceMemory memory;
15860 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15861 ASSERT_VK_SUCCESS(err);
15862
15863 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15864
Tobin Ehliscde08892015-09-22 10:11:37 -060015865 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015866 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015867 image_view_create_info.image = image;
15868 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15869 image_view_create_info.format = tex_format;
15870 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015871 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015872 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015873 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015874
15875 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015877 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015878 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015879
15880 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015881 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015882}
Mike Stroyana3082432015-09-25 13:39:21 -060015883
Mark Youngd339ba32016-05-30 13:28:35 -060015884TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15885 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015887 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015888
Tony Barbour1fa09702017-03-16 12:09:08 -060015889 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015890
15891 // Create an image and try to create a view with no memory backing the image
15892 VkImage image;
15893
15894 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15895 const int32_t tex_width = 32;
15896 const int32_t tex_height = 32;
15897
15898 VkImageCreateInfo image_create_info = {};
15899 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15900 image_create_info.pNext = NULL;
15901 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15902 image_create_info.format = tex_format;
15903 image_create_info.extent.width = tex_width;
15904 image_create_info.extent.height = tex_height;
15905 image_create_info.extent.depth = 1;
15906 image_create_info.mipLevels = 1;
15907 image_create_info.arrayLayers = 1;
15908 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15909 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15910 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15911 image_create_info.flags = 0;
15912
15913 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15914 ASSERT_VK_SUCCESS(err);
15915
15916 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015917 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015918 image_view_create_info.image = image;
15919 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15920 image_view_create_info.format = tex_format;
15921 image_view_create_info.subresourceRange.layerCount = 1;
15922 image_view_create_info.subresourceRange.baseMipLevel = 0;
15923 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015924 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015925
15926 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015927 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015928
15929 m_errorMonitor->VerifyFound();
15930 vkDestroyImage(m_device->device(), image, NULL);
15931 // If last error is success, it still created the view, so delete it.
15932 if (err == VK_SUCCESS) {
15933 vkDestroyImageView(m_device->device(), view, NULL);
15934 }
Mark Youngd339ba32016-05-30 13:28:35 -060015935}
15936
Karl Schultz6addd812016-02-02 17:17:23 -070015937TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015938 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015940
Tony Barbour1fa09702017-03-16 12:09:08 -060015941 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015942
Karl Schultz6addd812016-02-02 17:17:23 -070015943 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015944 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015945 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015946 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015947
15948 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015949 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015950 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015951 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15952 image_view_create_info.format = tex_format;
15953 image_view_create_info.subresourceRange.baseMipLevel = 0;
15954 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015955 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015956 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015957 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015958
15959 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015960 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015961
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015962 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015963}
15964
Mike Weiblena1e13f42017-02-09 21:25:59 -070015965TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15966 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15967
Tony Barbour1fa09702017-03-16 12:09:08 -060015968 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015969 VkSubresourceLayout subres_layout = {};
15970
15971 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15972 {
15973 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15974 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015975 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015976 ASSERT_TRUE(img.initialized());
15977
15978 VkImageSubresource subres = {};
15979 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15980 subres.mipLevel = 0;
15981 subres.arrayLayer = 0;
15982
15983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15984 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15985 m_errorMonitor->VerifyFound();
15986 }
15987
15988 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15989 {
15990 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015991 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015992 ASSERT_TRUE(img.initialized());
15993
15994 VkImageSubresource subres = {};
15995 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15996 subres.mipLevel = 0;
15997 subres.arrayLayer = 0;
15998
15999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16001 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16002 m_errorMonitor->VerifyFound();
16003 }
16004
16005 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16006 {
16007 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016008 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016009 ASSERT_TRUE(img.initialized());
16010
16011 VkImageSubresource subres = {};
16012 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16013 subres.mipLevel = 1; // ERROR: triggers VU 00739
16014 subres.arrayLayer = 0;
16015
16016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16017 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16018 m_errorMonitor->VerifyFound();
16019 }
16020
16021 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16022 {
16023 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016024 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016025 ASSERT_TRUE(img.initialized());
16026
16027 VkImageSubresource subres = {};
16028 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16029 subres.mipLevel = 0;
16030 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16031
16032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16033 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16034 m_errorMonitor->VerifyFound();
16035 }
16036}
16037
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016038TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016039 VkResult err;
16040 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016041
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016043
Tony Barbour1fa09702017-03-16 12:09:08 -060016044 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016045
16046 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016047 VkImage srcImage;
16048 VkImage dstImage;
16049 VkDeviceMemory srcMem;
16050 VkDeviceMemory destMem;
16051 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016052
16053 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016054 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16055 image_create_info.pNext = NULL;
16056 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16057 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16058 image_create_info.extent.width = 32;
16059 image_create_info.extent.height = 32;
16060 image_create_info.extent.depth = 1;
16061 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016062 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016063 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16064 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16065 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16066 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016067
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016068 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016069 ASSERT_VK_SUCCESS(err);
16070
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016071 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016072 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016073 ASSERT_VK_SUCCESS(err);
16074
16075 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016076 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016077 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16078 memAlloc.pNext = NULL;
16079 memAlloc.allocationSize = 0;
16080 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016081
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016082 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016083 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016084 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016085 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016086 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016087 ASSERT_VK_SUCCESS(err);
16088
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016089 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016090 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016091 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016092 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016093 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016094 ASSERT_VK_SUCCESS(err);
16095
16096 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16097 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016098 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016099 ASSERT_VK_SUCCESS(err);
16100
Tony Barbour552f6c02016-12-21 14:34:07 -070016101 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016102 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016103 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016104 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016105 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016106 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016107 copyRegion.srcOffset.x = 0;
16108 copyRegion.srcOffset.y = 0;
16109 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016110 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016111 copyRegion.dstSubresource.mipLevel = 0;
16112 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016113 // Introduce failure by forcing the dst layerCount to differ from src
16114 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016115 copyRegion.dstOffset.x = 0;
16116 copyRegion.dstOffset.y = 0;
16117 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016118 copyRegion.extent.width = 1;
16119 copyRegion.extent.height = 1;
16120 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016121 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016122 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016123
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016124 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016125
Chia-I Wuf7458c52015-10-26 21:10:41 +080016126 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016127 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016128 vkFreeMemory(m_device->device(), srcMem, NULL);
16129 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016130}
16131
Tony Barbourd6673642016-05-05 14:46:39 -060016132TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016133 TEST_DESCRIPTION("Creating images with unsuported formats ");
16134
Tony Barbour1fa09702017-03-16 12:09:08 -060016135 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016137
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016138 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016139 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016140 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016141 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16142 image_create_info.format = VK_FORMAT_UNDEFINED;
16143 image_create_info.extent.width = 32;
16144 image_create_info.extent.height = 32;
16145 image_create_info.extent.depth = 1;
16146 image_create_info.mipLevels = 1;
16147 image_create_info.arrayLayers = 1;
16148 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16149 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16150 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16153 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016154
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016155 VkImage image;
16156 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016157 m_errorMonitor->VerifyFound();
16158
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016159 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016160 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016161 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16162 VkFormat format = static_cast<VkFormat>(f);
16163 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016164 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016165 unsupported = format;
16166 break;
16167 }
16168 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016169
Tony Barbourd6673642016-05-05 14:46:39 -060016170 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016171 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016173
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016174 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016175 m_errorMonitor->VerifyFound();
16176 }
16177}
16178
16179TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016180 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16181
Tony Barbour1fa09702017-03-16 12:09:08 -060016182 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016183 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016184 if (!depth_format) {
16185 return;
16186 }
Tony Barbourd6673642016-05-05 14:46:39 -060016187
16188 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016189 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060016190 VK_IMAGE_TILING_OPTIMAL, 0);
16191 ASSERT_TRUE(image.initialized());
16192
16193 VkImageView imgView;
16194 VkImageViewCreateInfo imgViewInfo = {};
16195 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16196 imgViewInfo.image = image.handle();
16197 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16198 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16199 imgViewInfo.subresourceRange.layerCount = 1;
16200 imgViewInfo.subresourceRange.baseMipLevel = 0;
16201 imgViewInfo.subresourceRange.levelCount = 1;
16202 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16203
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016204 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016205 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016207 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16208 m_errorMonitor->VerifyFound();
16209 imgViewInfo.subresourceRange.baseMipLevel = 0;
16210
Tony Barbourd6673642016-05-05 14:46:39 -060016211 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16212 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016214 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16215 m_errorMonitor->VerifyFound();
16216 imgViewInfo.subresourceRange.levelCount = 1;
16217
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016218 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16219 imgViewInfo.subresourceRange.levelCount = 2;
16220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16221 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16222 m_errorMonitor->VerifyFound();
16223 imgViewInfo.subresourceRange.levelCount = 1;
16224
16225 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16226 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16228 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16229 m_errorMonitor->VerifyFound();
16230 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16231
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016232 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16233 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016234 m_errorMonitor->SetDesiredFailureMsg(
16235 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16236 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016237 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16238 m_errorMonitor->VerifyFound();
16239 imgViewInfo.subresourceRange.layerCount = 1;
16240
Tony Barbourd6673642016-05-05 14:46:39 -060016241 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016242 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016243 m_errorMonitor->SetDesiredFailureMsg(
16244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16245 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016246 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16247 m_errorMonitor->VerifyFound();
16248 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16249
Tony Barbourd6673642016-05-05 14:46:39 -060016250 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16251 // VIEW_CREATE_ERROR
16252 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016254 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16255 m_errorMonitor->VerifyFound();
16256 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16257
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016258 // TODO: Update framework to easily passing mutable flag into ImageObj init
16259 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016260 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16261 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16262 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016263 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16264 // VIEW_CREATE_ERROR
16265 VkImageCreateInfo mutImgInfo = image.create_info();
16266 VkImage mutImage;
16267 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016268 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016269 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16270 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016271 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016272 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016273
16274 VkMemoryRequirements requirements;
16275 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16276
16277 VkMemoryAllocateInfo alloc_info{};
16278 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16279 alloc_info.pNext = NULL;
16280 alloc_info.memoryTypeIndex = 0;
16281 alloc_info.allocationSize = requirements.size;
16282 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16283 ASSERT_TRUE(pass);
16284
16285 VkDeviceMemory memory;
16286 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16287 ASSERT_VK_SUCCESS(ret);
16288
16289 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16290 ASSERT_VK_SUCCESS(ret);
16291
Tony Barbourd6673642016-05-05 14:46:39 -060016292 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016294 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16295 m_errorMonitor->VerifyFound();
16296 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016297
16298 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016299 vkDestroyImage(m_device->handle(), mutImage, NULL);
16300}
16301
Dave Houlton75967fc2017-03-06 17:21:16 -070016302TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16303 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16304
Tony Barbour1fa09702017-03-16 12:09:08 -060016305 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016306
Jamie Madill35127872017-03-15 16:17:46 -040016307 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016308 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16309 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16310 if (device_features.textureCompressionBC) {
16311 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16312 } else if (device_features.textureCompressionETC2) {
16313 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16314 } else if (device_features.textureCompressionASTC_LDR) {
16315 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16316 } else {
16317 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16318 return;
16319 }
16320
16321 VkImageCreateInfo ci;
16322 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16323 ci.pNext = NULL;
16324 ci.flags = 0;
16325 ci.imageType = VK_IMAGE_TYPE_2D;
16326 ci.format = compressed_format;
16327 ci.extent = {32, 32, 1};
16328 ci.mipLevels = 6;
16329 ci.arrayLayers = 1;
16330 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16331 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16332 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16333 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16334 ci.queueFamilyIndexCount = 0;
16335 ci.pQueueFamilyIndices = NULL;
16336 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16337
16338 VkImageObj image(m_device);
16339 image.init(&ci);
16340 ASSERT_TRUE(image.initialized());
16341
16342 VkImageObj odd_image(m_device);
16343 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16344 odd_image.init(&ci);
16345 ASSERT_TRUE(odd_image.initialized());
16346
16347 // Allocate buffers
16348 VkMemoryPropertyFlags reqs = 0;
16349 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16350 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16351 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16352 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16353 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16354
16355 VkBufferImageCopy region = {};
16356 region.bufferRowLength = 0;
16357 region.bufferImageHeight = 0;
16358 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16359 region.imageSubresource.layerCount = 1;
16360 region.imageOffset = {0, 0, 0};
16361 region.bufferOffset = 0;
16362
16363 // start recording
16364 m_commandBuffer->BeginCommandBuffer();
16365
16366 // Mip level copies that work - 5 levels
16367 m_errorMonitor->ExpectSuccess();
16368
16369 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16370 region.imageExtent = {32, 32, 1};
16371 region.imageSubresource.mipLevel = 0;
16372 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16373 &region);
16374 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16375 &region);
16376
16377 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16378 region.imageExtent = {8, 8, 1};
16379 region.imageSubresource.mipLevel = 2;
16380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16381 &region);
16382 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16383 &region);
16384
16385 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16386 region.imageExtent = {4, 4, 1};
16387 region.imageSubresource.mipLevel = 3;
16388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16389 &region);
16390 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16391 &region);
16392
16393 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16394 region.imageExtent = {2, 2, 1};
16395 region.imageSubresource.mipLevel = 4;
16396 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16397 &region);
16398 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16399 &region);
16400
16401 region.imageExtent = {1, 1, 1};
16402 region.imageSubresource.mipLevel = 5;
16403 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16404 &region);
16405 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16406 &region);
16407 m_errorMonitor->VerifyNotFound();
16408
16409 // Buffer must accomodate a full compressed block, regardless of texel count
16410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16411 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16412 &region);
16413 m_errorMonitor->VerifyFound();
16414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16415 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16416 &region);
16417 m_errorMonitor->VerifyFound();
16418
16419 // Copy width < compressed block size, but not the full mip width
16420 region.imageExtent = {1, 2, 1};
16421 region.imageSubresource.mipLevel = 4;
16422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16423 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16424 &region);
16425 m_errorMonitor->VerifyFound();
16426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16427 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16428 &region);
16429 m_errorMonitor->VerifyFound();
16430
16431 // Copy height < compressed block size but not the full mip height
16432 region.imageExtent = {2, 1, 1};
16433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16434 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16435 &region);
16436 m_errorMonitor->VerifyFound();
16437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16438 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16439 &region);
16440 m_errorMonitor->VerifyFound();
16441
16442 // Offsets must be multiple of compressed block size
16443 region.imageOffset = {1, 1, 0};
16444 region.imageExtent = {1, 1, 1};
16445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16446 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16447 &region);
16448 m_errorMonitor->VerifyFound();
16449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16450 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16451 &region);
16452 m_errorMonitor->VerifyFound();
16453
16454 // Offset + extent width = mip width - should succeed
16455 region.imageOffset = {4, 4, 0};
16456 region.imageExtent = {3, 4, 1};
16457 region.imageSubresource.mipLevel = 2;
16458 m_errorMonitor->ExpectSuccess();
16459 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16460 &region);
16461 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16462 &region);
16463 m_errorMonitor->VerifyNotFound();
16464
16465 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16466 region.imageExtent = {4, 4, 1};
16467 m_errorMonitor->ExpectSuccess();
16468 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16469 &region);
16470 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16471 &region);
16472 m_errorMonitor->VerifyNotFound();
16473
16474 // Offset + extent width < mip width and not a multiple of block width - should fail
16475 region.imageExtent = {3, 3, 1};
16476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16477 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16478 &region);
16479 m_errorMonitor->VerifyFound();
16480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16481 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16482 &region);
16483 m_errorMonitor->VerifyFound();
16484}
16485
Dave Houlton59a20702017-02-02 17:26:23 -070016486TEST_F(VkLayerTest, ImageBufferCopyTests) {
16487 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16488
Tony Barbour1fa09702017-03-16 12:09:08 -060016489 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016490 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16491 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16492 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16493 return;
16494 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016495
16496 // Bail if any dimension of transfer granularity is 0.
16497 auto index = m_device->graphics_queue_node_index_;
16498 auto queue_family_properties = m_device->phy().queue_properties();
16499 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16500 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16501 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16502 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16503 return;
16504 }
16505
Dave Houlton59a20702017-02-02 17:26:23 -070016506 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16507 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16508 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016509 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16510 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16511 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16512 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16513
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016514 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016515 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16516 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016517 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016518 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16519 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016520 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Dave Houlton59a20702017-02-02 17:26:23 -070016521 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016522 ASSERT_TRUE(image_64k.initialized());
16523 ASSERT_TRUE(image_16k.initialized());
16524 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016525
Dave Houltonf3229d52017-02-21 15:59:08 -070016526 // Verify all needed Depth/Stencil formats are supported
16527 bool missing_ds_support = false;
16528 VkFormatProperties props = {0, 0, 0};
16529 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16530 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16531 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16532 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16533 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16534 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16535 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16536 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16537
16538 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016539 ds_image_4D_1S.Init(
16540 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016541 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16542 VK_IMAGE_TILING_OPTIMAL, 0);
16543 ASSERT_TRUE(ds_image_4D_1S.initialized());
16544
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016545 ds_image_3D_1S.Init(
16546 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016547 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16548 VK_IMAGE_TILING_OPTIMAL, 0);
16549 ASSERT_TRUE(ds_image_3D_1S.initialized());
16550
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016551 ds_image_2D.Init(256, 256, 1, VK_FORMAT_D16_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
16552 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16553 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016554 ASSERT_TRUE(ds_image_2D.initialized());
16555
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016556 ds_image_1S.Init(256, 256, 1, VK_FORMAT_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
16557 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16558 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016559 ASSERT_TRUE(ds_image_1S.initialized());
16560 }
16561
16562 // Allocate buffers
16563 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016564 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016565 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16566 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16567 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16568 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016569
16570 VkBufferImageCopy region = {};
16571 region.bufferRowLength = 0;
16572 region.bufferImageHeight = 0;
16573 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16574 region.imageSubresource.layerCount = 1;
16575 region.imageOffset = {0, 0, 0};
16576 region.imageExtent = {64, 64, 1};
16577 region.bufferOffset = 0;
16578
16579 // attempt copies before putting command buffer in recording state
16580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16581 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16582 &region);
16583 m_errorMonitor->VerifyFound();
16584
16585 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16586 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16587 &region);
16588 m_errorMonitor->VerifyFound();
16589
16590 // start recording
16591 m_commandBuffer->BeginCommandBuffer();
16592
16593 // successful copies
16594 m_errorMonitor->ExpectSuccess();
16595 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16596 &region);
16597 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16598 &region);
16599 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16600 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16601 &region);
16602 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16603 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16604 &region);
16605 region.imageOffset.x = 0;
16606 region.imageExtent.height = 64;
16607 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16608 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16609 &region);
16610 m_errorMonitor->VerifyNotFound();
16611
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016612 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016613 region.imageExtent = {65, 64, 1};
16614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16615 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16616 &region);
16617 m_errorMonitor->VerifyFound();
16618
16619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16620 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16621 &region);
16622 m_errorMonitor->VerifyFound();
16623
16624 // image/buffer too small (offset) on copy to image
16625 region.imageExtent = {64, 64, 1};
16626 region.imageOffset = {0, 4, 0};
16627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16628 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16629 &region);
16630 m_errorMonitor->VerifyFound();
16631
16632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16633 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16634 &region);
16635 m_errorMonitor->VerifyFound();
16636
16637 // image/buffer too small on copy to buffer
16638 region.imageExtent = {64, 64, 1};
16639 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016640 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16642 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16643 &region);
16644 m_errorMonitor->VerifyFound();
16645
16646 region.imageExtent = {64, 65, 1};
16647 region.bufferOffset = 0;
16648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16649 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16650 &region);
16651 m_errorMonitor->VerifyFound();
16652
16653 // buffer size ok but rowlength causes loose packing
16654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16655 region.imageExtent = {64, 64, 1};
16656 region.bufferRowLength = 68;
16657 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16658 &region);
16659 m_errorMonitor->VerifyFound();
16660
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016661 // An extent with zero area should produce a warning, but no error
16662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16663 region.imageExtent.width = 0;
16664 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16665 &region);
16666 m_errorMonitor->VerifyFound();
16667
Dave Houlton59a20702017-02-02 17:26:23 -070016668 // aspect bits
16669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16670 region.imageExtent = {64, 64, 1};
16671 region.bufferRowLength = 0;
16672 region.bufferImageHeight = 0;
16673 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16674 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16675 buffer_16k.handle(), 1, &region);
16676 m_errorMonitor->VerifyFound();
16677
16678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16679 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16680 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16681 &region);
16682 m_errorMonitor->VerifyFound();
16683
16684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16685 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_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
Dave Houltonf3229d52017-02-21 15:59:08 -070016690 // Test Depth/Stencil copies
16691 if (missing_ds_support) {
16692 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16693 } else {
16694 VkBufferImageCopy ds_region = {};
16695 ds_region.bufferOffset = 0;
16696 ds_region.bufferRowLength = 0;
16697 ds_region.bufferImageHeight = 0;
16698 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16699 ds_region.imageSubresource.mipLevel = 0;
16700 ds_region.imageSubresource.baseArrayLayer = 0;
16701 ds_region.imageSubresource.layerCount = 1;
16702 ds_region.imageOffset = {0, 0, 0};
16703 ds_region.imageExtent = {256, 256, 1};
16704
16705 // Depth copies that should succeed
16706 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16707 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16708 buffer_256k.handle(), 1, &ds_region);
16709 m_errorMonitor->VerifyNotFound();
16710
16711 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16712 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16713 buffer_256k.handle(), 1, &ds_region);
16714 m_errorMonitor->VerifyNotFound();
16715
16716 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16717 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16718 buffer_128k.handle(), 1, &ds_region);
16719 m_errorMonitor->VerifyNotFound();
16720
16721 // Depth copies that should fail
16722 ds_region.bufferOffset = 4;
16723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16724 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16725 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16726 buffer_256k.handle(), 1, &ds_region);
16727 m_errorMonitor->VerifyFound();
16728
16729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16730 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16731 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16732 buffer_256k.handle(), 1, &ds_region);
16733 m_errorMonitor->VerifyFound();
16734
16735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16736 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16737 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16738 buffer_128k.handle(), 1, &ds_region);
16739 m_errorMonitor->VerifyFound();
16740
16741 // Stencil copies that should succeed
16742 ds_region.bufferOffset = 0;
16743 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16744 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16745 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16746 buffer_64k.handle(), 1, &ds_region);
16747 m_errorMonitor->VerifyNotFound();
16748
16749 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16750 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16751 buffer_64k.handle(), 1, &ds_region);
16752 m_errorMonitor->VerifyNotFound();
16753
16754 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16755 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16756 buffer_64k.handle(), 1, &ds_region);
16757 m_errorMonitor->VerifyNotFound();
16758
16759 // Stencil copies that should fail
16760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16761 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16762 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16763 buffer_16k.handle(), 1, &ds_region);
16764 m_errorMonitor->VerifyFound();
16765
16766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16767 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16768 ds_region.bufferRowLength = 260;
16769 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16770 buffer_64k.handle(), 1, &ds_region);
16771 m_errorMonitor->VerifyFound();
16772
16773 ds_region.bufferRowLength = 0;
16774 ds_region.bufferOffset = 4;
16775 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16776 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16777 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16778 buffer_64k.handle(), 1, &ds_region);
16779 m_errorMonitor->VerifyFound();
16780 }
16781
Dave Houlton584d51e2017-02-16 12:52:54 -070016782 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016783 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016784 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016785 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16786 device_features.textureCompressionASTC_LDR)) {
16787 printf(" No compressed formats supported - block compression tests skipped.\n");
16788 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016789 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16790 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016791 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016792 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16793 0);
16794 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 -070016795 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016796 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016797 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 -070016798 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016799 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 -070016800 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016801 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016802 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 -070016803 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016804 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 -070016805 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016806 }
16807 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016808
Dave Houlton584d51e2017-02-16 12:52:54 -070016809 // Just fits
16810 m_errorMonitor->ExpectSuccess();
16811 region.imageExtent = {128, 128, 1};
16812 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16813 buffer_16k.handle(), 1, &region);
16814 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016815
Dave Houlton584d51e2017-02-16 12:52:54 -070016816 // with offset, too big for buffer
16817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16818 region.bufferOffset = 16;
16819 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16820 buffer_16k.handle(), 1, &region);
16821 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016822 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016823
Dave Houlton67e9b532017-03-02 17:00:10 -070016824 // extents that are not a multiple of compressed block size
16825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16826 region.imageExtent.width = 66;
16827 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16828 buffer_16k.handle(), 1, &region);
16829 m_errorMonitor->VerifyFound();
16830 region.imageExtent.width = 128;
16831
16832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016833 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016834 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16835 buffer_16k.handle(), 1, &region);
16836 m_errorMonitor->VerifyFound();
16837 region.imageExtent.height = 128;
16838
16839 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16840
16841 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16842 m_errorMonitor->ExpectSuccess();
16843 region.imageExtent.width = 66;
16844 region.imageOffset.x = 64;
16845 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16846 buffer_16k.handle(), 1, &region);
16847 region.imageExtent.width = 16;
16848 region.imageOffset.x = 0;
16849 region.imageExtent.height = 2;
16850 region.imageOffset.y = 128;
16851 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016852 buffer_16k.handle(), 1, &region);
16853 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016854 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016855
Dave Houlton584d51e2017-02-16 12:52:54 -070016856 // buffer offset must be a multiple of texel block size (16)
16857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16859 region.imageExtent = {64, 64, 1};
16860 region.bufferOffset = 24;
16861 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16862 buffer_16k.handle(), 1, &region);
16863 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016864
Dave Houlton584d51e2017-02-16 12:52:54 -070016865 // rowlength not a multiple of block width (4)
16866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16867 region.bufferOffset = 0;
16868 region.bufferRowLength = 130;
16869 region.bufferImageHeight = 0;
16870 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16871 buffer_64k.handle(), 1, &region);
16872 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016873
Dave Houlton584d51e2017-02-16 12:52:54 -070016874 // imageheight not a multiple of block height (4)
16875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16876 region.bufferRowLength = 0;
16877 region.bufferImageHeight = 130;
16878 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16879 buffer_64k.handle(), 1, &region);
16880 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016881 }
Dave Houlton59a20702017-02-02 17:26:23 -070016882}
16883
Tony Barbourd6673642016-05-05 14:46:39 -060016884TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016885 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016886
Tony Barbour1fa09702017-03-16 12:09:08 -060016887 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016888
Rene Lindsay135204f2016-12-22 17:11:09 -070016889 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016890 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016891 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 -070016892 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016893 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016894 vk_testing::Buffer buffer;
16895 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016896 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016897 VkBufferImageCopy region = {};
16898 region.bufferRowLength = 128;
16899 region.bufferImageHeight = 128;
16900 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16901 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016902 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016903 region.imageExtent.height = 4;
16904 region.imageExtent.width = 4;
16905 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016906
16907 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016908 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 -070016909 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016910 ASSERT_TRUE(image2.initialized());
16911 vk_testing::Buffer buffer2;
16912 VkMemoryPropertyFlags reqs2 = 0;
16913 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16914 VkBufferImageCopy region2 = {};
16915 region2.bufferRowLength = 128;
16916 region2.bufferImageHeight = 128;
16917 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16918 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16919 region2.imageSubresource.layerCount = 1;
16920 region2.imageExtent.height = 4;
16921 region2.imageExtent.width = 4;
16922 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016923 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016924
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016925 // Image must have offset.z of 0 and extent.depth of 1
16926 // Introduce failure by setting imageExtent.depth to 0
16927 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016929 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016930 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016931 m_errorMonitor->VerifyFound();
16932
16933 region.imageExtent.depth = 1;
16934
16935 // Image must have offset.z of 0 and extent.depth of 1
16936 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016937 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016938 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
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.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016946 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16947 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016948 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016950 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16951 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016952 m_errorMonitor->VerifyFound();
16953
16954 // BufferOffset must be a multiple of 4
16955 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016956 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016958 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16959 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016960 m_errorMonitor->VerifyFound();
16961
16962 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16963 region.bufferOffset = 0;
16964 region.imageExtent.height = 128;
16965 region.imageExtent.width = 128;
16966 // Introduce failure by setting bufferRowLength > 0 but less than width
16967 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016969 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16970 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016971 m_errorMonitor->VerifyFound();
16972
16973 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16974 region.bufferRowLength = 128;
16975 // Introduce failure by setting bufferRowHeight > 0 but less than height
16976 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016978 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16979 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016980 m_errorMonitor->VerifyFound();
16981
16982 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016983 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016984 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 -070016985 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016986 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016987 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 -070016988 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016989 VkImageBlit blitRegion = {};
16990 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16991 blitRegion.srcSubresource.baseArrayLayer = 0;
16992 blitRegion.srcSubresource.layerCount = 1;
16993 blitRegion.srcSubresource.mipLevel = 0;
16994 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16995 blitRegion.dstSubresource.baseArrayLayer = 0;
16996 blitRegion.dstSubresource.layerCount = 1;
16997 blitRegion.dstSubresource.mipLevel = 0;
16998
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016999 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17001 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17003 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017004 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17005 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017006 m_errorMonitor->VerifyFound();
17007
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017009 VkImageMemoryBarrier img_barrier;
17010 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17011 img_barrier.pNext = NULL;
17012 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17013 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17014 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17015 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17016 img_barrier.image = image.handle();
17017 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17018 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17019 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17020 img_barrier.subresourceRange.baseArrayLayer = 0;
17021 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017022 img_barrier.subresourceRange.layerCount = 0;
17023 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017024 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17025 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017026 m_errorMonitor->VerifyFound();
17027 img_barrier.subresourceRange.layerCount = 1;
17028}
17029
17030TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017031 TEST_DESCRIPTION("Exceed the limits of image format ");
17032
Tony Barbour1fa09702017-03-16 12:09:08 -060017033 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017034
17035 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17036 {
17037 VkFormatProperties properties;
17038 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17039 if (properties.linearTilingFeatures == 0) {
17040 printf(" Image format not supported; skipped.\n");
17041 return;
17042 }
17043 }
17044
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017045 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017046 VkImageCreateInfo image_create_info = {};
17047 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17048 image_create_info.pNext = NULL;
17049 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017050 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017051 image_create_info.extent.width = 32;
17052 image_create_info.extent.height = 32;
17053 image_create_info.extent.depth = 1;
17054 image_create_info.mipLevels = 1;
17055 image_create_info.arrayLayers = 1;
17056 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17057 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17058 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17059 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17060 image_create_info.flags = 0;
17061
17062 VkImage nullImg;
17063 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017064 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17065 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017066 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017067 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17068 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17069 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017070 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017071
Tony Barbour0907e362017-03-09 15:05:30 -070017072 uint32_t maxDim =
17073 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17074 // If max mip levels exceeds image extents, skip the max mip levels test
17075 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17077 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17078 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17079 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17080 m_errorMonitor->VerifyFound();
17081 image_create_info.mipLevels = 1;
17082 }
Tony Barbourd6673642016-05-05 14:46:39 -060017083
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017085 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17086 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17087 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17088 m_errorMonitor->VerifyFound();
17089 image_create_info.arrayLayers = 1;
17090
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017092 int samples = imgFmtProps.sampleCounts >> 1;
17093 image_create_info.samples = (VkSampleCountFlagBits)samples;
17094 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17095 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17096 m_errorMonitor->VerifyFound();
17097 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17098
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17100 "pCreateInfo->initialLayout, must be "
17101 "VK_IMAGE_LAYOUT_UNDEFINED or "
17102 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017103 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17104 // Expect INVALID_LAYOUT
17105 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17106 m_errorMonitor->VerifyFound();
17107 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17108}
17109
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017110TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017111 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017113
Tony Barbour1fa09702017-03-16 12:09:08 -060017114 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017115
17116 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017117 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 -060017118 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017119 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 -060017120
Tony Barbour552f6c02016-12-21 14:34:07 -070017121 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017122 VkImageCopy copy_region;
17123 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17124 copy_region.srcSubresource.mipLevel = 0;
17125 copy_region.srcSubresource.baseArrayLayer = 0;
17126 copy_region.srcSubresource.layerCount = 0;
17127 copy_region.srcOffset.x = 0;
17128 copy_region.srcOffset.y = 0;
17129 copy_region.srcOffset.z = 0;
17130 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17131 copy_region.dstSubresource.mipLevel = 0;
17132 copy_region.dstSubresource.baseArrayLayer = 0;
17133 copy_region.dstSubresource.layerCount = 0;
17134 copy_region.dstOffset.x = 0;
17135 copy_region.dstOffset.y = 0;
17136 copy_region.dstOffset.z = 0;
17137 copy_region.extent.width = 64;
17138 copy_region.extent.height = 64;
17139 copy_region.extent.depth = 1;
17140 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17141 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017142 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017143
17144 m_errorMonitor->VerifyFound();
17145}
17146
17147TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017148 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017150
Tony Barbour1fa09702017-03-16 12:09:08 -060017151 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017152
17153 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017154 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 -060017155 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017156 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 -060017157
Tony Barbour552f6c02016-12-21 14:34:07 -070017158 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017159 VkImageCopy copy_region;
17160 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17161 copy_region.srcSubresource.mipLevel = 0;
17162 copy_region.srcSubresource.baseArrayLayer = 0;
17163 copy_region.srcSubresource.layerCount = 0;
17164 copy_region.srcOffset.x = 0;
17165 copy_region.srcOffset.y = 0;
17166 copy_region.srcOffset.z = 0;
17167 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17168 copy_region.dstSubresource.mipLevel = 0;
17169 copy_region.dstSubresource.baseArrayLayer = 0;
17170 copy_region.dstSubresource.layerCount = 0;
17171 copy_region.dstOffset.x = 0;
17172 copy_region.dstOffset.y = 0;
17173 copy_region.dstOffset.z = 0;
17174 copy_region.extent.width = 64;
17175 copy_region.extent.height = 64;
17176 copy_region.extent.depth = 1;
17177 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17178 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017179 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017180
17181 m_errorMonitor->VerifyFound();
17182}
17183
Karl Schultz6addd812016-02-02 17:17:23 -070017184TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017185 VkResult err;
17186 bool pass;
17187
17188 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017190
Tony Barbour1fa09702017-03-16 12:09:08 -060017191 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017192
17193 // Create two images of different types and try to copy between them
17194 VkImage srcImage;
17195 VkImage dstImage;
17196 VkDeviceMemory srcMem;
17197 VkDeviceMemory destMem;
17198 VkMemoryRequirements memReqs;
17199
17200 VkImageCreateInfo image_create_info = {};
17201 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17202 image_create_info.pNext = NULL;
17203 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17204 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17205 image_create_info.extent.width = 32;
17206 image_create_info.extent.height = 32;
17207 image_create_info.extent.depth = 1;
17208 image_create_info.mipLevels = 1;
17209 image_create_info.arrayLayers = 1;
17210 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17211 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17212 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17213 image_create_info.flags = 0;
17214
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017215 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017216 ASSERT_VK_SUCCESS(err);
17217
17218 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17219 // Introduce failure by creating second image with a different-sized format.
17220 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017221 VkFormatProperties properties;
17222 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17223 if (properties.optimalTilingFeatures == 0) {
17224 printf(" Image format not supported; skipped.\n");
17225 return;
17226 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017227
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017228 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017229 ASSERT_VK_SUCCESS(err);
17230
17231 // Allocate memory
17232 VkMemoryAllocateInfo memAlloc = {};
17233 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17234 memAlloc.pNext = NULL;
17235 memAlloc.allocationSize = 0;
17236 memAlloc.memoryTypeIndex = 0;
17237
17238 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17239 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017240 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017241 ASSERT_TRUE(pass);
17242 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17243 ASSERT_VK_SUCCESS(err);
17244
17245 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17246 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017247 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017248 ASSERT_TRUE(pass);
17249 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17250 ASSERT_VK_SUCCESS(err);
17251
17252 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17253 ASSERT_VK_SUCCESS(err);
17254 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17255 ASSERT_VK_SUCCESS(err);
17256
Tony Barbour552f6c02016-12-21 14:34:07 -070017257 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017258 VkImageCopy copyRegion;
17259 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17260 copyRegion.srcSubresource.mipLevel = 0;
17261 copyRegion.srcSubresource.baseArrayLayer = 0;
17262 copyRegion.srcSubresource.layerCount = 0;
17263 copyRegion.srcOffset.x = 0;
17264 copyRegion.srcOffset.y = 0;
17265 copyRegion.srcOffset.z = 0;
17266 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17267 copyRegion.dstSubresource.mipLevel = 0;
17268 copyRegion.dstSubresource.baseArrayLayer = 0;
17269 copyRegion.dstSubresource.layerCount = 0;
17270 copyRegion.dstOffset.x = 0;
17271 copyRegion.dstOffset.y = 0;
17272 copyRegion.dstOffset.z = 0;
17273 copyRegion.extent.width = 1;
17274 copyRegion.extent.height = 1;
17275 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017276 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017277 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017278
17279 m_errorMonitor->VerifyFound();
17280
17281 vkDestroyImage(m_device->device(), srcImage, NULL);
17282 vkDestroyImage(m_device->device(), dstImage, NULL);
17283 vkFreeMemory(m_device->device(), srcMem, NULL);
17284 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017285}
17286
Karl Schultz6addd812016-02-02 17:17:23 -070017287TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17288 VkResult err;
17289 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017290
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017291 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17293 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017294
Tony Barbour1fa09702017-03-16 12:09:08 -060017295 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017296 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017297 if (!depth_format) {
17298 return;
17299 }
Mike Stroyana3082432015-09-25 13:39:21 -060017300
17301 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017302 VkImage srcImage;
17303 VkImage dstImage;
17304 VkDeviceMemory srcMem;
17305 VkDeviceMemory destMem;
17306 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017307
17308 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017309 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17310 image_create_info.pNext = NULL;
17311 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017312 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017313 image_create_info.extent.width = 32;
17314 image_create_info.extent.height = 32;
17315 image_create_info.extent.depth = 1;
17316 image_create_info.mipLevels = 1;
17317 image_create_info.arrayLayers = 1;
17318 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060017319 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070017320 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17321 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017322 VkFormatProperties properties;
17323 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17324 if (properties.optimalTilingFeatures == 0) {
17325 printf(" Image format not supported; skipped.\n");
17326 return;
17327 }
Mike Stroyana3082432015-09-25 13:39:21 -060017328
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017329 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017330 ASSERT_VK_SUCCESS(err);
17331
Karl Schultzbdb75952016-04-19 11:36:49 -060017332 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17333
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017334 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017335 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017336 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017337 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017338
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017339 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017340 ASSERT_VK_SUCCESS(err);
17341
17342 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017343 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017344 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17345 memAlloc.pNext = NULL;
17346 memAlloc.allocationSize = 0;
17347 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017348
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017349 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017350 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017351 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017352 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017353 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017354 ASSERT_VK_SUCCESS(err);
17355
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017356 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017357 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017358 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017359 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017360 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017361 ASSERT_VK_SUCCESS(err);
17362
17363 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17364 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017365 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017366 ASSERT_VK_SUCCESS(err);
17367
Tony Barbour552f6c02016-12-21 14:34:07 -070017368 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017369 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017370 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017371 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017372 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017373 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017374 copyRegion.srcOffset.x = 0;
17375 copyRegion.srcOffset.y = 0;
17376 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017377 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017378 copyRegion.dstSubresource.mipLevel = 0;
17379 copyRegion.dstSubresource.baseArrayLayer = 0;
17380 copyRegion.dstSubresource.layerCount = 0;
17381 copyRegion.dstOffset.x = 0;
17382 copyRegion.dstOffset.y = 0;
17383 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017384 copyRegion.extent.width = 1;
17385 copyRegion.extent.height = 1;
17386 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017387 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017388 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017389
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017390 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017391
Chia-I Wuf7458c52015-10-26 21:10:41 +080017392 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017393 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017394 vkFreeMemory(m_device->device(), srcMem, NULL);
17395 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017396}
17397
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017398TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17399 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017400
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017401 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017402
17403 VkImageFormatProperties image_format_properties;
17404 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17405 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17406 &image_format_properties);
17407
17408 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17409 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17410 printf(" Image multi-sample support not found; skipped.\n");
17411 return;
17412 }
17413
17414 VkImageCreateInfo ci;
17415 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17416 ci.pNext = NULL;
17417 ci.flags = 0;
17418 ci.imageType = VK_IMAGE_TYPE_2D;
17419 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17420 ci.extent = {128, 128, 1};
17421 ci.mipLevels = 1;
17422 ci.arrayLayers = 1;
17423 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17424 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17425 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17426 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17427 ci.queueFamilyIndexCount = 0;
17428 ci.pQueueFamilyIndices = NULL;
17429 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17430
17431 VkImageObj image1(m_device);
17432 image1.init(&ci);
17433 ASSERT_TRUE(image1.initialized());
17434
17435 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17436 VkImageObj image2(m_device);
17437 image2.init(&ci);
17438 ASSERT_TRUE(image2.initialized());
17439
17440 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17441 VkImageObj image4(m_device);
17442 image4.init(&ci);
17443 ASSERT_TRUE(image4.initialized());
17444
17445 m_commandBuffer->BeginCommandBuffer();
17446
17447 VkImageCopy copyRegion;
17448 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17449 copyRegion.srcSubresource.mipLevel = 0;
17450 copyRegion.srcSubresource.baseArrayLayer = 0;
17451 copyRegion.srcSubresource.layerCount = 1;
17452 copyRegion.srcOffset = {0, 0, 0};
17453 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17454 copyRegion.dstSubresource.mipLevel = 0;
17455 copyRegion.dstSubresource.baseArrayLayer = 0;
17456 copyRegion.dstSubresource.layerCount = 1;
17457 copyRegion.dstOffset = {0, 0, 0};
17458 copyRegion.extent = {128, 128, 1};
17459
17460 // Copy a single sample image to/from a multi-sample image
17461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17462 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17463 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17464 m_errorMonitor->VerifyFound();
17465
17466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17467 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17468 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17469 m_errorMonitor->VerifyFound();
17470
17471 // Copy between multi-sample images with different sample counts
17472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17473 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17474 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17475 m_errorMonitor->VerifyFound();
17476
17477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17478 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17479 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17480 m_errorMonitor->VerifyFound();
17481
17482 m_commandBuffer->EndCommandBuffer();
17483}
17484
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017485TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17486 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017487 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017488 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017489 if (!ds_format) {
17490 return;
17491 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017492
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017493 VkFormatProperties properties;
17494 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
17495 if (properties.optimalTilingFeatures == 0) {
17496 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
17497 return;
17498 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017499 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017500 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 -060017501 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17502 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017503 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17504 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017505 ASSERT_TRUE(color_image.initialized());
17506 ASSERT_TRUE(depth_image.initialized());
17507 ASSERT_TRUE(ds_image.initialized());
17508
17509 VkImageCopy copyRegion;
17510 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17511 copyRegion.srcSubresource.mipLevel = 0;
17512 copyRegion.srcSubresource.baseArrayLayer = 0;
17513 copyRegion.srcSubresource.layerCount = 1;
17514 copyRegion.srcOffset = {0, 0, 0};
17515 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17516 copyRegion.dstSubresource.mipLevel = 0;
17517 copyRegion.dstSubresource.baseArrayLayer = 0;
17518 copyRegion.dstSubresource.layerCount = 1;
17519 copyRegion.dstOffset = {64, 0, 0};
17520 copyRegion.extent = {64, 128, 1};
17521
17522 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17524 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17525 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17526 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017527 m_errorMonitor->VerifyFound();
17528
17529 m_commandBuffer->BeginCommandBuffer();
17530
17531 // Src and dest aspect masks don't match
17532 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017534 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17535 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017536 m_errorMonitor->VerifyFound();
17537 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17538
17539 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017540 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017541 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17543 // These aspect/format mismatches are redundant but unavoidable here
17544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017546 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17547 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017548 m_errorMonitor->VerifyFound();
17549 // Metadata aspect is illegal - VU 01222
17550 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17551 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17553 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017554 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17555 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017556 m_errorMonitor->VerifyFound();
17557
17558 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17559 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17560
17561 // Aspect mask doesn't match source image format - VU 01200
17562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17563 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17565 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17566 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17567 m_errorMonitor->VerifyFound();
17568
17569 // Aspect mask doesn't match dest image format - VU 01201
17570 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17571 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17573 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17575 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17576 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17577 m_errorMonitor->VerifyFound();
17578
17579 m_commandBuffer->EndCommandBuffer();
17580}
17581
Karl Schultz6addd812016-02-02 17:17:23 -070017582TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17583 VkResult err;
17584 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017585
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17587 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017588
Tony Barbour1fa09702017-03-16 12:09:08 -060017589 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017590
17591 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017592 VkImage srcImage;
17593 VkImage dstImage;
17594 VkDeviceMemory srcMem;
17595 VkDeviceMemory destMem;
17596 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017597
17598 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017599 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17600 image_create_info.pNext = NULL;
17601 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17602 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17603 image_create_info.extent.width = 32;
17604 image_create_info.extent.height = 1;
17605 image_create_info.extent.depth = 1;
17606 image_create_info.mipLevels = 1;
17607 image_create_info.arrayLayers = 1;
17608 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17609 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17610 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17611 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017612
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017613 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017614 ASSERT_VK_SUCCESS(err);
17615
Karl Schultz6addd812016-02-02 17:17:23 -070017616 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017617
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017618 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017619 ASSERT_VK_SUCCESS(err);
17620
17621 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017622 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017623 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17624 memAlloc.pNext = NULL;
17625 memAlloc.allocationSize = 0;
17626 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017627
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017628 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017629 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017630 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017631 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017632 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017633 ASSERT_VK_SUCCESS(err);
17634
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017635 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017636 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017637 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017638 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017639 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017640 ASSERT_VK_SUCCESS(err);
17641
17642 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17643 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017644 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017645 ASSERT_VK_SUCCESS(err);
17646
Tony Barbour552f6c02016-12-21 14:34:07 -070017647 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017648 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017649 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17650 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017651 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017652 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017653 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017654 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017655 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017656 resolveRegion.srcOffset.x = 0;
17657 resolveRegion.srcOffset.y = 0;
17658 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017659 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017660 resolveRegion.dstSubresource.mipLevel = 0;
17661 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017662 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017663 resolveRegion.dstOffset.x = 0;
17664 resolveRegion.dstOffset.y = 0;
17665 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017666 resolveRegion.extent.width = 1;
17667 resolveRegion.extent.height = 1;
17668 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017669 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017670 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017671
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017672 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017673
Chia-I Wuf7458c52015-10-26 21:10:41 +080017674 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017675 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017676 vkFreeMemory(m_device->device(), srcMem, NULL);
17677 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017678}
17679
Karl Schultz6addd812016-02-02 17:17:23 -070017680TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17681 VkResult err;
17682 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017683
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17685 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017686
Tony Barbour1fa09702017-03-16 12:09:08 -060017687 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017688
Chris Forbesa7530692016-05-08 12:35:39 +120017689 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017690 VkImage srcImage;
17691 VkImage dstImage;
17692 VkDeviceMemory srcMem;
17693 VkDeviceMemory destMem;
17694 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017695
17696 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017697 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17698 image_create_info.pNext = NULL;
17699 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17700 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17701 image_create_info.extent.width = 32;
17702 image_create_info.extent.height = 1;
17703 image_create_info.extent.depth = 1;
17704 image_create_info.mipLevels = 1;
17705 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017706 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017707 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17708 // Note: Some implementations expect color attachment usage for any
17709 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017710 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017711 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017712
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017713 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017714 ASSERT_VK_SUCCESS(err);
17715
Karl Schultz6addd812016-02-02 17:17:23 -070017716 // Note: Some implementations expect color attachment usage for any
17717 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017718 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017719
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017720 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017721 ASSERT_VK_SUCCESS(err);
17722
17723 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017724 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017725 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17726 memAlloc.pNext = NULL;
17727 memAlloc.allocationSize = 0;
17728 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017729
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017730 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017731 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017732 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017733 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017734 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017735 ASSERT_VK_SUCCESS(err);
17736
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017737 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017738 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017739 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017740 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017741 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017742 ASSERT_VK_SUCCESS(err);
17743
17744 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17745 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017746 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017747 ASSERT_VK_SUCCESS(err);
17748
Tony Barbour552f6c02016-12-21 14:34:07 -070017749 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017750 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017751 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17752 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017753 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017754 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017755 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017756 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017757 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017758 resolveRegion.srcOffset.x = 0;
17759 resolveRegion.srcOffset.y = 0;
17760 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017761 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017762 resolveRegion.dstSubresource.mipLevel = 0;
17763 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017764 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017765 resolveRegion.dstOffset.x = 0;
17766 resolveRegion.dstOffset.y = 0;
17767 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017768 resolveRegion.extent.width = 1;
17769 resolveRegion.extent.height = 1;
17770 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017771 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017772 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017773
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017774 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017775
Chia-I Wuf7458c52015-10-26 21:10:41 +080017776 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017777 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017778 vkFreeMemory(m_device->device(), srcMem, NULL);
17779 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017780}
17781
Karl Schultz6addd812016-02-02 17:17:23 -070017782TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17783 VkResult err;
17784 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017785
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017787 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017788
Tony Barbour1fa09702017-03-16 12:09:08 -060017789 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017790
17791 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017792 VkImage srcImage;
17793 VkImage dstImage;
17794 VkDeviceMemory srcMem;
17795 VkDeviceMemory destMem;
17796 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017797
17798 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017799 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17800 image_create_info.pNext = NULL;
17801 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17802 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17803 image_create_info.extent.width = 32;
17804 image_create_info.extent.height = 1;
17805 image_create_info.extent.depth = 1;
17806 image_create_info.mipLevels = 1;
17807 image_create_info.arrayLayers = 1;
17808 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17809 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17810 // Note: Some implementations expect color attachment usage for any
17811 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017812 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017813 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017815 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017816 ASSERT_VK_SUCCESS(err);
17817
Karl Schultz6addd812016-02-02 17:17:23 -070017818 // Set format to something other than source image
17819 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17820 // Note: Some implementations expect color attachment usage for any
17821 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017822 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017823 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017824
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017825 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017826 ASSERT_VK_SUCCESS(err);
17827
17828 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017829 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017830 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17831 memAlloc.pNext = NULL;
17832 memAlloc.allocationSize = 0;
17833 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017834
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017835 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017836 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017837 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017838 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017839 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017840 ASSERT_VK_SUCCESS(err);
17841
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017842 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017843 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017844 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017845 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017846 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017847 ASSERT_VK_SUCCESS(err);
17848
17849 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17850 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017851 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017852 ASSERT_VK_SUCCESS(err);
17853
Tony Barbour552f6c02016-12-21 14:34:07 -070017854 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017855 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017856 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17857 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017858 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017859 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017860 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017861 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017862 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017863 resolveRegion.srcOffset.x = 0;
17864 resolveRegion.srcOffset.y = 0;
17865 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017866 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017867 resolveRegion.dstSubresource.mipLevel = 0;
17868 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017869 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017870 resolveRegion.dstOffset.x = 0;
17871 resolveRegion.dstOffset.y = 0;
17872 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017873 resolveRegion.extent.width = 1;
17874 resolveRegion.extent.height = 1;
17875 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017876 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017877 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017878
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017879 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017880
Chia-I Wuf7458c52015-10-26 21:10:41 +080017881 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017882 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017883 vkFreeMemory(m_device->device(), srcMem, NULL);
17884 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017885}
17886
Karl Schultz6addd812016-02-02 17:17:23 -070017887TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17888 VkResult err;
17889 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017890
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017892 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017893
Tony Barbour1fa09702017-03-16 12:09:08 -060017894 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017895
17896 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017897 VkImage srcImage;
17898 VkImage dstImage;
17899 VkDeviceMemory srcMem;
17900 VkDeviceMemory destMem;
17901 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017902
17903 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017904 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17905 image_create_info.pNext = NULL;
17906 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17907 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17908 image_create_info.extent.width = 32;
17909 image_create_info.extent.height = 1;
17910 image_create_info.extent.depth = 1;
17911 image_create_info.mipLevels = 1;
17912 image_create_info.arrayLayers = 1;
17913 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17914 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17915 // Note: Some implementations expect color attachment usage for any
17916 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017917 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017918 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017919
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017920 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017921 ASSERT_VK_SUCCESS(err);
17922
Karl Schultz6addd812016-02-02 17:17:23 -070017923 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17924 // Note: Some implementations expect color attachment usage for any
17925 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017926 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017927 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017928
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017929 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017930 ASSERT_VK_SUCCESS(err);
17931
17932 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017933 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017934 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17935 memAlloc.pNext = NULL;
17936 memAlloc.allocationSize = 0;
17937 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017938
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017939 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017940 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017941 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017942 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017943 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017944 ASSERT_VK_SUCCESS(err);
17945
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017946 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017947 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017948 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017949 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017950 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017951 ASSERT_VK_SUCCESS(err);
17952
17953 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17954 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017955 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017956 ASSERT_VK_SUCCESS(err);
17957
Tony Barbour552f6c02016-12-21 14:34:07 -070017958 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017959 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017960 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17961 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017962 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017963 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017964 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017965 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017966 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017967 resolveRegion.srcOffset.x = 0;
17968 resolveRegion.srcOffset.y = 0;
17969 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017970 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017971 resolveRegion.dstSubresource.mipLevel = 0;
17972 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017973 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017974 resolveRegion.dstOffset.x = 0;
17975 resolveRegion.dstOffset.y = 0;
17976 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017977 resolveRegion.extent.width = 1;
17978 resolveRegion.extent.height = 1;
17979 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017980 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017981 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017982
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017983 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017984
Chia-I Wuf7458c52015-10-26 21:10:41 +080017985 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017986 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017987 vkFreeMemory(m_device->device(), srcMem, NULL);
17988 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017989}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017990
Karl Schultz6addd812016-02-02 17:17:23 -070017991TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017992 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017993 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17994 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017995 // The image format check comes 2nd in validation so we trigger it first,
17996 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017997 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017998
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18000 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018001
Tony Barbour1fa09702017-03-16 12:09:08 -060018002 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018003 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018004 if (!depth_format) {
18005 return;
18006 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018007
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018008 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018009 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18010 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018011
18012 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018013 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18014 ds_pool_ci.pNext = NULL;
18015 ds_pool_ci.maxSets = 1;
18016 ds_pool_ci.poolSizeCount = 1;
18017 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018018
18019 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018020 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018021 ASSERT_VK_SUCCESS(err);
18022
18023 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018024 dsl_binding.binding = 0;
18025 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18026 dsl_binding.descriptorCount = 1;
18027 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18028 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018029
18030 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018031 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18032 ds_layout_ci.pNext = NULL;
18033 ds_layout_ci.bindingCount = 1;
18034 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018035 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018036 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018037 ASSERT_VK_SUCCESS(err);
18038
18039 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018040 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018041 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018042 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018043 alloc_info.descriptorPool = ds_pool;
18044 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018045 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018046 ASSERT_VK_SUCCESS(err);
18047
Karl Schultz6addd812016-02-02 17:17:23 -070018048 VkImage image_bad;
18049 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018050 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018051 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018052 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018053 const int32_t tex_width = 32;
18054 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018055
18056 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018057 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18058 image_create_info.pNext = NULL;
18059 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18060 image_create_info.format = tex_format_bad;
18061 image_create_info.extent.width = tex_width;
18062 image_create_info.extent.height = tex_height;
18063 image_create_info.extent.depth = 1;
18064 image_create_info.mipLevels = 1;
18065 image_create_info.arrayLayers = 1;
18066 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18067 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018068 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018069 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018070
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018071 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018072 ASSERT_VK_SUCCESS(err);
18073 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018074 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18075 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018076 ASSERT_VK_SUCCESS(err);
18077
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018078 // ---Bind image memory---
18079 VkMemoryRequirements img_mem_reqs;
18080 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18081 VkMemoryAllocateInfo image_alloc_info = {};
18082 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18083 image_alloc_info.pNext = NULL;
18084 image_alloc_info.memoryTypeIndex = 0;
18085 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018086 bool pass =
18087 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 -070018088 ASSERT_TRUE(pass);
18089 VkDeviceMemory mem;
18090 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18091 ASSERT_VK_SUCCESS(err);
18092 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18093 ASSERT_VK_SUCCESS(err);
18094 // -----------------------
18095
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018096 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018097 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018098 image_view_create_info.image = image_bad;
18099 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18100 image_view_create_info.format = tex_format_bad;
18101 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18102 image_view_create_info.subresourceRange.baseMipLevel = 0;
18103 image_view_create_info.subresourceRange.layerCount = 1;
18104 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018105 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018106
18107 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018108 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018109
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018110 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018111
Chia-I Wuf7458c52015-10-26 21:10:41 +080018112 vkDestroyImage(m_device->device(), image_bad, NULL);
18113 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018116
18117 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018118}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018119
18120TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018121 TEST_DESCRIPTION(
18122 "Call ClearColorImage w/ a depth|stencil image and "
18123 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018124
Tony Barbour1fa09702017-03-16 12:09:08 -060018125 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018126 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018127 if (!depth_format) {
18128 return;
18129 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018130 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18131
Tony Barbour552f6c02016-12-21 14:34:07 -070018132 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018133
18134 // Color image
18135 VkClearColorValue clear_color;
18136 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18137 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18138 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18139 const int32_t img_width = 32;
18140 const int32_t img_height = 32;
18141 VkImageCreateInfo image_create_info = {};
18142 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18143 image_create_info.pNext = NULL;
18144 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18145 image_create_info.format = color_format;
18146 image_create_info.extent.width = img_width;
18147 image_create_info.extent.height = img_height;
18148 image_create_info.extent.depth = 1;
18149 image_create_info.mipLevels = 1;
18150 image_create_info.arrayLayers = 1;
18151 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18152 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18153 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18154
18155 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018156 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018157
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018158 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018159
18160 // Depth/Stencil image
18161 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018162 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018163 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18164 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018165 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018166 ds_image_create_info.extent.width = 64;
18167 ds_image_create_info.extent.height = 64;
18168 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018169 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 -060018170
18171 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018172 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018173
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018174 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 -060018175
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018177
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018178 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018179 &color_range);
18180
18181 m_errorMonitor->VerifyFound();
18182
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18184 "vkCmdClearColorImage called with "
18185 "image created without "
18186 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018187
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018188 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018189 &color_range);
18190
18191 m_errorMonitor->VerifyFound();
18192
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018193 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18195 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018196
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018197 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18198 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018199
18200 m_errorMonitor->VerifyFound();
18201}
Tobin Ehliscde08892015-09-22 10:11:37 -060018202
Mike Schuchardt35fece12017-03-07 14:40:28 -070018203TEST_F(VkLayerTest, CommandQueueFlags) {
18204 TEST_DESCRIPTION(
18205 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18206 "graphics-only command");
18207
18208 ASSERT_NO_FATAL_FAILURE(Init());
18209
18210 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018211 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018212 printf(" Non-graphics queue family not found; skipped.\n");
18213 return;
18214 } else {
18215 // Create command pool on a non-graphics queue
18216 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18217
18218 // Setup command buffer on pool
18219 VkCommandBufferObj command_buffer(m_device, &command_pool);
18220 command_buffer.BeginCommandBuffer();
18221
18222 // Issue a graphics only command
18223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18224 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18225 command_buffer.SetViewport(0, 1, &viewport);
18226 m_errorMonitor->VerifyFound();
18227 }
18228}
18229
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018230// WSI Enabled Tests
18231//
Chris Forbes09368e42016-10-13 11:59:22 +130018232#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018233TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18234
18235#if defined(VK_USE_PLATFORM_XCB_KHR)
18236 VkSurfaceKHR surface = VK_NULL_HANDLE;
18237
18238 VkResult err;
18239 bool pass;
18240 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18241 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18242 // uint32_t swapchain_image_count = 0;
18243 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18244 // uint32_t image_index = 0;
18245 // VkPresentInfoKHR present_info = {};
18246
Tony Barbour1fa09702017-03-16 12:09:08 -060018247 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018248
18249 // Use the create function from one of the VK_KHR_*_surface extension in
18250 // order to create a surface, testing all known errors in the process,
18251 // before successfully creating a surface:
18252 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18254 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18255 pass = (err != VK_SUCCESS);
18256 ASSERT_TRUE(pass);
18257 m_errorMonitor->VerifyFound();
18258
18259 // Next, try to create a surface with the wrong
18260 // VkXcbSurfaceCreateInfoKHR::sType:
18261 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18262 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18264 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18265 pass = (err != VK_SUCCESS);
18266 ASSERT_TRUE(pass);
18267 m_errorMonitor->VerifyFound();
18268
18269 // Create a native window, and then correctly create a surface:
18270 xcb_connection_t *connection;
18271 xcb_screen_t *screen;
18272 xcb_window_t xcb_window;
18273 xcb_intern_atom_reply_t *atom_wm_delete_window;
18274
18275 const xcb_setup_t *setup;
18276 xcb_screen_iterator_t iter;
18277 int scr;
18278 uint32_t value_mask, value_list[32];
18279 int width = 1;
18280 int height = 1;
18281
18282 connection = xcb_connect(NULL, &scr);
18283 ASSERT_TRUE(connection != NULL);
18284 setup = xcb_get_setup(connection);
18285 iter = xcb_setup_roots_iterator(setup);
18286 while (scr-- > 0)
18287 xcb_screen_next(&iter);
18288 screen = iter.data;
18289
18290 xcb_window = xcb_generate_id(connection);
18291
18292 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18293 value_list[0] = screen->black_pixel;
18294 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18295
18296 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18297 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18298
18299 /* Magic code that will send notification when window is destroyed */
18300 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18301 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18302
18303 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18304 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18305 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18306 free(reply);
18307
18308 xcb_map_window(connection, xcb_window);
18309
18310 // Force the x/y coordinates to 100,100 results are identical in consecutive
18311 // runs
18312 const uint32_t coords[] = { 100, 100 };
18313 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18314
18315 // Finally, try to correctly create a surface:
18316 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18317 xcb_create_info.pNext = NULL;
18318 xcb_create_info.flags = 0;
18319 xcb_create_info.connection = connection;
18320 xcb_create_info.window = xcb_window;
18321 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18322 pass = (err == VK_SUCCESS);
18323 ASSERT_TRUE(pass);
18324
18325 // Check if surface supports presentation:
18326
18327 // 1st, do so without having queried the queue families:
18328 VkBool32 supported = false;
18329 // TODO: Get the following error to come out:
18330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18331 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18332 "function");
18333 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18334 pass = (err != VK_SUCCESS);
18335 // ASSERT_TRUE(pass);
18336 // m_errorMonitor->VerifyFound();
18337
18338 // Next, query a queue family index that's too large:
18339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18340 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18341 pass = (err != VK_SUCCESS);
18342 ASSERT_TRUE(pass);
18343 m_errorMonitor->VerifyFound();
18344
18345 // Finally, do so correctly:
18346 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18347 // SUPPORTED
18348 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18349 pass = (err == VK_SUCCESS);
18350 ASSERT_TRUE(pass);
18351
18352 // Before proceeding, try to create a swapchain without having called
18353 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18354 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18355 swapchain_create_info.pNext = NULL;
18356 swapchain_create_info.flags = 0;
18357 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18358 swapchain_create_info.surface = surface;
18359 swapchain_create_info.imageArrayLayers = 1;
18360 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18361 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18363 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18364 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18365 pass = (err != VK_SUCCESS);
18366 ASSERT_TRUE(pass);
18367 m_errorMonitor->VerifyFound();
18368
18369 // Get the surface capabilities:
18370 VkSurfaceCapabilitiesKHR surface_capabilities;
18371
18372 // Do so correctly (only error logged by this entrypoint is if the
18373 // extension isn't enabled):
18374 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18375 pass = (err == VK_SUCCESS);
18376 ASSERT_TRUE(pass);
18377
18378 // Get the surface formats:
18379 uint32_t surface_format_count;
18380
18381 // First, try without a pointer to surface_format_count:
18382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18383 "specified as NULL");
18384 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18385 pass = (err == VK_SUCCESS);
18386 ASSERT_TRUE(pass);
18387 m_errorMonitor->VerifyFound();
18388
18389 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18390 // correctly done a 1st try (to get the count):
18391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18392 surface_format_count = 0;
18393 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18394 pass = (err == VK_SUCCESS);
18395 ASSERT_TRUE(pass);
18396 m_errorMonitor->VerifyFound();
18397
18398 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18399 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18400 pass = (err == VK_SUCCESS);
18401 ASSERT_TRUE(pass);
18402
18403 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18404 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18405
18406 // Next, do a 2nd try with surface_format_count being set too high:
18407 surface_format_count += 5;
18408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18409 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18410 pass = (err == VK_SUCCESS);
18411 ASSERT_TRUE(pass);
18412 m_errorMonitor->VerifyFound();
18413
18414 // Finally, do a correct 1st and 2nd try:
18415 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18416 pass = (err == VK_SUCCESS);
18417 ASSERT_TRUE(pass);
18418 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18419 pass = (err == VK_SUCCESS);
18420 ASSERT_TRUE(pass);
18421
18422 // Get the surface present modes:
18423 uint32_t surface_present_mode_count;
18424
18425 // First, try without a pointer to surface_format_count:
18426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18427 "specified as NULL");
18428
18429 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18430 pass = (err == VK_SUCCESS);
18431 ASSERT_TRUE(pass);
18432 m_errorMonitor->VerifyFound();
18433
18434 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18435 // correctly done a 1st try (to get the count):
18436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18437 surface_present_mode_count = 0;
18438 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18439 (VkPresentModeKHR *)&surface_present_mode_count);
18440 pass = (err == VK_SUCCESS);
18441 ASSERT_TRUE(pass);
18442 m_errorMonitor->VerifyFound();
18443
18444 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18445 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18446 pass = (err == VK_SUCCESS);
18447 ASSERT_TRUE(pass);
18448
18449 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18450 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18451
18452 // Next, do a 2nd try with surface_format_count being set too high:
18453 surface_present_mode_count += 5;
18454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18455 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18456 pass = (err == VK_SUCCESS);
18457 ASSERT_TRUE(pass);
18458 m_errorMonitor->VerifyFound();
18459
18460 // Finally, do a correct 1st and 2nd try:
18461 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18462 pass = (err == VK_SUCCESS);
18463 ASSERT_TRUE(pass);
18464 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18465 pass = (err == VK_SUCCESS);
18466 ASSERT_TRUE(pass);
18467
18468 // Create a swapchain:
18469
18470 // First, try without a pointer to swapchain_create_info:
18471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18472 "specified as NULL");
18473
18474 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18475 pass = (err != VK_SUCCESS);
18476 ASSERT_TRUE(pass);
18477 m_errorMonitor->VerifyFound();
18478
18479 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18480 // sType:
18481 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18483
18484 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18485 pass = (err != VK_SUCCESS);
18486 ASSERT_TRUE(pass);
18487 m_errorMonitor->VerifyFound();
18488
18489 // Next, call with a NULL swapchain pointer:
18490 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18491 swapchain_create_info.pNext = NULL;
18492 swapchain_create_info.flags = 0;
18493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18494 "specified as NULL");
18495
18496 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18497 pass = (err != VK_SUCCESS);
18498 ASSERT_TRUE(pass);
18499 m_errorMonitor->VerifyFound();
18500
18501 // TODO: Enhance swapchain layer so that
18502 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18503
18504 // Next, call with a queue family index that's too large:
18505 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18506 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18507 swapchain_create_info.queueFamilyIndexCount = 2;
18508 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18510 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18511 pass = (err != VK_SUCCESS);
18512 ASSERT_TRUE(pass);
18513 m_errorMonitor->VerifyFound();
18514
18515 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18516 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18517 swapchain_create_info.queueFamilyIndexCount = 1;
18518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18519 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18520 "pCreateInfo->pQueueFamilyIndices).");
18521 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18522 pass = (err != VK_SUCCESS);
18523 ASSERT_TRUE(pass);
18524 m_errorMonitor->VerifyFound();
18525
18526 // Next, call with an invalid imageSharingMode:
18527 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18528 swapchain_create_info.queueFamilyIndexCount = 1;
18529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18530 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18531 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18532 pass = (err != VK_SUCCESS);
18533 ASSERT_TRUE(pass);
18534 m_errorMonitor->VerifyFound();
18535 // Fix for the future:
18536 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18537 // SUPPORTED
18538 swapchain_create_info.queueFamilyIndexCount = 0;
18539 queueFamilyIndex[0] = 0;
18540 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18541
18542 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18543 // Get the images from a swapchain:
18544 // Acquire an image from a swapchain:
18545 // Present an image to a swapchain:
18546 // Destroy the swapchain:
18547
18548 // TODOs:
18549 //
18550 // - Try destroying the device without first destroying the swapchain
18551 //
18552 // - Try destroying the device without first destroying the surface
18553 //
18554 // - Try destroying the surface without first destroying the swapchain
18555
18556 // Destroy the surface:
18557 vkDestroySurfaceKHR(instance(), surface, NULL);
18558
18559 // Tear down the window:
18560 xcb_destroy_window(connection, xcb_window);
18561 xcb_disconnect(connection);
18562
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018563#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018564 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018565#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018566}
Chris Forbes09368e42016-10-13 11:59:22 +130018567#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018568
18569//
18570// POSITIVE VALIDATION TESTS
18571//
18572// These tests do not expect to encounter ANY validation errors pass only if this is true
18573
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018574TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18575 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018576 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18578
18579 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18580 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018581 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018582 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18583 command_buffer_allocate_info.commandBufferCount = 1;
18584
18585 VkCommandBuffer secondary_command_buffer;
18586 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18587 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18588 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18589 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18590 command_buffer_inheritance_info.renderPass = m_renderPass;
18591 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18592
18593 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18594 command_buffer_begin_info.flags =
18595 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18596 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18597
18598 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18599 VkClearAttachment color_attachment;
18600 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18601 color_attachment.clearValue.color.float32[0] = 0;
18602 color_attachment.clearValue.color.float32[1] = 0;
18603 color_attachment.clearValue.color.float32[2] = 0;
18604 color_attachment.clearValue.color.float32[3] = 0;
18605 color_attachment.colorAttachment = 0;
18606 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18607 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18608}
18609
Tobin Ehlise0006882016-11-03 10:14:28 -060018610TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018611 TEST_DESCRIPTION(
18612 "Perform an image layout transition in a secondary command buffer followed "
18613 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018614 VkResult err;
18615 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018616 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018617 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018618 if (!depth_format) {
18619 return;
18620 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18622 // Allocate a secondary and primary cmd buffer
18623 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18624 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018625 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018626 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18627 command_buffer_allocate_info.commandBufferCount = 1;
18628
18629 VkCommandBuffer secondary_command_buffer;
18630 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18631 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18632 VkCommandBuffer primary_command_buffer;
18633 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18634 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18635 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18636 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18637 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18638 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18639 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18640
18641 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18642 ASSERT_VK_SUCCESS(err);
18643 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018644 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 -060018645 ASSERT_TRUE(image.initialized());
18646 VkImageMemoryBarrier img_barrier = {};
18647 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18648 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18649 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18650 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18651 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18652 img_barrier.image = image.handle();
18653 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18654 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18655 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18656 img_barrier.subresourceRange.baseArrayLayer = 0;
18657 img_barrier.subresourceRange.baseMipLevel = 0;
18658 img_barrier.subresourceRange.layerCount = 1;
18659 img_barrier.subresourceRange.levelCount = 1;
18660 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18661 0, nullptr, 1, &img_barrier);
18662 err = vkEndCommandBuffer(secondary_command_buffer);
18663 ASSERT_VK_SUCCESS(err);
18664
18665 // Now update primary cmd buffer to execute secondary and transitions image
18666 command_buffer_begin_info.pInheritanceInfo = nullptr;
18667 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18668 ASSERT_VK_SUCCESS(err);
18669 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18670 VkImageMemoryBarrier img_barrier2 = {};
18671 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18672 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18673 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18674 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18675 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18676 img_barrier2.image = image.handle();
18677 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18678 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18679 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18680 img_barrier2.subresourceRange.baseArrayLayer = 0;
18681 img_barrier2.subresourceRange.baseMipLevel = 0;
18682 img_barrier2.subresourceRange.layerCount = 1;
18683 img_barrier2.subresourceRange.levelCount = 1;
18684 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18685 nullptr, 1, &img_barrier2);
18686 err = vkEndCommandBuffer(primary_command_buffer);
18687 ASSERT_VK_SUCCESS(err);
18688 VkSubmitInfo submit_info = {};
18689 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18690 submit_info.commandBufferCount = 1;
18691 submit_info.pCommandBuffers = &primary_command_buffer;
18692 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18693 ASSERT_VK_SUCCESS(err);
18694 m_errorMonitor->VerifyNotFound();
18695 err = vkDeviceWaitIdle(m_device->device());
18696 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018697 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18698 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018699}
18700
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018701// This is a positive test. No failures are expected.
18702TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018703 TEST_DESCRIPTION(
18704 "Ensure that the vkUpdateDescriptorSets validation code "
18705 "is ignoring VkWriteDescriptorSet members that are not "
18706 "related to the descriptor type specified by "
18707 "VkWriteDescriptorSet::descriptorType. Correct "
18708 "validation behavior will result in the test running to "
18709 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018710
18711 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18712
Tony Barbour1fa09702017-03-16 12:09:08 -060018713 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018714
18715 // Image Case
18716 {
18717 m_errorMonitor->ExpectSuccess();
18718
18719 VkImage image;
18720 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18721 const int32_t tex_width = 32;
18722 const int32_t tex_height = 32;
18723 VkImageCreateInfo image_create_info = {};
18724 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18725 image_create_info.pNext = NULL;
18726 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18727 image_create_info.format = tex_format;
18728 image_create_info.extent.width = tex_width;
18729 image_create_info.extent.height = tex_height;
18730 image_create_info.extent.depth = 1;
18731 image_create_info.mipLevels = 1;
18732 image_create_info.arrayLayers = 1;
18733 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18734 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18735 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18736 image_create_info.flags = 0;
18737 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18738 ASSERT_VK_SUCCESS(err);
18739
18740 VkMemoryRequirements memory_reqs;
18741 VkDeviceMemory image_memory;
18742 bool pass;
18743 VkMemoryAllocateInfo memory_info = {};
18744 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18745 memory_info.pNext = NULL;
18746 memory_info.allocationSize = 0;
18747 memory_info.memoryTypeIndex = 0;
18748 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18749 memory_info.allocationSize = memory_reqs.size;
18750 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18751 ASSERT_TRUE(pass);
18752 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18753 ASSERT_VK_SUCCESS(err);
18754 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18755 ASSERT_VK_SUCCESS(err);
18756
18757 VkImageViewCreateInfo image_view_create_info = {};
18758 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18759 image_view_create_info.image = image;
18760 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18761 image_view_create_info.format = tex_format;
18762 image_view_create_info.subresourceRange.layerCount = 1;
18763 image_view_create_info.subresourceRange.baseMipLevel = 0;
18764 image_view_create_info.subresourceRange.levelCount = 1;
18765 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18766
18767 VkImageView view;
18768 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18769 ASSERT_VK_SUCCESS(err);
18770
18771 VkDescriptorPoolSize ds_type_count = {};
18772 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18773 ds_type_count.descriptorCount = 1;
18774
18775 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18776 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18777 ds_pool_ci.pNext = NULL;
18778 ds_pool_ci.maxSets = 1;
18779 ds_pool_ci.poolSizeCount = 1;
18780 ds_pool_ci.pPoolSizes = &ds_type_count;
18781
18782 VkDescriptorPool ds_pool;
18783 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18784 ASSERT_VK_SUCCESS(err);
18785
18786 VkDescriptorSetLayoutBinding dsl_binding = {};
18787 dsl_binding.binding = 0;
18788 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18789 dsl_binding.descriptorCount = 1;
18790 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18791 dsl_binding.pImmutableSamplers = NULL;
18792
18793 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18794 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18795 ds_layout_ci.pNext = NULL;
18796 ds_layout_ci.bindingCount = 1;
18797 ds_layout_ci.pBindings = &dsl_binding;
18798 VkDescriptorSetLayout ds_layout;
18799 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18800 ASSERT_VK_SUCCESS(err);
18801
18802 VkDescriptorSet descriptor_set;
18803 VkDescriptorSetAllocateInfo alloc_info = {};
18804 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18805 alloc_info.descriptorSetCount = 1;
18806 alloc_info.descriptorPool = ds_pool;
18807 alloc_info.pSetLayouts = &ds_layout;
18808 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18809 ASSERT_VK_SUCCESS(err);
18810
18811 VkDescriptorImageInfo image_info = {};
18812 image_info.imageView = view;
18813 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18814
18815 VkWriteDescriptorSet descriptor_write;
18816 memset(&descriptor_write, 0, sizeof(descriptor_write));
18817 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18818 descriptor_write.dstSet = descriptor_set;
18819 descriptor_write.dstBinding = 0;
18820 descriptor_write.descriptorCount = 1;
18821 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18822 descriptor_write.pImageInfo = &image_info;
18823
18824 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18825 // be
18826 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18827 // This will most likely produce a crash if the parameter_validation
18828 // layer
18829 // does not correctly ignore pBufferInfo.
18830 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18831 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18832
18833 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18834
18835 m_errorMonitor->VerifyNotFound();
18836
18837 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18838 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18839 vkDestroyImageView(m_device->device(), view, NULL);
18840 vkDestroyImage(m_device->device(), image, NULL);
18841 vkFreeMemory(m_device->device(), image_memory, NULL);
18842 }
18843
18844 // Buffer Case
18845 {
18846 m_errorMonitor->ExpectSuccess();
18847
18848 VkBuffer buffer;
18849 uint32_t queue_family_index = 0;
18850 VkBufferCreateInfo buffer_create_info = {};
18851 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18852 buffer_create_info.size = 1024;
18853 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18854 buffer_create_info.queueFamilyIndexCount = 1;
18855 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18856
18857 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18858 ASSERT_VK_SUCCESS(err);
18859
18860 VkMemoryRequirements memory_reqs;
18861 VkDeviceMemory buffer_memory;
18862 bool pass;
18863 VkMemoryAllocateInfo memory_info = {};
18864 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18865 memory_info.pNext = NULL;
18866 memory_info.allocationSize = 0;
18867 memory_info.memoryTypeIndex = 0;
18868
18869 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18870 memory_info.allocationSize = memory_reqs.size;
18871 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18872 ASSERT_TRUE(pass);
18873
18874 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18875 ASSERT_VK_SUCCESS(err);
18876 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18877 ASSERT_VK_SUCCESS(err);
18878
18879 VkDescriptorPoolSize ds_type_count = {};
18880 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18881 ds_type_count.descriptorCount = 1;
18882
18883 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18884 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18885 ds_pool_ci.pNext = NULL;
18886 ds_pool_ci.maxSets = 1;
18887 ds_pool_ci.poolSizeCount = 1;
18888 ds_pool_ci.pPoolSizes = &ds_type_count;
18889
18890 VkDescriptorPool ds_pool;
18891 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18892 ASSERT_VK_SUCCESS(err);
18893
18894 VkDescriptorSetLayoutBinding dsl_binding = {};
18895 dsl_binding.binding = 0;
18896 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18897 dsl_binding.descriptorCount = 1;
18898 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18899 dsl_binding.pImmutableSamplers = NULL;
18900
18901 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18902 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18903 ds_layout_ci.pNext = NULL;
18904 ds_layout_ci.bindingCount = 1;
18905 ds_layout_ci.pBindings = &dsl_binding;
18906 VkDescriptorSetLayout ds_layout;
18907 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18908 ASSERT_VK_SUCCESS(err);
18909
18910 VkDescriptorSet descriptor_set;
18911 VkDescriptorSetAllocateInfo alloc_info = {};
18912 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18913 alloc_info.descriptorSetCount = 1;
18914 alloc_info.descriptorPool = ds_pool;
18915 alloc_info.pSetLayouts = &ds_layout;
18916 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18917 ASSERT_VK_SUCCESS(err);
18918
18919 VkDescriptorBufferInfo buffer_info = {};
18920 buffer_info.buffer = buffer;
18921 buffer_info.offset = 0;
18922 buffer_info.range = 1024;
18923
18924 VkWriteDescriptorSet descriptor_write;
18925 memset(&descriptor_write, 0, sizeof(descriptor_write));
18926 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18927 descriptor_write.dstSet = descriptor_set;
18928 descriptor_write.dstBinding = 0;
18929 descriptor_write.descriptorCount = 1;
18930 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18931 descriptor_write.pBufferInfo = &buffer_info;
18932
18933 // Set pImageInfo and pTexelBufferView to invalid values, which should
18934 // be
18935 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18936 // This will most likely produce a crash if the parameter_validation
18937 // layer
18938 // does not correctly ignore pImageInfo.
18939 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18940 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18941
18942 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18943
18944 m_errorMonitor->VerifyNotFound();
18945
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018946 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18947 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18948 vkDestroyBuffer(m_device->device(), buffer, NULL);
18949 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18950 }
18951
18952 // Texel Buffer Case
18953 {
18954 m_errorMonitor->ExpectSuccess();
18955
18956 VkBuffer buffer;
18957 uint32_t queue_family_index = 0;
18958 VkBufferCreateInfo buffer_create_info = {};
18959 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18960 buffer_create_info.size = 1024;
18961 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18962 buffer_create_info.queueFamilyIndexCount = 1;
18963 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18964
18965 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18966 ASSERT_VK_SUCCESS(err);
18967
18968 VkMemoryRequirements memory_reqs;
18969 VkDeviceMemory buffer_memory;
18970 bool pass;
18971 VkMemoryAllocateInfo memory_info = {};
18972 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18973 memory_info.pNext = NULL;
18974 memory_info.allocationSize = 0;
18975 memory_info.memoryTypeIndex = 0;
18976
18977 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18978 memory_info.allocationSize = memory_reqs.size;
18979 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18980 ASSERT_TRUE(pass);
18981
18982 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18983 ASSERT_VK_SUCCESS(err);
18984 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18985 ASSERT_VK_SUCCESS(err);
18986
18987 VkBufferViewCreateInfo buff_view_ci = {};
18988 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18989 buff_view_ci.buffer = buffer;
18990 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18991 buff_view_ci.range = VK_WHOLE_SIZE;
18992 VkBufferView buffer_view;
18993 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18994
18995 VkDescriptorPoolSize ds_type_count = {};
18996 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18997 ds_type_count.descriptorCount = 1;
18998
18999 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19000 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19001 ds_pool_ci.pNext = NULL;
19002 ds_pool_ci.maxSets = 1;
19003 ds_pool_ci.poolSizeCount = 1;
19004 ds_pool_ci.pPoolSizes = &ds_type_count;
19005
19006 VkDescriptorPool ds_pool;
19007 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19008 ASSERT_VK_SUCCESS(err);
19009
19010 VkDescriptorSetLayoutBinding dsl_binding = {};
19011 dsl_binding.binding = 0;
19012 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19013 dsl_binding.descriptorCount = 1;
19014 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19015 dsl_binding.pImmutableSamplers = NULL;
19016
19017 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19018 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19019 ds_layout_ci.pNext = NULL;
19020 ds_layout_ci.bindingCount = 1;
19021 ds_layout_ci.pBindings = &dsl_binding;
19022 VkDescriptorSetLayout ds_layout;
19023 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19024 ASSERT_VK_SUCCESS(err);
19025
19026 VkDescriptorSet descriptor_set;
19027 VkDescriptorSetAllocateInfo alloc_info = {};
19028 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19029 alloc_info.descriptorSetCount = 1;
19030 alloc_info.descriptorPool = ds_pool;
19031 alloc_info.pSetLayouts = &ds_layout;
19032 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19033 ASSERT_VK_SUCCESS(err);
19034
19035 VkWriteDescriptorSet descriptor_write;
19036 memset(&descriptor_write, 0, sizeof(descriptor_write));
19037 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19038 descriptor_write.dstSet = descriptor_set;
19039 descriptor_write.dstBinding = 0;
19040 descriptor_write.descriptorCount = 1;
19041 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19042 descriptor_write.pTexelBufferView = &buffer_view;
19043
19044 // Set pImageInfo and pBufferInfo to invalid values, which should be
19045 // ignored for descriptorType ==
19046 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19047 // This will most likely produce a crash if the parameter_validation
19048 // layer
19049 // does not correctly ignore pImageInfo and pBufferInfo.
19050 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19051 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19052
19053 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19054
19055 m_errorMonitor->VerifyNotFound();
19056
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019057 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19058 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19059 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19060 vkDestroyBuffer(m_device->device(), buffer, NULL);
19061 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19062 }
19063}
19064
Tobin Ehlisf7428442016-10-25 07:58:24 -060019065TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19066 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19067
Tony Barbour1fa09702017-03-16 12:09:08 -060019068 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019069 // Create layout where two binding #s are "1"
19070 static const uint32_t NUM_BINDINGS = 3;
19071 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19072 dsl_binding[0].binding = 1;
19073 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19074 dsl_binding[0].descriptorCount = 1;
19075 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19076 dsl_binding[0].pImmutableSamplers = NULL;
19077 dsl_binding[1].binding = 0;
19078 dsl_binding[1].descriptorCount = 1;
19079 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19080 dsl_binding[1].descriptorCount = 1;
19081 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19082 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019083 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019084 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19085 dsl_binding[2].descriptorCount = 1;
19086 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19087 dsl_binding[2].pImmutableSamplers = NULL;
19088
19089 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19090 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19091 ds_layout_ci.pNext = NULL;
19092 ds_layout_ci.bindingCount = NUM_BINDINGS;
19093 ds_layout_ci.pBindings = dsl_binding;
19094 VkDescriptorSetLayout ds_layout;
19095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19096 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19097 m_errorMonitor->VerifyFound();
19098}
19099
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019100TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019101 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19102
Tony Barbour1fa09702017-03-16 12:09:08 -060019103 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019104
Tony Barbour552f6c02016-12-21 14:34:07 -070019105 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019106
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019107 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19108
19109 {
19110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19111 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19112 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19113 m_errorMonitor->VerifyFound();
19114 }
19115
19116 {
19117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19118 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19119 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19120 m_errorMonitor->VerifyFound();
19121 }
19122
19123 {
19124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19125 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
19126 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19127 m_errorMonitor->VerifyFound();
19128 }
19129
19130 {
19131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19132 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
19133 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19134 m_errorMonitor->VerifyFound();
19135 }
19136
19137 {
19138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
19139 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
19140 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19141 m_errorMonitor->VerifyFound();
19142 }
19143
19144 {
19145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
19146 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19147 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19148 m_errorMonitor->VerifyFound();
19149 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019150
19151 {
19152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19153 VkRect2D scissor = {{-1, 0}, {16, 16}};
19154 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19155 m_errorMonitor->VerifyFound();
19156 }
19157
19158 {
19159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19160 VkRect2D scissor = {{0, -2}, {16, 16}};
19161 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19162 m_errorMonitor->VerifyFound();
19163 }
19164
19165 {
19166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19167 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
19168 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19169 m_errorMonitor->VerifyFound();
19170 }
19171
19172 {
19173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
19174 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19175 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19176 m_errorMonitor->VerifyFound();
19177 }
19178
Tony Barbour552f6c02016-12-21 14:34:07 -070019179 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019180}
19181
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019182// This is a positive test. No failures are expected.
19183TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19184 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19185 VkResult err;
19186
Tony Barbour1fa09702017-03-16 12:09:08 -060019187 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019188 m_errorMonitor->ExpectSuccess();
19189 VkDescriptorPoolSize ds_type_count = {};
19190 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19191 ds_type_count.descriptorCount = 2;
19192
19193 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19194 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19195 ds_pool_ci.pNext = NULL;
19196 ds_pool_ci.maxSets = 1;
19197 ds_pool_ci.poolSizeCount = 1;
19198 ds_pool_ci.pPoolSizes = &ds_type_count;
19199
19200 VkDescriptorPool ds_pool;
19201 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19202 ASSERT_VK_SUCCESS(err);
19203
19204 // Create layout with two uniform buffer descriptors w/ empty binding between them
19205 static const uint32_t NUM_BINDINGS = 3;
19206 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19207 dsl_binding[0].binding = 0;
19208 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19209 dsl_binding[0].descriptorCount = 1;
19210 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19211 dsl_binding[0].pImmutableSamplers = NULL;
19212 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019213 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019214 dsl_binding[2].binding = 2;
19215 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19216 dsl_binding[2].descriptorCount = 1;
19217 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19218 dsl_binding[2].pImmutableSamplers = NULL;
19219
19220 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19221 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19222 ds_layout_ci.pNext = NULL;
19223 ds_layout_ci.bindingCount = NUM_BINDINGS;
19224 ds_layout_ci.pBindings = dsl_binding;
19225 VkDescriptorSetLayout ds_layout;
19226 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19227 ASSERT_VK_SUCCESS(err);
19228
19229 VkDescriptorSet descriptor_set = {};
19230 VkDescriptorSetAllocateInfo alloc_info = {};
19231 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19232 alloc_info.descriptorSetCount = 1;
19233 alloc_info.descriptorPool = ds_pool;
19234 alloc_info.pSetLayouts = &ds_layout;
19235 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19236 ASSERT_VK_SUCCESS(err);
19237
19238 // Create a buffer to be used for update
19239 VkBufferCreateInfo buff_ci = {};
19240 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19241 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19242 buff_ci.size = 256;
19243 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19244 VkBuffer buffer;
19245 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19246 ASSERT_VK_SUCCESS(err);
19247 // Have to bind memory to buffer before descriptor update
19248 VkMemoryAllocateInfo mem_alloc = {};
19249 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19250 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019251 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019252 mem_alloc.memoryTypeIndex = 0;
19253
19254 VkMemoryRequirements mem_reqs;
19255 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19256 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19257 if (!pass) {
19258 vkDestroyBuffer(m_device->device(), buffer, NULL);
19259 return;
19260 }
19261
19262 VkDeviceMemory mem;
19263 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19264 ASSERT_VK_SUCCESS(err);
19265 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19266 ASSERT_VK_SUCCESS(err);
19267
19268 // Only update the descriptor at binding 2
19269 VkDescriptorBufferInfo buff_info = {};
19270 buff_info.buffer = buffer;
19271 buff_info.offset = 0;
19272 buff_info.range = VK_WHOLE_SIZE;
19273 VkWriteDescriptorSet descriptor_write = {};
19274 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19275 descriptor_write.dstBinding = 2;
19276 descriptor_write.descriptorCount = 1;
19277 descriptor_write.pTexelBufferView = nullptr;
19278 descriptor_write.pBufferInfo = &buff_info;
19279 descriptor_write.pImageInfo = nullptr;
19280 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19281 descriptor_write.dstSet = descriptor_set;
19282
19283 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19284
19285 m_errorMonitor->VerifyNotFound();
19286 // Cleanup
19287 vkFreeMemory(m_device->device(), mem, NULL);
19288 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19289 vkDestroyBuffer(m_device->device(), buffer, NULL);
19290 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19291}
19292
19293// This is a positive test. No failures are expected.
19294TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19295 VkResult err;
19296 bool pass;
19297
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019298 TEST_DESCRIPTION(
19299 "Create a buffer, allocate memory, bind memory, destroy "
19300 "the buffer, create an image, and bind the same memory to "
19301 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019302
19303 m_errorMonitor->ExpectSuccess();
19304
Tony Barbour1fa09702017-03-16 12:09:08 -060019305 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019306
19307 VkBuffer buffer;
19308 VkImage image;
19309 VkDeviceMemory mem;
19310 VkMemoryRequirements mem_reqs;
19311
19312 VkBufferCreateInfo buf_info = {};
19313 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19314 buf_info.pNext = NULL;
19315 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19316 buf_info.size = 256;
19317 buf_info.queueFamilyIndexCount = 0;
19318 buf_info.pQueueFamilyIndices = NULL;
19319 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19320 buf_info.flags = 0;
19321 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19322 ASSERT_VK_SUCCESS(err);
19323
19324 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19325
19326 VkMemoryAllocateInfo alloc_info = {};
19327 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19328 alloc_info.pNext = NULL;
19329 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019330
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019331 // Ensure memory is big enough for both bindings
19332 alloc_info.allocationSize = 0x10000;
19333
19334 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19335 if (!pass) {
19336 vkDestroyBuffer(m_device->device(), buffer, NULL);
19337 return;
19338 }
19339
19340 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19341 ASSERT_VK_SUCCESS(err);
19342
19343 uint8_t *pData;
19344 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19345 ASSERT_VK_SUCCESS(err);
19346
19347 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19348
19349 vkUnmapMemory(m_device->device(), mem);
19350
19351 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19352 ASSERT_VK_SUCCESS(err);
19353
19354 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19355 // memory. In fact, it was never used by the GPU.
19356 // Just be be sure, wait for idle.
19357 vkDestroyBuffer(m_device->device(), buffer, NULL);
19358 vkDeviceWaitIdle(m_device->device());
19359
Tobin Ehlis6a005702016-12-28 15:25:56 -070019360 // Use optimal as some platforms report linear support but then fail image creation
19361 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19362 VkImageFormatProperties image_format_properties;
19363 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19364 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19365 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019366 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019367 vkFreeMemory(m_device->device(), mem, NULL);
19368 return;
19369 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019370 VkImageCreateInfo image_create_info = {};
19371 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19372 image_create_info.pNext = NULL;
19373 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19374 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19375 image_create_info.extent.width = 64;
19376 image_create_info.extent.height = 64;
19377 image_create_info.extent.depth = 1;
19378 image_create_info.mipLevels = 1;
19379 image_create_info.arrayLayers = 1;
19380 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019381 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019382 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19383 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19384 image_create_info.queueFamilyIndexCount = 0;
19385 image_create_info.pQueueFamilyIndices = NULL;
19386 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19387 image_create_info.flags = 0;
19388
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019389 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019390 * to be textures or it will be the staging image if they are not.
19391 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019392 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19393 ASSERT_VK_SUCCESS(err);
19394
19395 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19396
Tobin Ehlis6a005702016-12-28 15:25:56 -070019397 VkMemoryAllocateInfo mem_alloc = {};
19398 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19399 mem_alloc.pNext = NULL;
19400 mem_alloc.allocationSize = 0;
19401 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019402 mem_alloc.allocationSize = mem_reqs.size;
19403
19404 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19405 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019406 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019407 vkDestroyImage(m_device->device(), image, NULL);
19408 return;
19409 }
19410
19411 // VALIDATION FAILURE:
19412 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19413 ASSERT_VK_SUCCESS(err);
19414
19415 m_errorMonitor->VerifyNotFound();
19416
19417 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019418 vkDestroyImage(m_device->device(), image, NULL);
19419}
19420
Tony Barbourab713912017-02-02 14:17:35 -070019421// This is a positive test. No failures are expected.
19422TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19423 VkResult err;
19424
19425 TEST_DESCRIPTION(
19426 "Call all applicable destroy and free routines with NULL"
19427 "handles, expecting no validation errors");
19428
19429 m_errorMonitor->ExpectSuccess();
19430
Tony Barbour1fa09702017-03-16 12:09:08 -060019431 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019432 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19433 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19434 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19435 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19436 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19437 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19438 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19439 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19440 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19441 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19442 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19443 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19444 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19445 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19446 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19447 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19448 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19449 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19450 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19451 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19452
19453 VkCommandPool command_pool;
19454 VkCommandPoolCreateInfo pool_create_info{};
19455 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19456 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19457 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19458 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19459 VkCommandBuffer command_buffers[3] = {};
19460 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19461 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19462 command_buffer_allocate_info.commandPool = command_pool;
19463 command_buffer_allocate_info.commandBufferCount = 1;
19464 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19465 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19466 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19467 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19468
19469 VkDescriptorPoolSize ds_type_count = {};
19470 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19471 ds_type_count.descriptorCount = 1;
19472
19473 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19474 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19475 ds_pool_ci.pNext = NULL;
19476 ds_pool_ci.maxSets = 1;
19477 ds_pool_ci.poolSizeCount = 1;
19478 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19479 ds_pool_ci.pPoolSizes = &ds_type_count;
19480
19481 VkDescriptorPool ds_pool;
19482 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19483 ASSERT_VK_SUCCESS(err);
19484
19485 VkDescriptorSetLayoutBinding dsl_binding = {};
19486 dsl_binding.binding = 2;
19487 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19488 dsl_binding.descriptorCount = 1;
19489 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19490 dsl_binding.pImmutableSamplers = NULL;
19491 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19492 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19493 ds_layout_ci.pNext = NULL;
19494 ds_layout_ci.bindingCount = 1;
19495 ds_layout_ci.pBindings = &dsl_binding;
19496 VkDescriptorSetLayout ds_layout;
19497 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19498 ASSERT_VK_SUCCESS(err);
19499
19500 VkDescriptorSet descriptor_sets[3] = {};
19501 VkDescriptorSetAllocateInfo alloc_info = {};
19502 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19503 alloc_info.descriptorSetCount = 1;
19504 alloc_info.descriptorPool = ds_pool;
19505 alloc_info.pSetLayouts = &ds_layout;
19506 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19507 ASSERT_VK_SUCCESS(err);
19508 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19511
19512 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19513
19514 m_errorMonitor->VerifyNotFound();
19515}
19516
Tony Barbour626994c2017-02-08 15:29:37 -070019517TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019518 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019519
19520 m_errorMonitor->ExpectSuccess();
19521
Tony Barbour1fa09702017-03-16 12:09:08 -060019522 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019523 VkCommandBuffer cmd_bufs[4];
19524 VkCommandBufferAllocateInfo alloc_info;
19525 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19526 alloc_info.pNext = NULL;
19527 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019528 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019529 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19530 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19531 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019532 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019533 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19534 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019535 ASSERT_TRUE(image.initialized());
19536 VkCommandBufferBeginInfo cb_binfo;
19537 cb_binfo.pNext = NULL;
19538 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19539 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19540 cb_binfo.flags = 0;
19541 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19542 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19543 VkImageMemoryBarrier img_barrier = {};
19544 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19545 img_barrier.pNext = NULL;
19546 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19547 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19548 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19549 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19550 img_barrier.image = image.handle();
19551 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19552 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19553 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19554 img_barrier.subresourceRange.baseArrayLayer = 0;
19555 img_barrier.subresourceRange.baseMipLevel = 0;
19556 img_barrier.subresourceRange.layerCount = 1;
19557 img_barrier.subresourceRange.levelCount = 1;
19558 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19559 &img_barrier);
19560 vkEndCommandBuffer(cmd_bufs[0]);
19561 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19562 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19563 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19564 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19565 &img_barrier);
19566 vkEndCommandBuffer(cmd_bufs[1]);
19567 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19568 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19569 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19570 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19571 &img_barrier);
19572 vkEndCommandBuffer(cmd_bufs[2]);
19573 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19574 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19575 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19576 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19577 &img_barrier);
19578 vkEndCommandBuffer(cmd_bufs[3]);
19579
19580 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19581 VkSemaphore semaphore1, semaphore2;
19582 VkSemaphoreCreateInfo semaphore_create_info{};
19583 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19584 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19585 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19586 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19587 VkSubmitInfo submit_info[3];
19588 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19589 submit_info[0].pNext = nullptr;
19590 submit_info[0].commandBufferCount = 1;
19591 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19592 submit_info[0].signalSemaphoreCount = 1;
19593 submit_info[0].pSignalSemaphores = &semaphore1;
19594 submit_info[0].waitSemaphoreCount = 0;
19595 submit_info[0].pWaitDstStageMask = nullptr;
19596 submit_info[0].pWaitDstStageMask = flags;
19597 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19598 submit_info[1].pNext = nullptr;
19599 submit_info[1].commandBufferCount = 1;
19600 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19601 submit_info[1].waitSemaphoreCount = 1;
19602 submit_info[1].pWaitSemaphores = &semaphore1;
19603 submit_info[1].signalSemaphoreCount = 1;
19604 submit_info[1].pSignalSemaphores = &semaphore2;
19605 submit_info[1].pWaitDstStageMask = flags;
19606 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19607 submit_info[2].pNext = nullptr;
19608 submit_info[2].commandBufferCount = 2;
19609 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19610 submit_info[2].waitSemaphoreCount = 1;
19611 submit_info[2].pWaitSemaphores = &semaphore2;
19612 submit_info[2].signalSemaphoreCount = 0;
19613 submit_info[2].pSignalSemaphores = nullptr;
19614 submit_info[2].pWaitDstStageMask = flags;
19615 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19616 vkQueueWaitIdle(m_device->m_queue);
19617
19618 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19619 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19620 m_errorMonitor->VerifyNotFound();
19621}
19622
Tobin Ehlis953e8392016-11-17 10:54:13 -070019623TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19624 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19625 // We previously had a bug where dynamic offset of inactive bindings was still being used
19626 VkResult err;
19627 m_errorMonitor->ExpectSuccess();
19628
Tony Barbour1fa09702017-03-16 12:09:08 -060019629 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019630 ASSERT_NO_FATAL_FAILURE(InitViewport());
19631 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19632
19633 VkDescriptorPoolSize ds_type_count = {};
19634 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19635 ds_type_count.descriptorCount = 3;
19636
19637 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19638 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19639 ds_pool_ci.pNext = NULL;
19640 ds_pool_ci.maxSets = 1;
19641 ds_pool_ci.poolSizeCount = 1;
19642 ds_pool_ci.pPoolSizes = &ds_type_count;
19643
19644 VkDescriptorPool ds_pool;
19645 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19646 ASSERT_VK_SUCCESS(err);
19647
19648 const uint32_t BINDING_COUNT = 3;
19649 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019650 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019651 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19652 dsl_binding[0].descriptorCount = 1;
19653 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19654 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019655 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019656 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19657 dsl_binding[1].descriptorCount = 1;
19658 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19659 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019660 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019661 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19662 dsl_binding[2].descriptorCount = 1;
19663 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19664 dsl_binding[2].pImmutableSamplers = NULL;
19665
19666 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19667 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19668 ds_layout_ci.pNext = NULL;
19669 ds_layout_ci.bindingCount = BINDING_COUNT;
19670 ds_layout_ci.pBindings = dsl_binding;
19671 VkDescriptorSetLayout ds_layout;
19672 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19673 ASSERT_VK_SUCCESS(err);
19674
19675 VkDescriptorSet descriptor_set;
19676 VkDescriptorSetAllocateInfo alloc_info = {};
19677 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19678 alloc_info.descriptorSetCount = 1;
19679 alloc_info.descriptorPool = ds_pool;
19680 alloc_info.pSetLayouts = &ds_layout;
19681 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19682 ASSERT_VK_SUCCESS(err);
19683
19684 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19685 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19686 pipeline_layout_ci.pNext = NULL;
19687 pipeline_layout_ci.setLayoutCount = 1;
19688 pipeline_layout_ci.pSetLayouts = &ds_layout;
19689
19690 VkPipelineLayout pipeline_layout;
19691 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19692 ASSERT_VK_SUCCESS(err);
19693
19694 // Create two buffers to update the descriptors with
19695 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19696 uint32_t qfi = 0;
19697 VkBufferCreateInfo buffCI = {};
19698 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19699 buffCI.size = 2048;
19700 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19701 buffCI.queueFamilyIndexCount = 1;
19702 buffCI.pQueueFamilyIndices = &qfi;
19703
19704 VkBuffer dyub1;
19705 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19706 ASSERT_VK_SUCCESS(err);
19707 // buffer2
19708 buffCI.size = 1024;
19709 VkBuffer dyub2;
19710 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19711 ASSERT_VK_SUCCESS(err);
19712 // Allocate memory and bind to buffers
19713 VkMemoryAllocateInfo mem_alloc[2] = {};
19714 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19715 mem_alloc[0].pNext = NULL;
19716 mem_alloc[0].memoryTypeIndex = 0;
19717 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19718 mem_alloc[1].pNext = NULL;
19719 mem_alloc[1].memoryTypeIndex = 0;
19720
19721 VkMemoryRequirements mem_reqs1;
19722 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19723 VkMemoryRequirements mem_reqs2;
19724 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19725 mem_alloc[0].allocationSize = mem_reqs1.size;
19726 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19727 mem_alloc[1].allocationSize = mem_reqs2.size;
19728 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19729 if (!pass) {
19730 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19731 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19732 return;
19733 }
19734
19735 VkDeviceMemory mem1;
19736 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19737 ASSERT_VK_SUCCESS(err);
19738 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19739 ASSERT_VK_SUCCESS(err);
19740 VkDeviceMemory mem2;
19741 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19742 ASSERT_VK_SUCCESS(err);
19743 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19744 ASSERT_VK_SUCCESS(err);
19745 // Update descriptors
19746 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19747 buff_info[0].buffer = dyub1;
19748 buff_info[0].offset = 0;
19749 buff_info[0].range = 256;
19750 buff_info[1].buffer = dyub1;
19751 buff_info[1].offset = 256;
19752 buff_info[1].range = 512;
19753 buff_info[2].buffer = dyub2;
19754 buff_info[2].offset = 0;
19755 buff_info[2].range = 512;
19756
19757 VkWriteDescriptorSet descriptor_write;
19758 memset(&descriptor_write, 0, sizeof(descriptor_write));
19759 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19760 descriptor_write.dstSet = descriptor_set;
19761 descriptor_write.dstBinding = 0;
19762 descriptor_write.descriptorCount = BINDING_COUNT;
19763 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19764 descriptor_write.pBufferInfo = buff_info;
19765
19766 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19767
Tony Barbour552f6c02016-12-21 14:34:07 -070019768 m_commandBuffer->BeginCommandBuffer();
19769 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019770
19771 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019772 char const *vsSource =
19773 "#version 450\n"
19774 "\n"
19775 "out gl_PerVertex { \n"
19776 " vec4 gl_Position;\n"
19777 "};\n"
19778 "void main(){\n"
19779 " gl_Position = vec4(1);\n"
19780 "}\n";
19781 char const *fsSource =
19782 "#version 450\n"
19783 "\n"
19784 "layout(location=0) out vec4 x;\n"
19785 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19786 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19787 "void main(){\n"
19788 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19789 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019790 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19791 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19792 VkPipelineObj pipe(m_device);
19793 pipe.SetViewport(m_viewports);
19794 pipe.SetScissor(m_scissors);
19795 pipe.AddShader(&vs);
19796 pipe.AddShader(&fs);
19797 pipe.AddColorAttachment();
19798 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19799
19800 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19801 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19802 // we used to have a bug in this case.
19803 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19804 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19805 &descriptor_set, BINDING_COUNT, dyn_off);
19806 Draw(1, 0, 0, 0);
19807 m_errorMonitor->VerifyNotFound();
19808
19809 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19810 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19811 vkFreeMemory(m_device->device(), mem1, NULL);
19812 vkFreeMemory(m_device->device(), mem2, NULL);
19813
19814 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19815 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19816 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19817}
19818
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019819TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019820 TEST_DESCRIPTION(
19821 "Ensure that validations handling of non-coherent memory "
19822 "mapping while using VK_WHOLE_SIZE does not cause access "
19823 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019824 VkResult err;
19825 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019826 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019827
19828 VkDeviceMemory mem;
19829 VkMemoryRequirements mem_reqs;
19830 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019831 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019832 VkMemoryAllocateInfo alloc_info = {};
19833 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19834 alloc_info.pNext = NULL;
19835 alloc_info.memoryTypeIndex = 0;
19836
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019837 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019838 alloc_info.allocationSize = allocation_size;
19839
19840 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19841 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 -070019842 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019843 if (!pass) {
19844 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019845 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19846 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019847 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019848 pass = m_device->phy().set_memory_type(
19849 mem_reqs.memoryTypeBits, &alloc_info,
19850 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19851 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019852 if (!pass) {
19853 return;
19854 }
19855 }
19856 }
19857
19858 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19859 ASSERT_VK_SUCCESS(err);
19860
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019861 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019862 m_errorMonitor->ExpectSuccess();
19863 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19864 ASSERT_VK_SUCCESS(err);
19865 VkMappedMemoryRange mmr = {};
19866 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19867 mmr.memory = mem;
19868 mmr.offset = 0;
19869 mmr.size = VK_WHOLE_SIZE;
19870 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19871 ASSERT_VK_SUCCESS(err);
19872 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19873 ASSERT_VK_SUCCESS(err);
19874 m_errorMonitor->VerifyNotFound();
19875 vkUnmapMemory(m_device->device(), mem);
19876
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019877 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019878 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019879 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019880 ASSERT_VK_SUCCESS(err);
19881 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19882 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019883 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019884 mmr.size = VK_WHOLE_SIZE;
19885 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19886 ASSERT_VK_SUCCESS(err);
19887 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19888 ASSERT_VK_SUCCESS(err);
19889 m_errorMonitor->VerifyNotFound();
19890 vkUnmapMemory(m_device->device(), mem);
19891
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019892 // Map with offset and size
19893 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019894 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019895 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019896 ASSERT_VK_SUCCESS(err);
19897 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19898 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019899 mmr.offset = 4 * atom_size;
19900 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019901 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19902 ASSERT_VK_SUCCESS(err);
19903 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19904 ASSERT_VK_SUCCESS(err);
19905 m_errorMonitor->VerifyNotFound();
19906 vkUnmapMemory(m_device->device(), mem);
19907
19908 // Map without offset and flush WHOLE_SIZE with two separate offsets
19909 m_errorMonitor->ExpectSuccess();
19910 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19911 ASSERT_VK_SUCCESS(err);
19912 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19913 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019914 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019915 mmr.size = VK_WHOLE_SIZE;
19916 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19917 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019918 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019919 mmr.size = VK_WHOLE_SIZE;
19920 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19921 ASSERT_VK_SUCCESS(err);
19922 m_errorMonitor->VerifyNotFound();
19923 vkUnmapMemory(m_device->device(), mem);
19924
19925 vkFreeMemory(m_device->device(), mem, NULL);
19926}
19927
19928// This is a positive test. We used to expect error in this case but spec now allows it
19929TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19930 m_errorMonitor->ExpectSuccess();
19931 vk_testing::Fence testFence;
19932 VkFenceCreateInfo fenceInfo = {};
19933 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19934 fenceInfo.pNext = NULL;
19935
Tony Barbour1fa09702017-03-16 12:09:08 -060019936 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019937 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019938 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019939 VkResult result = vkResetFences(m_device->device(), 1, fences);
19940 ASSERT_VK_SUCCESS(result);
19941
19942 m_errorMonitor->VerifyNotFound();
19943}
19944
19945TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19946 m_errorMonitor->ExpectSuccess();
19947
Tony Barbour1fa09702017-03-16 12:09:08 -060019948 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019949 VkResult err;
19950
19951 // Record (empty!) command buffer that can be submitted multiple times
19952 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019953 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19954 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019955 m_commandBuffer->BeginCommandBuffer(&cbbi);
19956 m_commandBuffer->EndCommandBuffer();
19957
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019958 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019959 VkFence fence;
19960 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19961 ASSERT_VK_SUCCESS(err);
19962
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019963 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019964 VkSemaphore s1, s2;
19965 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19966 ASSERT_VK_SUCCESS(err);
19967 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19968 ASSERT_VK_SUCCESS(err);
19969
19970 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019971 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019972 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19973 ASSERT_VK_SUCCESS(err);
19974
19975 // Submit CB again, signaling s2.
19976 si.pSignalSemaphores = &s2;
19977 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19978 ASSERT_VK_SUCCESS(err);
19979
19980 // Wait for fence.
19981 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19982 ASSERT_VK_SUCCESS(err);
19983
19984 // CB is still in flight from second submission, but semaphore s1 is no
19985 // longer in flight. delete it.
19986 vkDestroySemaphore(m_device->device(), s1, nullptr);
19987
19988 m_errorMonitor->VerifyNotFound();
19989
19990 // Force device idle and clean up remaining objects
19991 vkDeviceWaitIdle(m_device->device());
19992 vkDestroySemaphore(m_device->device(), s2, nullptr);
19993 vkDestroyFence(m_device->device(), fence, nullptr);
19994}
19995
19996TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19997 m_errorMonitor->ExpectSuccess();
19998
Tony Barbour1fa09702017-03-16 12:09:08 -060019999 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020000 VkResult err;
20001
20002 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020003 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020004 VkFence f1;
20005 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20006 ASSERT_VK_SUCCESS(err);
20007
20008 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020009 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020010 VkFence f2;
20011 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20012 ASSERT_VK_SUCCESS(err);
20013
20014 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020015 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020016 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20017
20018 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020019 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020020 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20021
20022 // Should have both retired!
20023 vkDestroyFence(m_device->device(), f1, nullptr);
20024 vkDestroyFence(m_device->device(), f2, nullptr);
20025
20026 m_errorMonitor->VerifyNotFound();
20027}
20028
20029TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020030 TEST_DESCRIPTION(
20031 "Verify that creating an image view from an image with valid usage "
20032 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020033
Tony Barbour1fa09702017-03-16 12:09:08 -060020034 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020035
20036 m_errorMonitor->ExpectSuccess();
20037 // Verify that we can create a view with usage INPUT_ATTACHMENT
20038 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020039 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 -060020040 ASSERT_TRUE(image.initialized());
20041 VkImageView imageView;
20042 VkImageViewCreateInfo ivci = {};
20043 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20044 ivci.image = image.handle();
20045 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20046 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20047 ivci.subresourceRange.layerCount = 1;
20048 ivci.subresourceRange.baseMipLevel = 0;
20049 ivci.subresourceRange.levelCount = 1;
20050 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20051
20052 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20053 m_errorMonitor->VerifyNotFound();
20054 vkDestroyImageView(m_device->device(), imageView, NULL);
20055}
20056
20057// This is a positive test. No failures are expected.
20058TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020059 TEST_DESCRIPTION(
20060 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20061 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020062
Tony Barbour1fa09702017-03-16 12:09:08 -060020063 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020064
20065 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020066 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020067 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020068
20069 m_errorMonitor->ExpectSuccess();
20070
20071 VkImage image;
20072 VkImageCreateInfo image_create_info = {};
20073 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20074 image_create_info.pNext = NULL;
20075 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20076 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20077 image_create_info.extent.width = 64;
20078 image_create_info.extent.height = 64;
20079 image_create_info.extent.depth = 1;
20080 image_create_info.mipLevels = 1;
20081 image_create_info.arrayLayers = 1;
20082 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20083 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20084 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20085 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20086 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20087 ASSERT_VK_SUCCESS(err);
20088
20089 VkMemoryRequirements memory_reqs;
20090 VkDeviceMemory memory_one, memory_two;
20091 bool pass;
20092 VkMemoryAllocateInfo memory_info = {};
20093 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20094 memory_info.pNext = NULL;
20095 memory_info.allocationSize = 0;
20096 memory_info.memoryTypeIndex = 0;
20097 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20098 // Find an image big enough to allow sparse mapping of 2 memory regions
20099 // Increase the image size until it is at least twice the
20100 // size of the required alignment, to ensure we can bind both
20101 // allocated memory blocks to the image on aligned offsets.
20102 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20103 vkDestroyImage(m_device->device(), image, nullptr);
20104 image_create_info.extent.width *= 2;
20105 image_create_info.extent.height *= 2;
20106 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20107 ASSERT_VK_SUCCESS(err);
20108 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20109 }
20110 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20111 // at the end of the first
20112 memory_info.allocationSize = memory_reqs.alignment;
20113 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20114 ASSERT_TRUE(pass);
20115 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20116 ASSERT_VK_SUCCESS(err);
20117 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20118 ASSERT_VK_SUCCESS(err);
20119 VkSparseMemoryBind binds[2];
20120 binds[0].flags = 0;
20121 binds[0].memory = memory_one;
20122 binds[0].memoryOffset = 0;
20123 binds[0].resourceOffset = 0;
20124 binds[0].size = memory_info.allocationSize;
20125 binds[1].flags = 0;
20126 binds[1].memory = memory_two;
20127 binds[1].memoryOffset = 0;
20128 binds[1].resourceOffset = memory_info.allocationSize;
20129 binds[1].size = memory_info.allocationSize;
20130
20131 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20132 opaqueBindInfo.image = image;
20133 opaqueBindInfo.bindCount = 2;
20134 opaqueBindInfo.pBinds = binds;
20135
20136 VkFence fence = VK_NULL_HANDLE;
20137 VkBindSparseInfo bindSparseInfo = {};
20138 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20139 bindSparseInfo.imageOpaqueBindCount = 1;
20140 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20141
20142 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20143 vkQueueWaitIdle(m_device->m_queue);
20144 vkDestroyImage(m_device->device(), image, NULL);
20145 vkFreeMemory(m_device->device(), memory_one, NULL);
20146 vkFreeMemory(m_device->device(), memory_two, NULL);
20147 m_errorMonitor->VerifyNotFound();
20148}
20149
20150TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020151 TEST_DESCRIPTION(
20152 "Ensure that CmdBeginRenderPass with an attachment's "
20153 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20154 "the command buffer has prior knowledge of that "
20155 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020156
20157 m_errorMonitor->ExpectSuccess();
20158
Tony Barbour1fa09702017-03-16 12:09:08 -060020159 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020160
20161 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020162 VkAttachmentDescription attachment = {0,
20163 VK_FORMAT_R8G8B8A8_UNORM,
20164 VK_SAMPLE_COUNT_1_BIT,
20165 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20166 VK_ATTACHMENT_STORE_OP_STORE,
20167 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20168 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20169 VK_IMAGE_LAYOUT_UNDEFINED,
20170 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020171
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020172 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020173
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020174 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020175
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020176 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020177
20178 VkRenderPass rp;
20179 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20180 ASSERT_VK_SUCCESS(err);
20181
20182 // A compatible framebuffer.
20183 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020184 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 -060020185 ASSERT_TRUE(image.initialized());
20186
20187 VkImageViewCreateInfo ivci = {
20188 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20189 nullptr,
20190 0,
20191 image.handle(),
20192 VK_IMAGE_VIEW_TYPE_2D,
20193 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020194 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20195 VK_COMPONENT_SWIZZLE_IDENTITY},
20196 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020197 };
20198 VkImageView view;
20199 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20200 ASSERT_VK_SUCCESS(err);
20201
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020202 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020203 VkFramebuffer fb;
20204 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20205 ASSERT_VK_SUCCESS(err);
20206
20207 // Record a single command buffer which uses this renderpass twice. The
20208 // bug is triggered at the beginning of the second renderpass, when the
20209 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020210 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 -070020211 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020212 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20213 vkCmdEndRenderPass(m_commandBuffer->handle());
20214 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20215
20216 m_errorMonitor->VerifyNotFound();
20217
20218 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020219 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020220
20221 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20222 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20223 vkDestroyImageView(m_device->device(), view, nullptr);
20224}
20225
20226TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020227 TEST_DESCRIPTION(
20228 "This test should pass. Create a Framebuffer and "
20229 "command buffer, bind them together, then destroy "
20230 "command pool and framebuffer and verify there are no "
20231 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020232
20233 m_errorMonitor->ExpectSuccess();
20234
Tony Barbour1fa09702017-03-16 12:09:08 -060020235 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020236
20237 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020238 VkAttachmentDescription attachment = {0,
20239 VK_FORMAT_R8G8B8A8_UNORM,
20240 VK_SAMPLE_COUNT_1_BIT,
20241 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20242 VK_ATTACHMENT_STORE_OP_STORE,
20243 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20244 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20245 VK_IMAGE_LAYOUT_UNDEFINED,
20246 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020247
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020248 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020249
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020250 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020251
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020252 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020253
20254 VkRenderPass rp;
20255 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20256 ASSERT_VK_SUCCESS(err);
20257
20258 // A compatible framebuffer.
20259 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020260 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 -060020261 ASSERT_TRUE(image.initialized());
20262
20263 VkImageViewCreateInfo ivci = {
20264 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20265 nullptr,
20266 0,
20267 image.handle(),
20268 VK_IMAGE_VIEW_TYPE_2D,
20269 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020270 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20271 VK_COMPONENT_SWIZZLE_IDENTITY},
20272 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020273 };
20274 VkImageView view;
20275 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20276 ASSERT_VK_SUCCESS(err);
20277
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020278 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020279 VkFramebuffer fb;
20280 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20281 ASSERT_VK_SUCCESS(err);
20282
20283 // Explicitly create a command buffer to bind the FB to so that we can then
20284 // destroy the command pool in order to implicitly free command buffer
20285 VkCommandPool command_pool;
20286 VkCommandPoolCreateInfo pool_create_info{};
20287 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20288 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20289 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20290 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20291
20292 VkCommandBuffer command_buffer;
20293 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20294 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20295 command_buffer_allocate_info.commandPool = command_pool;
20296 command_buffer_allocate_info.commandBufferCount = 1;
20297 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20298 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20299
20300 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020301 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 -060020302 VkCommandBufferBeginInfo begin_info{};
20303 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20304 vkBeginCommandBuffer(command_buffer, &begin_info);
20305
20306 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20307 vkCmdEndRenderPass(command_buffer);
20308 vkEndCommandBuffer(command_buffer);
20309 vkDestroyImageView(m_device->device(), view, nullptr);
20310 // Destroy command pool to implicitly free command buffer
20311 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20312 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20313 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20314 m_errorMonitor->VerifyNotFound();
20315}
20316
20317TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020318 TEST_DESCRIPTION(
20319 "Ensure that CmdBeginRenderPass applies the layout "
20320 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020321
20322 m_errorMonitor->ExpectSuccess();
20323
Tony Barbour1fa09702017-03-16 12:09:08 -060020324 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020325
20326 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020327 VkAttachmentDescription attachment = {0,
20328 VK_FORMAT_R8G8B8A8_UNORM,
20329 VK_SAMPLE_COUNT_1_BIT,
20330 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20331 VK_ATTACHMENT_STORE_OP_STORE,
20332 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20333 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20334 VK_IMAGE_LAYOUT_UNDEFINED,
20335 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020336
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020337 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020338
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020339 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020340
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020341 VkSubpassDependency dep = {0,
20342 0,
20343 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20344 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20345 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20346 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20347 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020348
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020349 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020350
20351 VkResult err;
20352 VkRenderPass rp;
20353 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20354 ASSERT_VK_SUCCESS(err);
20355
20356 // A compatible framebuffer.
20357 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020358 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 -060020359 ASSERT_TRUE(image.initialized());
20360
20361 VkImageViewCreateInfo ivci = {
20362 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20363 nullptr,
20364 0,
20365 image.handle(),
20366 VK_IMAGE_VIEW_TYPE_2D,
20367 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020368 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20369 VK_COMPONENT_SWIZZLE_IDENTITY},
20370 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020371 };
20372 VkImageView view;
20373 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20374 ASSERT_VK_SUCCESS(err);
20375
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020376 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020377 VkFramebuffer fb;
20378 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20379 ASSERT_VK_SUCCESS(err);
20380
20381 // Record a single command buffer which issues a pipeline barrier w/
20382 // image memory barrier for the attachment. This detects the previously
20383 // missing tracking of the subpass layout by throwing a validation error
20384 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020385 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 -070020386 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020387 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20388
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020389 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20390 nullptr,
20391 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20392 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20393 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20394 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20395 VK_QUEUE_FAMILY_IGNORED,
20396 VK_QUEUE_FAMILY_IGNORED,
20397 image.handle(),
20398 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020399 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020400 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20401 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020402
20403 vkCmdEndRenderPass(m_commandBuffer->handle());
20404 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020405 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020406
20407 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20408 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20409 vkDestroyImageView(m_device->device(), view, nullptr);
20410}
20411
20412TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020413 TEST_DESCRIPTION(
20414 "Validate that when an imageView of a depth/stencil image "
20415 "is used as a depth/stencil framebuffer attachment, the "
20416 "aspectMask is ignored and both depth and stencil image "
20417 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020418
Tony Barbour1fa09702017-03-16 12:09:08 -060020419 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020420 VkFormatProperties format_properties;
20421 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20422 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20423 return;
20424 }
20425
20426 m_errorMonitor->ExpectSuccess();
20427
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020428 VkAttachmentDescription attachment = {0,
20429 VK_FORMAT_D32_SFLOAT_S8_UINT,
20430 VK_SAMPLE_COUNT_1_BIT,
20431 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20432 VK_ATTACHMENT_STORE_OP_STORE,
20433 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20434 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20435 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20436 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020437
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020438 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020439
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020440 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020441
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020442 VkSubpassDependency dep = {0,
20443 0,
20444 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20445 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20446 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20447 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20448 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020449
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020450 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020451
20452 VkResult err;
20453 VkRenderPass rp;
20454 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20455 ASSERT_VK_SUCCESS(err);
20456
20457 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020458 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20459 0x26, // usage
20460 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020461 ASSERT_TRUE(image.initialized());
20462 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20463
20464 VkImageViewCreateInfo ivci = {
20465 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20466 nullptr,
20467 0,
20468 image.handle(),
20469 VK_IMAGE_VIEW_TYPE_2D,
20470 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020471 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20472 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020473 };
20474 VkImageView view;
20475 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20476 ASSERT_VK_SUCCESS(err);
20477
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020478 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020479 VkFramebuffer fb;
20480 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20481 ASSERT_VK_SUCCESS(err);
20482
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020483 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 -070020484 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020485 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20486
20487 VkImageMemoryBarrier imb = {};
20488 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20489 imb.pNext = nullptr;
20490 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20491 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20492 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20493 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20494 imb.srcQueueFamilyIndex = 0;
20495 imb.dstQueueFamilyIndex = 0;
20496 imb.image = image.handle();
20497 imb.subresourceRange.aspectMask = 0x6;
20498 imb.subresourceRange.baseMipLevel = 0;
20499 imb.subresourceRange.levelCount = 0x1;
20500 imb.subresourceRange.baseArrayLayer = 0;
20501 imb.subresourceRange.layerCount = 0x1;
20502
20503 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020504 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20505 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020506
20507 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020508 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020509 QueueCommandBuffer(false);
20510 m_errorMonitor->VerifyNotFound();
20511
20512 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20513 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20514 vkDestroyImageView(m_device->device(), view, nullptr);
20515}
20516
20517TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020518 TEST_DESCRIPTION(
20519 "Ensure that layout transitions work correctly without "
20520 "errors, when an attachment reference is "
20521 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020522
20523 m_errorMonitor->ExpectSuccess();
20524
Tony Barbour1fa09702017-03-16 12:09:08 -060020525 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020526
20527 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020528 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020529
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020530 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020531
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020532 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020533
20534 VkRenderPass rp;
20535 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20536 ASSERT_VK_SUCCESS(err);
20537
20538 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020539 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020540 VkFramebuffer fb;
20541 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20542 ASSERT_VK_SUCCESS(err);
20543
20544 // Record a command buffer which just begins and ends the renderpass. The
20545 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020546 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 -070020547 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020548 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20549 vkCmdEndRenderPass(m_commandBuffer->handle());
20550 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020551 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020552
20553 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20554 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20555}
20556
20557// This is a positive test. No errors are expected.
20558TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020559 TEST_DESCRIPTION(
20560 "Create a stencil-only attachment with a LOAD_OP set to "
20561 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020562 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020563 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020564 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020565 if (!depth_format) {
20566 printf(" No Depth + Stencil format found. Skipped.\n");
20567 return;
20568 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020569 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020570 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020571 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20572 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020573 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20574 return;
20575 }
20576
Tony Barbourf887b162017-03-09 10:06:46 -070020577 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020578 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020579 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020580 VkAttachmentDescription att = {};
20581 VkAttachmentReference ref = {};
20582 att.format = depth_stencil_fmt;
20583 att.samples = VK_SAMPLE_COUNT_1_BIT;
20584 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20585 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20586 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20587 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20588 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20589 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20590
20591 VkClearValue clear;
20592 clear.depthStencil.depth = 1.0;
20593 clear.depthStencil.stencil = 0;
20594 ref.attachment = 0;
20595 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20596
20597 VkSubpassDescription subpass = {};
20598 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20599 subpass.flags = 0;
20600 subpass.inputAttachmentCount = 0;
20601 subpass.pInputAttachments = NULL;
20602 subpass.colorAttachmentCount = 0;
20603 subpass.pColorAttachments = NULL;
20604 subpass.pResolveAttachments = NULL;
20605 subpass.pDepthStencilAttachment = &ref;
20606 subpass.preserveAttachmentCount = 0;
20607 subpass.pPreserveAttachments = NULL;
20608
20609 VkRenderPass rp;
20610 VkRenderPassCreateInfo rp_info = {};
20611 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20612 rp_info.attachmentCount = 1;
20613 rp_info.pAttachments = &att;
20614 rp_info.subpassCount = 1;
20615 rp_info.pSubpasses = &subpass;
20616 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20617 ASSERT_VK_SUCCESS(result);
20618
20619 VkImageView *depthView = m_depthStencil->BindInfo();
20620 VkFramebufferCreateInfo fb_info = {};
20621 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20622 fb_info.pNext = NULL;
20623 fb_info.renderPass = rp;
20624 fb_info.attachmentCount = 1;
20625 fb_info.pAttachments = depthView;
20626 fb_info.width = 100;
20627 fb_info.height = 100;
20628 fb_info.layers = 1;
20629 VkFramebuffer fb;
20630 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20631 ASSERT_VK_SUCCESS(result);
20632
20633 VkRenderPassBeginInfo rpbinfo = {};
20634 rpbinfo.clearValueCount = 1;
20635 rpbinfo.pClearValues = &clear;
20636 rpbinfo.pNext = NULL;
20637 rpbinfo.renderPass = rp;
20638 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20639 rpbinfo.renderArea.extent.width = 100;
20640 rpbinfo.renderArea.extent.height = 100;
20641 rpbinfo.renderArea.offset.x = 0;
20642 rpbinfo.renderArea.offset.y = 0;
20643 rpbinfo.framebuffer = fb;
20644
20645 VkFence fence = {};
20646 VkFenceCreateInfo fence_ci = {};
20647 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20648 fence_ci.pNext = nullptr;
20649 fence_ci.flags = 0;
20650 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20651 ASSERT_VK_SUCCESS(result);
20652
20653 m_commandBuffer->BeginCommandBuffer();
20654 m_commandBuffer->BeginRenderPass(rpbinfo);
20655 m_commandBuffer->EndRenderPass();
20656 m_commandBuffer->EndCommandBuffer();
20657 m_commandBuffer->QueueCommandBuffer(fence);
20658
20659 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020660 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 -070020661 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020662 VkImageMemoryBarrier barrier = {};
20663 VkImageSubresourceRange range;
20664 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20665 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20666 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20667 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20668 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20669 barrier.image = m_depthStencil->handle();
20670 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20671 range.baseMipLevel = 0;
20672 range.levelCount = 1;
20673 range.baseArrayLayer = 0;
20674 range.layerCount = 1;
20675 barrier.subresourceRange = range;
20676 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20677 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20678 cmdbuf.BeginCommandBuffer();
20679 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 -070020680 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020681 barrier.srcAccessMask = 0;
20682 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20683 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20684 barrier.image = destImage.handle();
20685 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20686 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 -070020687 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020688 VkImageCopy cregion;
20689 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20690 cregion.srcSubresource.mipLevel = 0;
20691 cregion.srcSubresource.baseArrayLayer = 0;
20692 cregion.srcSubresource.layerCount = 1;
20693 cregion.srcOffset.x = 0;
20694 cregion.srcOffset.y = 0;
20695 cregion.srcOffset.z = 0;
20696 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20697 cregion.dstSubresource.mipLevel = 0;
20698 cregion.dstSubresource.baseArrayLayer = 0;
20699 cregion.dstSubresource.layerCount = 1;
20700 cregion.dstOffset.x = 0;
20701 cregion.dstOffset.y = 0;
20702 cregion.dstOffset.z = 0;
20703 cregion.extent.width = 100;
20704 cregion.extent.height = 100;
20705 cregion.extent.depth = 1;
20706 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020707 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020708 cmdbuf.EndCommandBuffer();
20709
20710 VkSubmitInfo submit_info;
20711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20712 submit_info.pNext = NULL;
20713 submit_info.waitSemaphoreCount = 0;
20714 submit_info.pWaitSemaphores = NULL;
20715 submit_info.pWaitDstStageMask = NULL;
20716 submit_info.commandBufferCount = 1;
20717 submit_info.pCommandBuffers = &cmdbuf.handle();
20718 submit_info.signalSemaphoreCount = 0;
20719 submit_info.pSignalSemaphores = NULL;
20720
20721 m_errorMonitor->ExpectSuccess();
20722 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20723 m_errorMonitor->VerifyNotFound();
20724
20725 vkQueueWaitIdle(m_device->m_queue);
20726 vkDestroyFence(m_device->device(), fence, nullptr);
20727 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20728 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20729}
20730
20731// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020732TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20733 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20734
20735 m_errorMonitor->ExpectSuccess();
20736
Tony Barbour1fa09702017-03-16 12:09:08 -060020737 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020738 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020739 if (!depth_format) {
20740 printf(" No Depth + Stencil format found. Skipped.\n");
20741 return;
20742 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020743 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20744
20745 VkImageMemoryBarrier img_barrier = {};
20746 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20747 img_barrier.pNext = NULL;
20748 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20749 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20750 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20751 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20752 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20753 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20754 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20755 img_barrier.subresourceRange.baseArrayLayer = 0;
20756 img_barrier.subresourceRange.baseMipLevel = 0;
20757 img_barrier.subresourceRange.layerCount = 1;
20758 img_barrier.subresourceRange.levelCount = 1;
20759
20760 {
20761 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020762 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 -070020763 ASSERT_TRUE(img_color.initialized());
20764
20765 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020766 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 -070020767 ASSERT_TRUE(img_ds1.initialized());
20768
20769 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020770 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 -070020771 ASSERT_TRUE(img_ds2.initialized());
20772
20773 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020774 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 -070020775 ASSERT_TRUE(img_xfer_src.initialized());
20776
20777 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020778 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 -070020779 ASSERT_TRUE(img_xfer_dst.initialized());
20780
20781 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020782 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 -070020783 ASSERT_TRUE(img_sampled.initialized());
20784
20785 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020786 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 -070020787 ASSERT_TRUE(img_input.initialized());
20788
20789 const struct {
20790 VkImageObj &image_obj;
20791 VkImageLayout old_layout;
20792 VkImageLayout new_layout;
20793 } buffer_layouts[] = {
20794 // clang-format off
20795 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20796 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20797 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20798 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20799 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20800 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20801 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20802 // clang-format on
20803 };
20804 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20805
20806 m_commandBuffer->BeginCommandBuffer();
20807 for (uint32_t i = 0; i < layout_count; ++i) {
20808 img_barrier.image = buffer_layouts[i].image_obj.handle();
20809 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20810 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20811 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20812 : VK_IMAGE_ASPECT_COLOR_BIT;
20813
20814 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20815 img_barrier.newLayout = buffer_layouts[i].new_layout;
20816 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20817 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20818
20819 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20820 img_barrier.newLayout = buffer_layouts[i].old_layout;
20821 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20822 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20823 }
20824 m_commandBuffer->EndCommandBuffer();
20825
20826 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20827 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20828 }
20829 m_errorMonitor->VerifyNotFound();
20830}
20831
20832// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020833TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20834 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20835
20836 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020837 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020838
20839 VkEvent event;
20840 VkEventCreateInfo event_create_info{};
20841 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20842 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20843
20844 VkCommandPool command_pool;
20845 VkCommandPoolCreateInfo pool_create_info{};
20846 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20847 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20848 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20849 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20850
20851 VkCommandBuffer command_buffer;
20852 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20853 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20854 command_buffer_allocate_info.commandPool = command_pool;
20855 command_buffer_allocate_info.commandBufferCount = 1;
20856 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20857 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20858
20859 VkQueue queue = VK_NULL_HANDLE;
20860 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20861
20862 {
20863 VkCommandBufferBeginInfo begin_info{};
20864 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20865 vkBeginCommandBuffer(command_buffer, &begin_info);
20866
20867 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 -070020868 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020869 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20870 vkEndCommandBuffer(command_buffer);
20871 }
20872 {
20873 VkSubmitInfo submit_info{};
20874 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20875 submit_info.commandBufferCount = 1;
20876 submit_info.pCommandBuffers = &command_buffer;
20877 submit_info.signalSemaphoreCount = 0;
20878 submit_info.pSignalSemaphores = nullptr;
20879 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20880 }
20881 { vkSetEvent(m_device->device(), event); }
20882
20883 vkQueueWaitIdle(queue);
20884
20885 vkDestroyEvent(m_device->device(), event, nullptr);
20886 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20887 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20888
20889 m_errorMonitor->VerifyNotFound();
20890}
20891// This is a positive test. No errors should be generated.
20892TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20893 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20894
Tony Barbour1fa09702017-03-16 12:09:08 -060020895 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020896 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020897
20898 m_errorMonitor->ExpectSuccess();
20899
20900 VkQueryPool query_pool;
20901 VkQueryPoolCreateInfo query_pool_create_info{};
20902 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20903 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20904 query_pool_create_info.queryCount = 1;
20905 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20906
20907 VkCommandPool command_pool;
20908 VkCommandPoolCreateInfo pool_create_info{};
20909 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20910 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20911 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20912 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20913
20914 VkCommandBuffer command_buffer;
20915 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20916 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20917 command_buffer_allocate_info.commandPool = command_pool;
20918 command_buffer_allocate_info.commandBufferCount = 1;
20919 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20920 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20921
20922 VkCommandBuffer secondary_command_buffer;
20923 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20924 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20925
20926 VkQueue queue = VK_NULL_HANDLE;
20927 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20928
20929 uint32_t qfi = 0;
20930 VkBufferCreateInfo buff_create_info = {};
20931 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20932 buff_create_info.size = 1024;
20933 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20934 buff_create_info.queueFamilyIndexCount = 1;
20935 buff_create_info.pQueueFamilyIndices = &qfi;
20936
20937 VkResult err;
20938 VkBuffer buffer;
20939 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20940 ASSERT_VK_SUCCESS(err);
20941 VkMemoryAllocateInfo mem_alloc = {};
20942 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20943 mem_alloc.pNext = NULL;
20944 mem_alloc.allocationSize = 1024;
20945 mem_alloc.memoryTypeIndex = 0;
20946
20947 VkMemoryRequirements memReqs;
20948 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20949 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20950 if (!pass) {
20951 vkDestroyBuffer(m_device->device(), buffer, NULL);
20952 return;
20953 }
20954
20955 VkDeviceMemory mem;
20956 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20957 ASSERT_VK_SUCCESS(err);
20958 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20959 ASSERT_VK_SUCCESS(err);
20960
20961 VkCommandBufferInheritanceInfo hinfo = {};
20962 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20963 hinfo.renderPass = VK_NULL_HANDLE;
20964 hinfo.subpass = 0;
20965 hinfo.framebuffer = VK_NULL_HANDLE;
20966 hinfo.occlusionQueryEnable = VK_FALSE;
20967 hinfo.queryFlags = 0;
20968 hinfo.pipelineStatistics = 0;
20969
20970 {
20971 VkCommandBufferBeginInfo begin_info{};
20972 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20973 begin_info.pInheritanceInfo = &hinfo;
20974 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20975
20976 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20977 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20978
20979 vkEndCommandBuffer(secondary_command_buffer);
20980
20981 begin_info.pInheritanceInfo = nullptr;
20982 vkBeginCommandBuffer(command_buffer, &begin_info);
20983
20984 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20985 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20986
20987 vkEndCommandBuffer(command_buffer);
20988 }
20989 {
20990 VkSubmitInfo submit_info{};
20991 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20992 submit_info.commandBufferCount = 1;
20993 submit_info.pCommandBuffers = &command_buffer;
20994 submit_info.signalSemaphoreCount = 0;
20995 submit_info.pSignalSemaphores = nullptr;
20996 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20997 }
20998
20999 vkQueueWaitIdle(queue);
21000
21001 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21002 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21003 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21004 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21005 vkDestroyBuffer(m_device->device(), buffer, NULL);
21006 vkFreeMemory(m_device->device(), mem, NULL);
21007
21008 m_errorMonitor->VerifyNotFound();
21009}
21010
21011// This is a positive test. No errors should be generated.
21012TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21013 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21014
Tony Barbour1fa09702017-03-16 12:09:08 -060021015 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021016 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021017
21018 m_errorMonitor->ExpectSuccess();
21019
21020 VkQueryPool query_pool;
21021 VkQueryPoolCreateInfo query_pool_create_info{};
21022 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21023 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21024 query_pool_create_info.queryCount = 1;
21025 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21026
21027 VkCommandPool command_pool;
21028 VkCommandPoolCreateInfo pool_create_info{};
21029 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21030 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21031 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21032 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21033
21034 VkCommandBuffer command_buffer[2];
21035 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21036 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21037 command_buffer_allocate_info.commandPool = command_pool;
21038 command_buffer_allocate_info.commandBufferCount = 2;
21039 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21040 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21041
21042 VkQueue queue = VK_NULL_HANDLE;
21043 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21044
21045 uint32_t qfi = 0;
21046 VkBufferCreateInfo buff_create_info = {};
21047 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21048 buff_create_info.size = 1024;
21049 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21050 buff_create_info.queueFamilyIndexCount = 1;
21051 buff_create_info.pQueueFamilyIndices = &qfi;
21052
21053 VkResult err;
21054 VkBuffer buffer;
21055 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21056 ASSERT_VK_SUCCESS(err);
21057 VkMemoryAllocateInfo mem_alloc = {};
21058 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21059 mem_alloc.pNext = NULL;
21060 mem_alloc.allocationSize = 1024;
21061 mem_alloc.memoryTypeIndex = 0;
21062
21063 VkMemoryRequirements memReqs;
21064 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21065 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21066 if (!pass) {
21067 vkDestroyBuffer(m_device->device(), buffer, NULL);
21068 return;
21069 }
21070
21071 VkDeviceMemory mem;
21072 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21073 ASSERT_VK_SUCCESS(err);
21074 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21075 ASSERT_VK_SUCCESS(err);
21076
21077 {
21078 VkCommandBufferBeginInfo begin_info{};
21079 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21080 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21081
21082 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21083 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21084
21085 vkEndCommandBuffer(command_buffer[0]);
21086
21087 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21088
21089 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21090
21091 vkEndCommandBuffer(command_buffer[1]);
21092 }
21093 {
21094 VkSubmitInfo submit_info{};
21095 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21096 submit_info.commandBufferCount = 2;
21097 submit_info.pCommandBuffers = command_buffer;
21098 submit_info.signalSemaphoreCount = 0;
21099 submit_info.pSignalSemaphores = nullptr;
21100 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21101 }
21102
21103 vkQueueWaitIdle(queue);
21104
21105 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21106 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21107 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21108 vkDestroyBuffer(m_device->device(), buffer, NULL);
21109 vkFreeMemory(m_device->device(), mem, NULL);
21110
21111 m_errorMonitor->VerifyNotFound();
21112}
21113
Tony Barbourc46924f2016-11-04 11:49:52 -060021114TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021115 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21116
Tony Barbour1fa09702017-03-16 12:09:08 -060021117 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021118 VkEvent event;
21119 VkEventCreateInfo event_create_info{};
21120 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21121 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21122
21123 VkCommandPool command_pool;
21124 VkCommandPoolCreateInfo pool_create_info{};
21125 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21126 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21127 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21128 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21129
21130 VkCommandBuffer command_buffer;
21131 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21132 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21133 command_buffer_allocate_info.commandPool = command_pool;
21134 command_buffer_allocate_info.commandBufferCount = 1;
21135 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21136 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21137
21138 VkQueue queue = VK_NULL_HANDLE;
21139 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21140
21141 {
21142 VkCommandBufferBeginInfo begin_info{};
21143 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21144 vkBeginCommandBuffer(command_buffer, &begin_info);
21145
21146 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021147 vkEndCommandBuffer(command_buffer);
21148 }
21149 {
21150 VkSubmitInfo submit_info{};
21151 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21152 submit_info.commandBufferCount = 1;
21153 submit_info.pCommandBuffers = &command_buffer;
21154 submit_info.signalSemaphoreCount = 0;
21155 submit_info.pSignalSemaphores = nullptr;
21156 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21157 }
21158 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21160 "that is already in use by a "
21161 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021162 vkSetEvent(m_device->device(), event);
21163 m_errorMonitor->VerifyFound();
21164 }
21165
21166 vkQueueWaitIdle(queue);
21167
21168 vkDestroyEvent(m_device->device(), event, nullptr);
21169 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21170 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21171}
21172
21173// This is a positive test. No errors should be generated.
21174TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021175 TEST_DESCRIPTION(
21176 "Two command buffers with two separate fences are each "
21177 "run through a Submit & WaitForFences cycle 3 times. This "
21178 "previously revealed a bug so running this positive test "
21179 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021180 m_errorMonitor->ExpectSuccess();
21181
Tony Barbour1fa09702017-03-16 12:09:08 -060021182 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021183 VkQueue queue = VK_NULL_HANDLE;
21184 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21185
21186 static const uint32_t NUM_OBJECTS = 2;
21187 static const uint32_t NUM_FRAMES = 3;
21188 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21189 VkFence fences[NUM_OBJECTS] = {};
21190
21191 VkCommandPool cmd_pool;
21192 VkCommandPoolCreateInfo cmd_pool_ci = {};
21193 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21194 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
21195 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21196 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
21197 ASSERT_VK_SUCCESS(err);
21198
21199 VkCommandBufferAllocateInfo cmd_buf_info = {};
21200 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21201 cmd_buf_info.commandPool = cmd_pool;
21202 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21203 cmd_buf_info.commandBufferCount = 1;
21204
21205 VkFenceCreateInfo fence_ci = {};
21206 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21207 fence_ci.pNext = nullptr;
21208 fence_ci.flags = 0;
21209
21210 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21211 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21212 ASSERT_VK_SUCCESS(err);
21213 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21214 ASSERT_VK_SUCCESS(err);
21215 }
21216
21217 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21218 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21219 // Create empty cmd buffer
21220 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21221 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21222
21223 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21224 ASSERT_VK_SUCCESS(err);
21225 err = vkEndCommandBuffer(cmd_buffers[obj]);
21226 ASSERT_VK_SUCCESS(err);
21227
21228 VkSubmitInfo submit_info = {};
21229 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21230 submit_info.commandBufferCount = 1;
21231 submit_info.pCommandBuffers = &cmd_buffers[obj];
21232 // Submit cmd buffer and wait for fence
21233 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21234 ASSERT_VK_SUCCESS(err);
21235 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21236 ASSERT_VK_SUCCESS(err);
21237 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21238 ASSERT_VK_SUCCESS(err);
21239 }
21240 }
21241 m_errorMonitor->VerifyNotFound();
21242 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21243 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21244 vkDestroyFence(m_device->device(), fences[i], nullptr);
21245 }
21246}
21247// This is a positive test. No errors should be generated.
21248TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021249 TEST_DESCRIPTION(
21250 "Two command buffers, each in a separate QueueSubmit call "
21251 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021252
Tony Barbour1fa09702017-03-16 12:09:08 -060021253 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021254 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021255
21256 m_errorMonitor->ExpectSuccess();
21257
21258 VkSemaphore semaphore;
21259 VkSemaphoreCreateInfo semaphore_create_info{};
21260 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21261 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21262
21263 VkCommandPool command_pool;
21264 VkCommandPoolCreateInfo pool_create_info{};
21265 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21266 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21267 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21268 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21269
21270 VkCommandBuffer command_buffer[2];
21271 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21272 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21273 command_buffer_allocate_info.commandPool = command_pool;
21274 command_buffer_allocate_info.commandBufferCount = 2;
21275 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21276 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21277
21278 VkQueue queue = VK_NULL_HANDLE;
21279 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21280
21281 {
21282 VkCommandBufferBeginInfo begin_info{};
21283 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21284 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21285
21286 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 -070021287 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021288
21289 VkViewport viewport{};
21290 viewport.maxDepth = 1.0f;
21291 viewport.minDepth = 0.0f;
21292 viewport.width = 512;
21293 viewport.height = 512;
21294 viewport.x = 0;
21295 viewport.y = 0;
21296 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21297 vkEndCommandBuffer(command_buffer[0]);
21298 }
21299 {
21300 VkCommandBufferBeginInfo begin_info{};
21301 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21302 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21303
21304 VkViewport viewport{};
21305 viewport.maxDepth = 1.0f;
21306 viewport.minDepth = 0.0f;
21307 viewport.width = 512;
21308 viewport.height = 512;
21309 viewport.x = 0;
21310 viewport.y = 0;
21311 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21312 vkEndCommandBuffer(command_buffer[1]);
21313 }
21314 {
21315 VkSubmitInfo submit_info{};
21316 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21317 submit_info.commandBufferCount = 1;
21318 submit_info.pCommandBuffers = &command_buffer[0];
21319 submit_info.signalSemaphoreCount = 1;
21320 submit_info.pSignalSemaphores = &semaphore;
21321 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21322 }
21323 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021324 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021325 VkSubmitInfo submit_info{};
21326 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21327 submit_info.commandBufferCount = 1;
21328 submit_info.pCommandBuffers = &command_buffer[1];
21329 submit_info.waitSemaphoreCount = 1;
21330 submit_info.pWaitSemaphores = &semaphore;
21331 submit_info.pWaitDstStageMask = flags;
21332 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21333 }
21334
21335 vkQueueWaitIdle(m_device->m_queue);
21336
21337 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21338 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21339 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21340
21341 m_errorMonitor->VerifyNotFound();
21342}
21343
21344// This is a positive test. No errors should be generated.
21345TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021346 TEST_DESCRIPTION(
21347 "Two command buffers, each in a separate QueueSubmit call "
21348 "submitted on separate queues, the second having a fence"
21349 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021350
Tony Barbour1fa09702017-03-16 12:09:08 -060021351 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021352 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021353
21354 m_errorMonitor->ExpectSuccess();
21355
21356 VkFence fence;
21357 VkFenceCreateInfo fence_create_info{};
21358 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21359 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21360
21361 VkSemaphore semaphore;
21362 VkSemaphoreCreateInfo semaphore_create_info{};
21363 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21364 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21365
21366 VkCommandPool command_pool;
21367 VkCommandPoolCreateInfo pool_create_info{};
21368 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21369 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21370 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21371 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21372
21373 VkCommandBuffer command_buffer[2];
21374 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21375 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21376 command_buffer_allocate_info.commandPool = command_pool;
21377 command_buffer_allocate_info.commandBufferCount = 2;
21378 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21379 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21380
21381 VkQueue queue = VK_NULL_HANDLE;
21382 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21383
21384 {
21385 VkCommandBufferBeginInfo begin_info{};
21386 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21387 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21388
21389 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 -070021390 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021391
21392 VkViewport viewport{};
21393 viewport.maxDepth = 1.0f;
21394 viewport.minDepth = 0.0f;
21395 viewport.width = 512;
21396 viewport.height = 512;
21397 viewport.x = 0;
21398 viewport.y = 0;
21399 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21400 vkEndCommandBuffer(command_buffer[0]);
21401 }
21402 {
21403 VkCommandBufferBeginInfo begin_info{};
21404 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21405 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21406
21407 VkViewport viewport{};
21408 viewport.maxDepth = 1.0f;
21409 viewport.minDepth = 0.0f;
21410 viewport.width = 512;
21411 viewport.height = 512;
21412 viewport.x = 0;
21413 viewport.y = 0;
21414 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21415 vkEndCommandBuffer(command_buffer[1]);
21416 }
21417 {
21418 VkSubmitInfo submit_info{};
21419 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21420 submit_info.commandBufferCount = 1;
21421 submit_info.pCommandBuffers = &command_buffer[0];
21422 submit_info.signalSemaphoreCount = 1;
21423 submit_info.pSignalSemaphores = &semaphore;
21424 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21425 }
21426 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021427 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021428 VkSubmitInfo submit_info{};
21429 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21430 submit_info.commandBufferCount = 1;
21431 submit_info.pCommandBuffers = &command_buffer[1];
21432 submit_info.waitSemaphoreCount = 1;
21433 submit_info.pWaitSemaphores = &semaphore;
21434 submit_info.pWaitDstStageMask = flags;
21435 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21436 }
21437
21438 vkQueueWaitIdle(m_device->m_queue);
21439
21440 vkDestroyFence(m_device->device(), fence, nullptr);
21441 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21442 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21443 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21444
21445 m_errorMonitor->VerifyNotFound();
21446}
21447
21448// This is a positive test. No errors should be generated.
21449TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021450 TEST_DESCRIPTION(
21451 "Two command buffers, each in a separate QueueSubmit call "
21452 "submitted on separate queues, the second having a fence"
21453 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021454
Tony Barbour1fa09702017-03-16 12:09:08 -060021455 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021456 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021457
21458 m_errorMonitor->ExpectSuccess();
21459
21460 VkFence fence;
21461 VkFenceCreateInfo fence_create_info{};
21462 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21463 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21464
21465 VkSemaphore semaphore;
21466 VkSemaphoreCreateInfo semaphore_create_info{};
21467 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21468 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21469
21470 VkCommandPool command_pool;
21471 VkCommandPoolCreateInfo pool_create_info{};
21472 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21473 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21474 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21475 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21476
21477 VkCommandBuffer command_buffer[2];
21478 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21479 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21480 command_buffer_allocate_info.commandPool = command_pool;
21481 command_buffer_allocate_info.commandBufferCount = 2;
21482 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21483 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21484
21485 VkQueue queue = VK_NULL_HANDLE;
21486 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21487
21488 {
21489 VkCommandBufferBeginInfo begin_info{};
21490 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21491 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21492
21493 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 -070021494 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021495
21496 VkViewport viewport{};
21497 viewport.maxDepth = 1.0f;
21498 viewport.minDepth = 0.0f;
21499 viewport.width = 512;
21500 viewport.height = 512;
21501 viewport.x = 0;
21502 viewport.y = 0;
21503 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21504 vkEndCommandBuffer(command_buffer[0]);
21505 }
21506 {
21507 VkCommandBufferBeginInfo begin_info{};
21508 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21509 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21510
21511 VkViewport viewport{};
21512 viewport.maxDepth = 1.0f;
21513 viewport.minDepth = 0.0f;
21514 viewport.width = 512;
21515 viewport.height = 512;
21516 viewport.x = 0;
21517 viewport.y = 0;
21518 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21519 vkEndCommandBuffer(command_buffer[1]);
21520 }
21521 {
21522 VkSubmitInfo submit_info{};
21523 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21524 submit_info.commandBufferCount = 1;
21525 submit_info.pCommandBuffers = &command_buffer[0];
21526 submit_info.signalSemaphoreCount = 1;
21527 submit_info.pSignalSemaphores = &semaphore;
21528 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21529 }
21530 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021531 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021532 VkSubmitInfo submit_info{};
21533 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21534 submit_info.commandBufferCount = 1;
21535 submit_info.pCommandBuffers = &command_buffer[1];
21536 submit_info.waitSemaphoreCount = 1;
21537 submit_info.pWaitSemaphores = &semaphore;
21538 submit_info.pWaitDstStageMask = flags;
21539 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21540 }
21541
21542 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21543 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21544
21545 vkDestroyFence(m_device->device(), fence, nullptr);
21546 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21547 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21548 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21549
21550 m_errorMonitor->VerifyNotFound();
21551}
21552
21553TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021554 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021555 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021556 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021557 return;
21558 }
21559
21560 VkResult err;
21561
21562 m_errorMonitor->ExpectSuccess();
21563
21564 VkQueue q0 = m_device->m_queue;
21565 VkQueue q1 = nullptr;
21566 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21567 ASSERT_NE(q1, nullptr);
21568
21569 // An (empty) command buffer. We must have work in the first submission --
21570 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021571 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021572 VkCommandPool pool;
21573 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21574 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021575 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21576 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021577 VkCommandBuffer cb;
21578 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21579 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021580 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021581 err = vkBeginCommandBuffer(cb, &cbbi);
21582 ASSERT_VK_SUCCESS(err);
21583 err = vkEndCommandBuffer(cb);
21584 ASSERT_VK_SUCCESS(err);
21585
21586 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021587 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021588 VkSemaphore s;
21589 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21590 ASSERT_VK_SUCCESS(err);
21591
21592 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021593 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021594
21595 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21596 ASSERT_VK_SUCCESS(err);
21597
21598 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021599 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021600 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021601
21602 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21603 ASSERT_VK_SUCCESS(err);
21604
21605 // Wait for q0 idle
21606 err = vkQueueWaitIdle(q0);
21607 ASSERT_VK_SUCCESS(err);
21608
21609 // Command buffer should have been completed (it was on q0); reset the pool.
21610 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21611
21612 m_errorMonitor->VerifyNotFound();
21613
21614 // Force device completely idle and clean up resources
21615 vkDeviceWaitIdle(m_device->device());
21616 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21617 vkDestroySemaphore(m_device->device(), s, nullptr);
21618}
21619
21620// This is a positive test. No errors should be generated.
21621TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021622 TEST_DESCRIPTION(
21623 "Two command buffers, each in a separate QueueSubmit call "
21624 "submitted on separate queues, the second having a fence, "
21625 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021626
Tony Barbour1fa09702017-03-16 12:09:08 -060021627 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021628 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021629
21630 m_errorMonitor->ExpectSuccess();
21631
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021632 VkFence fence;
21633 VkFenceCreateInfo fence_create_info{};
21634 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21635 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21636
21637 VkSemaphore semaphore;
21638 VkSemaphoreCreateInfo semaphore_create_info{};
21639 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21640 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21641
21642 VkCommandPool command_pool;
21643 VkCommandPoolCreateInfo pool_create_info{};
21644 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21645 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21646 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21647 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21648
21649 VkCommandBuffer command_buffer[2];
21650 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21651 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21652 command_buffer_allocate_info.commandPool = command_pool;
21653 command_buffer_allocate_info.commandBufferCount = 2;
21654 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21655 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21656
21657 VkQueue queue = VK_NULL_HANDLE;
21658 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21659
21660 {
21661 VkCommandBufferBeginInfo begin_info{};
21662 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21663 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21664
21665 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 -070021666 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021667
21668 VkViewport viewport{};
21669 viewport.maxDepth = 1.0f;
21670 viewport.minDepth = 0.0f;
21671 viewport.width = 512;
21672 viewport.height = 512;
21673 viewport.x = 0;
21674 viewport.y = 0;
21675 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21676 vkEndCommandBuffer(command_buffer[0]);
21677 }
21678 {
21679 VkCommandBufferBeginInfo begin_info{};
21680 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21681 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21682
21683 VkViewport viewport{};
21684 viewport.maxDepth = 1.0f;
21685 viewport.minDepth = 0.0f;
21686 viewport.width = 512;
21687 viewport.height = 512;
21688 viewport.x = 0;
21689 viewport.y = 0;
21690 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21691 vkEndCommandBuffer(command_buffer[1]);
21692 }
21693 {
21694 VkSubmitInfo submit_info{};
21695 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21696 submit_info.commandBufferCount = 1;
21697 submit_info.pCommandBuffers = &command_buffer[0];
21698 submit_info.signalSemaphoreCount = 1;
21699 submit_info.pSignalSemaphores = &semaphore;
21700 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21701 }
21702 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021703 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021704 VkSubmitInfo submit_info{};
21705 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21706 submit_info.commandBufferCount = 1;
21707 submit_info.pCommandBuffers = &command_buffer[1];
21708 submit_info.waitSemaphoreCount = 1;
21709 submit_info.pWaitSemaphores = &semaphore;
21710 submit_info.pWaitDstStageMask = flags;
21711 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21712 }
21713
21714 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21715
21716 vkDestroyFence(m_device->device(), fence, nullptr);
21717 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21718 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21719 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21720
21721 m_errorMonitor->VerifyNotFound();
21722}
21723
21724// This is a positive test. No errors should be generated.
21725TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021726 TEST_DESCRIPTION(
21727 "Two command buffers, each in a separate QueueSubmit call "
21728 "on the same queue, sharing a signal/wait semaphore, the "
21729 "second having a fence, "
21730 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021731
21732 m_errorMonitor->ExpectSuccess();
21733
Tony Barbour1fa09702017-03-16 12:09:08 -060021734 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021735 VkFence fence;
21736 VkFenceCreateInfo fence_create_info{};
21737 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21738 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21739
21740 VkSemaphore semaphore;
21741 VkSemaphoreCreateInfo semaphore_create_info{};
21742 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21743 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21744
21745 VkCommandPool command_pool;
21746 VkCommandPoolCreateInfo pool_create_info{};
21747 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21748 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21749 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21750 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21751
21752 VkCommandBuffer command_buffer[2];
21753 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21754 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21755 command_buffer_allocate_info.commandPool = command_pool;
21756 command_buffer_allocate_info.commandBufferCount = 2;
21757 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21758 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21759
21760 {
21761 VkCommandBufferBeginInfo begin_info{};
21762 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21763 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21764
21765 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 -070021766 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021767
21768 VkViewport viewport{};
21769 viewport.maxDepth = 1.0f;
21770 viewport.minDepth = 0.0f;
21771 viewport.width = 512;
21772 viewport.height = 512;
21773 viewport.x = 0;
21774 viewport.y = 0;
21775 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21776 vkEndCommandBuffer(command_buffer[0]);
21777 }
21778 {
21779 VkCommandBufferBeginInfo begin_info{};
21780 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21781 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21782
21783 VkViewport viewport{};
21784 viewport.maxDepth = 1.0f;
21785 viewport.minDepth = 0.0f;
21786 viewport.width = 512;
21787 viewport.height = 512;
21788 viewport.x = 0;
21789 viewport.y = 0;
21790 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21791 vkEndCommandBuffer(command_buffer[1]);
21792 }
21793 {
21794 VkSubmitInfo submit_info{};
21795 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21796 submit_info.commandBufferCount = 1;
21797 submit_info.pCommandBuffers = &command_buffer[0];
21798 submit_info.signalSemaphoreCount = 1;
21799 submit_info.pSignalSemaphores = &semaphore;
21800 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21801 }
21802 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021803 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021804 VkSubmitInfo submit_info{};
21805 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21806 submit_info.commandBufferCount = 1;
21807 submit_info.pCommandBuffers = &command_buffer[1];
21808 submit_info.waitSemaphoreCount = 1;
21809 submit_info.pWaitSemaphores = &semaphore;
21810 submit_info.pWaitDstStageMask = flags;
21811 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21812 }
21813
21814 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21815
21816 vkDestroyFence(m_device->device(), fence, nullptr);
21817 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21818 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21819 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21820
21821 m_errorMonitor->VerifyNotFound();
21822}
21823
21824// This is a positive test. No errors should be generated.
21825TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021826 TEST_DESCRIPTION(
21827 "Two command buffers, each in a separate QueueSubmit call "
21828 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21829 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021830
21831 m_errorMonitor->ExpectSuccess();
21832
Tony Barbour1fa09702017-03-16 12:09:08 -060021833 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021834 VkFence fence;
21835 VkFenceCreateInfo fence_create_info{};
21836 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21837 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21838
21839 VkCommandPool command_pool;
21840 VkCommandPoolCreateInfo pool_create_info{};
21841 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21842 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21843 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21844 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21845
21846 VkCommandBuffer command_buffer[2];
21847 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21848 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21849 command_buffer_allocate_info.commandPool = command_pool;
21850 command_buffer_allocate_info.commandBufferCount = 2;
21851 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21852 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21853
21854 {
21855 VkCommandBufferBeginInfo begin_info{};
21856 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21857 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21858
21859 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 -070021860 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021861
21862 VkViewport viewport{};
21863 viewport.maxDepth = 1.0f;
21864 viewport.minDepth = 0.0f;
21865 viewport.width = 512;
21866 viewport.height = 512;
21867 viewport.x = 0;
21868 viewport.y = 0;
21869 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21870 vkEndCommandBuffer(command_buffer[0]);
21871 }
21872 {
21873 VkCommandBufferBeginInfo begin_info{};
21874 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21875 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21876
21877 VkViewport viewport{};
21878 viewport.maxDepth = 1.0f;
21879 viewport.minDepth = 0.0f;
21880 viewport.width = 512;
21881 viewport.height = 512;
21882 viewport.x = 0;
21883 viewport.y = 0;
21884 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21885 vkEndCommandBuffer(command_buffer[1]);
21886 }
21887 {
21888 VkSubmitInfo submit_info{};
21889 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21890 submit_info.commandBufferCount = 1;
21891 submit_info.pCommandBuffers = &command_buffer[0];
21892 submit_info.signalSemaphoreCount = 0;
21893 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21894 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21895 }
21896 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021897 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021898 VkSubmitInfo submit_info{};
21899 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21900 submit_info.commandBufferCount = 1;
21901 submit_info.pCommandBuffers = &command_buffer[1];
21902 submit_info.waitSemaphoreCount = 0;
21903 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21904 submit_info.pWaitDstStageMask = flags;
21905 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21906 }
21907
21908 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21909
21910 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21911 ASSERT_VK_SUCCESS(err);
21912
21913 vkDestroyFence(m_device->device(), fence, nullptr);
21914 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21915 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21916
21917 m_errorMonitor->VerifyNotFound();
21918}
21919
21920// This is a positive test. No errors should be generated.
21921TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021922 TEST_DESCRIPTION(
21923 "Two command buffers, each in a separate QueueSubmit call "
21924 "on the same queue, the second having a fence, followed "
21925 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021926
21927 m_errorMonitor->ExpectSuccess();
21928
Tony Barbour1fa09702017-03-16 12:09:08 -060021929 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021930 VkFence fence;
21931 VkFenceCreateInfo fence_create_info{};
21932 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21933 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21934
21935 VkCommandPool command_pool;
21936 VkCommandPoolCreateInfo pool_create_info{};
21937 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21938 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21939 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21940 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21941
21942 VkCommandBuffer command_buffer[2];
21943 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21944 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21945 command_buffer_allocate_info.commandPool = command_pool;
21946 command_buffer_allocate_info.commandBufferCount = 2;
21947 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21948 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21949
21950 {
21951 VkCommandBufferBeginInfo begin_info{};
21952 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21953 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21954
21955 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 -070021956 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021957
21958 VkViewport viewport{};
21959 viewport.maxDepth = 1.0f;
21960 viewport.minDepth = 0.0f;
21961 viewport.width = 512;
21962 viewport.height = 512;
21963 viewport.x = 0;
21964 viewport.y = 0;
21965 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21966 vkEndCommandBuffer(command_buffer[0]);
21967 }
21968 {
21969 VkCommandBufferBeginInfo begin_info{};
21970 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21971 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21972
21973 VkViewport viewport{};
21974 viewport.maxDepth = 1.0f;
21975 viewport.minDepth = 0.0f;
21976 viewport.width = 512;
21977 viewport.height = 512;
21978 viewport.x = 0;
21979 viewport.y = 0;
21980 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21981 vkEndCommandBuffer(command_buffer[1]);
21982 }
21983 {
21984 VkSubmitInfo submit_info{};
21985 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21986 submit_info.commandBufferCount = 1;
21987 submit_info.pCommandBuffers = &command_buffer[0];
21988 submit_info.signalSemaphoreCount = 0;
21989 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21990 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21991 }
21992 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021993 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021994 VkSubmitInfo submit_info{};
21995 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21996 submit_info.commandBufferCount = 1;
21997 submit_info.pCommandBuffers = &command_buffer[1];
21998 submit_info.waitSemaphoreCount = 0;
21999 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22000 submit_info.pWaitDstStageMask = flags;
22001 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22002 }
22003
22004 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22005
22006 vkDestroyFence(m_device->device(), fence, nullptr);
22007 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22008 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22009
22010 m_errorMonitor->VerifyNotFound();
22011}
22012
22013// This is a positive test. No errors should be generated.
22014TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022015 TEST_DESCRIPTION(
22016 "Two command buffers each in a separate SubmitInfo sent in a single "
22017 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022018 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022019
22020 m_errorMonitor->ExpectSuccess();
22021
22022 VkFence fence;
22023 VkFenceCreateInfo fence_create_info{};
22024 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22025 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22026
22027 VkSemaphore semaphore;
22028 VkSemaphoreCreateInfo semaphore_create_info{};
22029 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22030 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22031
22032 VkCommandPool command_pool;
22033 VkCommandPoolCreateInfo pool_create_info{};
22034 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22035 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22036 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22037 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22038
22039 VkCommandBuffer command_buffer[2];
22040 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22041 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22042 command_buffer_allocate_info.commandPool = command_pool;
22043 command_buffer_allocate_info.commandBufferCount = 2;
22044 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22045 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22046
22047 {
22048 VkCommandBufferBeginInfo begin_info{};
22049 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22050 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22051
22052 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 -070022053 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022054
22055 VkViewport viewport{};
22056 viewport.maxDepth = 1.0f;
22057 viewport.minDepth = 0.0f;
22058 viewport.width = 512;
22059 viewport.height = 512;
22060 viewport.x = 0;
22061 viewport.y = 0;
22062 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22063 vkEndCommandBuffer(command_buffer[0]);
22064 }
22065 {
22066 VkCommandBufferBeginInfo begin_info{};
22067 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22068 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22069
22070 VkViewport viewport{};
22071 viewport.maxDepth = 1.0f;
22072 viewport.minDepth = 0.0f;
22073 viewport.width = 512;
22074 viewport.height = 512;
22075 viewport.x = 0;
22076 viewport.y = 0;
22077 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22078 vkEndCommandBuffer(command_buffer[1]);
22079 }
22080 {
22081 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022082 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022083
22084 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22085 submit_info[0].pNext = NULL;
22086 submit_info[0].commandBufferCount = 1;
22087 submit_info[0].pCommandBuffers = &command_buffer[0];
22088 submit_info[0].signalSemaphoreCount = 1;
22089 submit_info[0].pSignalSemaphores = &semaphore;
22090 submit_info[0].waitSemaphoreCount = 0;
22091 submit_info[0].pWaitSemaphores = NULL;
22092 submit_info[0].pWaitDstStageMask = 0;
22093
22094 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22095 submit_info[1].pNext = NULL;
22096 submit_info[1].commandBufferCount = 1;
22097 submit_info[1].pCommandBuffers = &command_buffer[1];
22098 submit_info[1].waitSemaphoreCount = 1;
22099 submit_info[1].pWaitSemaphores = &semaphore;
22100 submit_info[1].pWaitDstStageMask = flags;
22101 submit_info[1].signalSemaphoreCount = 0;
22102 submit_info[1].pSignalSemaphores = NULL;
22103 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22104 }
22105
22106 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22107
22108 vkDestroyFence(m_device->device(), fence, nullptr);
22109 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22110 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22111 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22112
22113 m_errorMonitor->VerifyNotFound();
22114}
22115
22116TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22117 m_errorMonitor->ExpectSuccess();
22118
Tony Barbour1fa09702017-03-16 12:09:08 -060022119 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22121
Tony Barbour552f6c02016-12-21 14:34:07 -070022122 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022123
22124 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22125 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22126 m_errorMonitor->VerifyNotFound();
22127 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22128 m_errorMonitor->VerifyNotFound();
22129 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22130 m_errorMonitor->VerifyNotFound();
22131
22132 m_commandBuffer->EndCommandBuffer();
22133 m_errorMonitor->VerifyNotFound();
22134}
22135
22136TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022137 TEST_DESCRIPTION(
22138 "Positive test where we create a renderpass with an "
22139 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22140 "has a valid layout, and a second subpass then uses a "
22141 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022142 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022143 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022144 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022145 if (!depth_format) {
22146 printf(" No Depth + Stencil format found. Skipped.\n");
22147 return;
22148 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022149
22150 VkAttachmentReference attach[2] = {};
22151 attach[0].attachment = 0;
22152 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22153 attach[1].attachment = 0;
22154 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22155 VkSubpassDescription subpasses[2] = {};
22156 // First subpass clears DS attach on load
22157 subpasses[0].pDepthStencilAttachment = &attach[0];
22158 // 2nd subpass reads in DS as input attachment
22159 subpasses[1].inputAttachmentCount = 1;
22160 subpasses[1].pInputAttachments = &attach[1];
22161 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022162 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022163 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22164 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22165 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22166 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22167 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22168 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22169 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22170 VkRenderPassCreateInfo rpci = {};
22171 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22172 rpci.attachmentCount = 1;
22173 rpci.pAttachments = &attach_desc;
22174 rpci.subpassCount = 2;
22175 rpci.pSubpasses = subpasses;
22176
22177 // Now create RenderPass and verify no errors
22178 VkRenderPass rp;
22179 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22180 m_errorMonitor->VerifyNotFound();
22181
22182 vkDestroyRenderPass(m_device->device(), rp, NULL);
22183}
22184
Tobin Ehlis01103de2017-02-16 13:22:47 -070022185TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22186 TEST_DESCRIPTION(
22187 "Create a render pass with depth-stencil attachment where layout transition "
22188 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22189 "transition has correctly occurred at queue submit time with no validation errors.");
22190
Tony Barbour1fa09702017-03-16 12:09:08 -060022191 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022192 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022193 if (!depth_format) {
22194 printf(" No Depth + Stencil format found. Skipped.\n");
22195 return;
22196 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070022197 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070022198 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022199 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22200 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022201 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022202 return;
22203 }
22204
22205 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022206 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22207
22208 // A renderpass with one depth/stencil attachment.
22209 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022210 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022211 VK_SAMPLE_COUNT_1_BIT,
22212 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22213 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22214 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22215 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22216 VK_IMAGE_LAYOUT_UNDEFINED,
22217 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22218
22219 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22220
22221 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22222
22223 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22224
22225 VkRenderPass rp;
22226 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22227 ASSERT_VK_SUCCESS(err);
22228 // A compatible ds image.
22229 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022230 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 -070022231 ASSERT_TRUE(image.initialized());
22232
22233 VkImageViewCreateInfo ivci = {
22234 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22235 nullptr,
22236 0,
22237 image.handle(),
22238 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022239 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022240 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22241 VK_COMPONENT_SWIZZLE_IDENTITY},
22242 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22243 };
22244 VkImageView view;
22245 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22246 ASSERT_VK_SUCCESS(err);
22247
22248 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22249 VkFramebuffer fb;
22250 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22251 ASSERT_VK_SUCCESS(err);
22252
22253 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22254 m_commandBuffer->BeginCommandBuffer();
22255 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22256 vkCmdEndRenderPass(m_commandBuffer->handle());
22257 m_commandBuffer->EndCommandBuffer();
22258 QueueCommandBuffer(false);
22259 m_errorMonitor->VerifyNotFound();
22260
22261 // Cleanup
22262 vkDestroyImageView(m_device->device(), view, NULL);
22263 vkDestroyRenderPass(m_device->device(), rp, NULL);
22264 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22265}
22266
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022267TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022268 TEST_DESCRIPTION(
22269 "Test that pipeline validation accepts matrices passed "
22270 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022271 m_errorMonitor->ExpectSuccess();
22272
Tony Barbour1fa09702017-03-16 12:09:08 -060022273 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22275
22276 VkVertexInputBindingDescription input_binding;
22277 memset(&input_binding, 0, sizeof(input_binding));
22278
22279 VkVertexInputAttributeDescription input_attribs[2];
22280 memset(input_attribs, 0, sizeof(input_attribs));
22281
22282 for (int i = 0; i < 2; i++) {
22283 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22284 input_attribs[i].location = i;
22285 }
22286
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022287 char const *vsSource =
22288 "#version 450\n"
22289 "\n"
22290 "layout(location=0) in mat2x4 x;\n"
22291 "out gl_PerVertex {\n"
22292 " vec4 gl_Position;\n"
22293 "};\n"
22294 "void main(){\n"
22295 " gl_Position = x[0] + x[1];\n"
22296 "}\n";
22297 char const *fsSource =
22298 "#version 450\n"
22299 "\n"
22300 "layout(location=0) out vec4 color;\n"
22301 "void main(){\n"
22302 " color = vec4(1);\n"
22303 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022304
22305 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22306 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22307
22308 VkPipelineObj pipe(m_device);
22309 pipe.AddColorAttachment();
22310 pipe.AddShader(&vs);
22311 pipe.AddShader(&fs);
22312
22313 pipe.AddVertexInputBindings(&input_binding, 1);
22314 pipe.AddVertexInputAttribs(input_attribs, 2);
22315
22316 VkDescriptorSetObj descriptorSet(m_device);
22317 descriptorSet.AppendDummy();
22318 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22319
22320 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22321
22322 /* expect success */
22323 m_errorMonitor->VerifyNotFound();
22324}
22325
22326TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22327 m_errorMonitor->ExpectSuccess();
22328
Tony Barbour1fa09702017-03-16 12:09:08 -060022329 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022330 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22331
22332 VkVertexInputBindingDescription input_binding;
22333 memset(&input_binding, 0, sizeof(input_binding));
22334
22335 VkVertexInputAttributeDescription input_attribs[2];
22336 memset(input_attribs, 0, sizeof(input_attribs));
22337
22338 for (int i = 0; i < 2; i++) {
22339 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22340 input_attribs[i].location = i;
22341 }
22342
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022343 char const *vsSource =
22344 "#version 450\n"
22345 "\n"
22346 "layout(location=0) in vec4 x[2];\n"
22347 "out gl_PerVertex {\n"
22348 " vec4 gl_Position;\n"
22349 "};\n"
22350 "void main(){\n"
22351 " gl_Position = x[0] + x[1];\n"
22352 "}\n";
22353 char const *fsSource =
22354 "#version 450\n"
22355 "\n"
22356 "layout(location=0) out vec4 color;\n"
22357 "void main(){\n"
22358 " color = vec4(1);\n"
22359 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022360
22361 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22362 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22363
22364 VkPipelineObj pipe(m_device);
22365 pipe.AddColorAttachment();
22366 pipe.AddShader(&vs);
22367 pipe.AddShader(&fs);
22368
22369 pipe.AddVertexInputBindings(&input_binding, 1);
22370 pipe.AddVertexInputAttribs(input_attribs, 2);
22371
22372 VkDescriptorSetObj descriptorSet(m_device);
22373 descriptorSet.AppendDummy();
22374 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22375
22376 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22377
22378 m_errorMonitor->VerifyNotFound();
22379}
22380
22381TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022382 TEST_DESCRIPTION(
22383 "Test that pipeline validation accepts consuming a vertex attribute "
22384 "through multiple vertex shader inputs, each consuming a different "
22385 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022386 m_errorMonitor->ExpectSuccess();
22387
Tony Barbour1fa09702017-03-16 12:09:08 -060022388 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022389 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22390
22391 VkVertexInputBindingDescription input_binding;
22392 memset(&input_binding, 0, sizeof(input_binding));
22393
22394 VkVertexInputAttributeDescription input_attribs[3];
22395 memset(input_attribs, 0, sizeof(input_attribs));
22396
22397 for (int i = 0; i < 3; i++) {
22398 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22399 input_attribs[i].location = i;
22400 }
22401
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022402 char const *vsSource =
22403 "#version 450\n"
22404 "\n"
22405 "layout(location=0) in vec4 x;\n"
22406 "layout(location=1) in vec3 y1;\n"
22407 "layout(location=1, component=3) in float y2;\n"
22408 "layout(location=2) in vec4 z;\n"
22409 "out gl_PerVertex {\n"
22410 " vec4 gl_Position;\n"
22411 "};\n"
22412 "void main(){\n"
22413 " gl_Position = x + vec4(y1, y2) + z;\n"
22414 "}\n";
22415 char const *fsSource =
22416 "#version 450\n"
22417 "\n"
22418 "layout(location=0) out vec4 color;\n"
22419 "void main(){\n"
22420 " color = vec4(1);\n"
22421 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022422
22423 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22424 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22425
22426 VkPipelineObj pipe(m_device);
22427 pipe.AddColorAttachment();
22428 pipe.AddShader(&vs);
22429 pipe.AddShader(&fs);
22430
22431 pipe.AddVertexInputBindings(&input_binding, 1);
22432 pipe.AddVertexInputAttribs(input_attribs, 3);
22433
22434 VkDescriptorSetObj descriptorSet(m_device);
22435 descriptorSet.AppendDummy();
22436 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22437
22438 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22439
22440 m_errorMonitor->VerifyNotFound();
22441}
22442
22443TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22444 m_errorMonitor->ExpectSuccess();
22445
Tony Barbour1fa09702017-03-16 12:09:08 -060022446 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022447 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22448
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022449 char const *vsSource =
22450 "#version 450\n"
22451 "out gl_PerVertex {\n"
22452 " vec4 gl_Position;\n"
22453 "};\n"
22454 "void main(){\n"
22455 " gl_Position = vec4(0);\n"
22456 "}\n";
22457 char const *fsSource =
22458 "#version 450\n"
22459 "\n"
22460 "layout(location=0) out vec4 color;\n"
22461 "void main(){\n"
22462 " color = vec4(1);\n"
22463 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022464
22465 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22466 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22467
22468 VkPipelineObj pipe(m_device);
22469 pipe.AddColorAttachment();
22470 pipe.AddShader(&vs);
22471 pipe.AddShader(&fs);
22472
22473 VkDescriptorSetObj descriptorSet(m_device);
22474 descriptorSet.AppendDummy();
22475 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22476
22477 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22478
22479 m_errorMonitor->VerifyNotFound();
22480}
22481
22482TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022483 TEST_DESCRIPTION(
22484 "Test that pipeline validation accepts the relaxed type matching rules "
22485 "set out in 14.1.3: fundamental type must match, and producer side must "
22486 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022487 m_errorMonitor->ExpectSuccess();
22488
22489 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22490
Tony Barbour1fa09702017-03-16 12:09:08 -060022491 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22493
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022494 char const *vsSource =
22495 "#version 450\n"
22496 "out gl_PerVertex {\n"
22497 " vec4 gl_Position;\n"
22498 "};\n"
22499 "layout(location=0) out vec3 x;\n"
22500 "layout(location=1) out ivec3 y;\n"
22501 "layout(location=2) out vec3 z;\n"
22502 "void main(){\n"
22503 " gl_Position = vec4(0);\n"
22504 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22505 "}\n";
22506 char const *fsSource =
22507 "#version 450\n"
22508 "\n"
22509 "layout(location=0) out vec4 color;\n"
22510 "layout(location=0) in float x;\n"
22511 "layout(location=1) flat in int y;\n"
22512 "layout(location=2) in vec2 z;\n"
22513 "void main(){\n"
22514 " color = vec4(1 + x + y + z.x);\n"
22515 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022516
22517 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22518 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22519
22520 VkPipelineObj pipe(m_device);
22521 pipe.AddColorAttachment();
22522 pipe.AddShader(&vs);
22523 pipe.AddShader(&fs);
22524
22525 VkDescriptorSetObj descriptorSet(m_device);
22526 descriptorSet.AppendDummy();
22527 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22528
22529 VkResult err = VK_SUCCESS;
22530 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22531 ASSERT_VK_SUCCESS(err);
22532
22533 m_errorMonitor->VerifyNotFound();
22534}
22535
22536TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022537 TEST_DESCRIPTION(
22538 "Test that pipeline validation accepts per-vertex variables "
22539 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022540 m_errorMonitor->ExpectSuccess();
22541
Tony Barbour1fa09702017-03-16 12:09:08 -060022542 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22544
22545 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022546 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022547 return;
22548 }
22549
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022550 char const *vsSource =
22551 "#version 450\n"
22552 "void main(){}\n";
22553 char const *tcsSource =
22554 "#version 450\n"
22555 "layout(location=0) out int x[];\n"
22556 "layout(vertices=3) out;\n"
22557 "void main(){\n"
22558 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22559 " gl_TessLevelInner[0] = 1;\n"
22560 " x[gl_InvocationID] = gl_InvocationID;\n"
22561 "}\n";
22562 char const *tesSource =
22563 "#version 450\n"
22564 "layout(triangles, equal_spacing, cw) in;\n"
22565 "layout(location=0) in int x[];\n"
22566 "out gl_PerVertex { vec4 gl_Position; };\n"
22567 "void main(){\n"
22568 " gl_Position.xyz = gl_TessCoord;\n"
22569 " gl_Position.w = x[0] + x[1] + x[2];\n"
22570 "}\n";
22571 char const *fsSource =
22572 "#version 450\n"
22573 "layout(location=0) out vec4 color;\n"
22574 "void main(){\n"
22575 " color = vec4(1);\n"
22576 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022577
22578 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22579 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22580 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22581 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22582
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022583 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22584 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022585
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022586 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022587
22588 VkPipelineObj pipe(m_device);
22589 pipe.SetInputAssembly(&iasci);
22590 pipe.SetTessellation(&tsci);
22591 pipe.AddColorAttachment();
22592 pipe.AddShader(&vs);
22593 pipe.AddShader(&tcs);
22594 pipe.AddShader(&tes);
22595 pipe.AddShader(&fs);
22596
22597 VkDescriptorSetObj descriptorSet(m_device);
22598 descriptorSet.AppendDummy();
22599 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22600
22601 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22602
22603 m_errorMonitor->VerifyNotFound();
22604}
22605
22606TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022607 TEST_DESCRIPTION(
22608 "Test that pipeline validation accepts a user-defined "
22609 "interface block passed into the geometry shader. This "
22610 "is interesting because the 'extra' array level is not "
22611 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022612 m_errorMonitor->ExpectSuccess();
22613
Tony Barbour1fa09702017-03-16 12:09:08 -060022614 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22616
22617 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022618 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022619 return;
22620 }
22621
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022622 char const *vsSource =
22623 "#version 450\n"
22624 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22625 "void main(){\n"
22626 " vs_out.x = vec4(1);\n"
22627 "}\n";
22628 char const *gsSource =
22629 "#version 450\n"
22630 "layout(triangles) in;\n"
22631 "layout(triangle_strip, max_vertices=3) out;\n"
22632 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22633 "out gl_PerVertex { vec4 gl_Position; };\n"
22634 "void main() {\n"
22635 " gl_Position = gs_in[0].x;\n"
22636 " EmitVertex();\n"
22637 "}\n";
22638 char const *fsSource =
22639 "#version 450\n"
22640 "layout(location=0) out vec4 color;\n"
22641 "void main(){\n"
22642 " color = vec4(1);\n"
22643 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022644
22645 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22646 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22647 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22648
22649 VkPipelineObj pipe(m_device);
22650 pipe.AddColorAttachment();
22651 pipe.AddShader(&vs);
22652 pipe.AddShader(&gs);
22653 pipe.AddShader(&fs);
22654
22655 VkDescriptorSetObj descriptorSet(m_device);
22656 descriptorSet.AppendDummy();
22657 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22658
22659 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22660
22661 m_errorMonitor->VerifyNotFound();
22662}
22663
22664TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022665 TEST_DESCRIPTION(
22666 "Test that pipeline validation accepts basic use of 64bit vertex "
22667 "attributes. This is interesting because they consume multiple "
22668 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022669 m_errorMonitor->ExpectSuccess();
22670
Tony Barbour1fa09702017-03-16 12:09:08 -060022671 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022672 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22673
22674 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022675 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022676 return;
22677 }
22678
22679 VkVertexInputBindingDescription input_bindings[1];
22680 memset(input_bindings, 0, sizeof(input_bindings));
22681
22682 VkVertexInputAttributeDescription input_attribs[4];
22683 memset(input_attribs, 0, sizeof(input_attribs));
22684 input_attribs[0].location = 0;
22685 input_attribs[0].offset = 0;
22686 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22687 input_attribs[1].location = 2;
22688 input_attribs[1].offset = 32;
22689 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22690 input_attribs[2].location = 4;
22691 input_attribs[2].offset = 64;
22692 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22693 input_attribs[3].location = 6;
22694 input_attribs[3].offset = 96;
22695 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22696
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022697 char const *vsSource =
22698 "#version 450\n"
22699 "\n"
22700 "layout(location=0) in dmat4 x;\n"
22701 "out gl_PerVertex {\n"
22702 " vec4 gl_Position;\n"
22703 "};\n"
22704 "void main(){\n"
22705 " gl_Position = vec4(x[0][0]);\n"
22706 "}\n";
22707 char const *fsSource =
22708 "#version 450\n"
22709 "\n"
22710 "layout(location=0) out vec4 color;\n"
22711 "void main(){\n"
22712 " color = vec4(1);\n"
22713 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022714
22715 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22716 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22717
22718 VkPipelineObj pipe(m_device);
22719 pipe.AddColorAttachment();
22720 pipe.AddShader(&vs);
22721 pipe.AddShader(&fs);
22722
22723 pipe.AddVertexInputBindings(input_bindings, 1);
22724 pipe.AddVertexInputAttribs(input_attribs, 4);
22725
22726 VkDescriptorSetObj descriptorSet(m_device);
22727 descriptorSet.AppendDummy();
22728 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22729
22730 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22731
22732 m_errorMonitor->VerifyNotFound();
22733}
22734
22735TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22736 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22737 m_errorMonitor->ExpectSuccess();
22738
Tony Barbour1fa09702017-03-16 12:09:08 -060022739 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022740
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022741 char const *vsSource =
22742 "#version 450\n"
22743 "\n"
22744 "out gl_PerVertex {\n"
22745 " vec4 gl_Position;\n"
22746 "};\n"
22747 "void main(){\n"
22748 " gl_Position = vec4(1);\n"
22749 "}\n";
22750 char const *fsSource =
22751 "#version 450\n"
22752 "\n"
22753 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22754 "layout(location=0) out vec4 color;\n"
22755 "void main() {\n"
22756 " color = subpassLoad(x);\n"
22757 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022758
22759 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22760 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22761
22762 VkPipelineObj pipe(m_device);
22763 pipe.AddShader(&vs);
22764 pipe.AddShader(&fs);
22765 pipe.AddColorAttachment();
22766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22767
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022768 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22769 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022770 VkDescriptorSetLayout dsl;
22771 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22772 ASSERT_VK_SUCCESS(err);
22773
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022774 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022775 VkPipelineLayout pl;
22776 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22777 ASSERT_VK_SUCCESS(err);
22778
22779 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022780 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22781 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22782 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22783 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22784 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 -060022785 };
22786 VkAttachmentReference color = {
22787 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22788 };
22789 VkAttachmentReference input = {
22790 1, VK_IMAGE_LAYOUT_GENERAL,
22791 };
22792
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022793 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022794
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022795 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022796 VkRenderPass rp;
22797 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22798 ASSERT_VK_SUCCESS(err);
22799
22800 // should be OK. would go wrong here if it's going to...
22801 pipe.CreateVKPipeline(pl, rp);
22802
22803 m_errorMonitor->VerifyNotFound();
22804
22805 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22806 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22807 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22808}
22809
22810TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022811 TEST_DESCRIPTION(
22812 "Test that pipeline validation accepts a compute pipeline which declares a "
22813 "descriptor-backed resource which is not provided, but the shader does not "
22814 "statically use it. This is interesting because it requires compute pipelines "
22815 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022816 m_errorMonitor->ExpectSuccess();
22817
Tony Barbour1fa09702017-03-16 12:09:08 -060022818 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022820 char const *csSource =
22821 "#version 450\n"
22822 "\n"
22823 "layout(local_size_x=1) in;\n"
22824 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22825 "void main(){\n"
22826 " // x is not used.\n"
22827 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022828
22829 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22830
22831 VkDescriptorSetObj descriptorSet(m_device);
22832 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22833
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022834 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22835 nullptr,
22836 0,
22837 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22838 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22839 descriptorSet.GetPipelineLayout(),
22840 VK_NULL_HANDLE,
22841 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022842
22843 VkPipeline pipe;
22844 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22845
22846 m_errorMonitor->VerifyNotFound();
22847
22848 if (err == VK_SUCCESS) {
22849 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22850 }
22851}
22852
22853TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022854 TEST_DESCRIPTION(
22855 "Test that pipeline validation accepts a shader consuming only the "
22856 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022857 m_errorMonitor->ExpectSuccess();
22858
Tony Barbour1fa09702017-03-16 12:09:08 -060022859 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022860
22861 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022862 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22863 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22864 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022865 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022866 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022867 VkDescriptorSetLayout dsl;
22868 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22869 ASSERT_VK_SUCCESS(err);
22870
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022871 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022872 VkPipelineLayout pl;
22873 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22874 ASSERT_VK_SUCCESS(err);
22875
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022876 char const *csSource =
22877 "#version 450\n"
22878 "\n"
22879 "layout(local_size_x=1) in;\n"
22880 "layout(set=0, binding=0) uniform sampler s;\n"
22881 "layout(set=0, binding=1) uniform texture2D t;\n"
22882 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22883 "void main() {\n"
22884 " x = texture(sampler2D(t, s), vec2(0));\n"
22885 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022886 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22887
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022888 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22889 nullptr,
22890 0,
22891 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22892 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22893 pl,
22894 VK_NULL_HANDLE,
22895 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022896
22897 VkPipeline pipe;
22898 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22899
22900 m_errorMonitor->VerifyNotFound();
22901
22902 if (err == VK_SUCCESS) {
22903 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22904 }
22905
22906 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22907 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22908}
22909
22910TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022911 TEST_DESCRIPTION(
22912 "Test that pipeline validation accepts a shader consuming only the "
22913 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022914 m_errorMonitor->ExpectSuccess();
22915
Tony Barbour1fa09702017-03-16 12:09:08 -060022916 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022917
22918 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022919 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22920 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22921 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022922 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022923 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022924 VkDescriptorSetLayout dsl;
22925 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22926 ASSERT_VK_SUCCESS(err);
22927
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022928 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022929 VkPipelineLayout pl;
22930 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22931 ASSERT_VK_SUCCESS(err);
22932
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022933 char const *csSource =
22934 "#version 450\n"
22935 "\n"
22936 "layout(local_size_x=1) in;\n"
22937 "layout(set=0, binding=0) uniform texture2D t;\n"
22938 "layout(set=0, binding=1) uniform sampler s;\n"
22939 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22940 "void main() {\n"
22941 " x = texture(sampler2D(t, s), vec2(0));\n"
22942 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022943 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22944
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022945 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22946 nullptr,
22947 0,
22948 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22949 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22950 pl,
22951 VK_NULL_HANDLE,
22952 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022953
22954 VkPipeline pipe;
22955 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22956
22957 m_errorMonitor->VerifyNotFound();
22958
22959 if (err == VK_SUCCESS) {
22960 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22961 }
22962
22963 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22964 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22965}
22966
22967TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022968 TEST_DESCRIPTION(
22969 "Test that pipeline validation accepts a shader consuming "
22970 "both the sampler and the image of a combined image+sampler "
22971 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022972 m_errorMonitor->ExpectSuccess();
22973
Tony Barbour1fa09702017-03-16 12:09:08 -060022974 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022975
22976 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022977 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22978 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022979 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022980 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022981 VkDescriptorSetLayout dsl;
22982 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22983 ASSERT_VK_SUCCESS(err);
22984
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022985 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022986 VkPipelineLayout pl;
22987 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22988 ASSERT_VK_SUCCESS(err);
22989
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022990 char const *csSource =
22991 "#version 450\n"
22992 "\n"
22993 "layout(local_size_x=1) in;\n"
22994 "layout(set=0, binding=0) uniform texture2D t;\n"
22995 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22996 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22997 "void main() {\n"
22998 " x = texture(sampler2D(t, s), vec2(0));\n"
22999 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023000 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23001
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023002 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23003 nullptr,
23004 0,
23005 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23006 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23007 pl,
23008 VK_NULL_HANDLE,
23009 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023010
23011 VkPipeline pipe;
23012 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23013
23014 m_errorMonitor->VerifyNotFound();
23015
23016 if (err == VK_SUCCESS) {
23017 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23018 }
23019
23020 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23021 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23022}
23023
Tony Barbour3ed87a02017-03-15 16:19:02 -060023024TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023025 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23026
Tony Barbour3ed87a02017-03-15 16:19:02 -060023027 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023028 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023029
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023030 // Ensure that extension is available and enabled.
23031 uint32_t extension_count = 0;
23032 bool supports_maintenance1_extension = false;
23033 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23034 ASSERT_VK_SUCCESS(err);
23035 if (extension_count > 0) {
23036 std::vector<VkExtensionProperties> available_extensions(extension_count);
23037
23038 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23039 ASSERT_VK_SUCCESS(err);
23040 for (const auto &extension_props : available_extensions) {
23041 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23042 supports_maintenance1_extension = true;
23043 }
23044 }
23045 }
23046
23047 // Proceed if extension is supported by hardware
23048 if (!supports_maintenance1_extension) {
23049 printf(" Maintenance1 Extension not supported, skipping tests\n");
23050 return;
23051 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023052
23053 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023054 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023055 VkCommandBuffer cmd_buf;
23056 VkCommandBufferAllocateInfo alloc_info;
23057 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23058 alloc_info.pNext = NULL;
23059 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023060 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023061 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23062 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23063
23064 VkCommandBufferBeginInfo cb_binfo;
23065 cb_binfo.pNext = NULL;
23066 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23067 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23068 cb_binfo.flags = 0;
23069 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23070 // Set Negative height, should give error if Maintenance 1 is not enabled
23071 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23072 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23073 vkEndCommandBuffer(cmd_buf);
23074
23075 m_errorMonitor->VerifyNotFound();
23076}
23077
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023078TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23079 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23080
23081 ASSERT_NO_FATAL_FAILURE(Init());
23082
23083 uint32_t extension_count = 0;
23084 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23085 ASSERT_VK_SUCCESS(err);
23086
23087 if (extension_count > 0) {
23088 std::vector<VkExtensionProperties> available_extensions(extension_count);
23089 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23090 ASSERT_VK_SUCCESS(err);
23091
23092 for (const auto &extension_props : available_extensions) {
23093 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23094 // Create two pNext structures which by themselves would be valid
23095 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23096 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23097 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23098 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23099 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23100
23101 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23102 dedicated_buffer_create_info_2.pNext = nullptr;
23103 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23104
23105 uint32_t queue_family_index = 0;
23106 VkBufferCreateInfo buffer_create_info = {};
23107 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23108 buffer_create_info.pNext = &dedicated_buffer_create_info;
23109 buffer_create_info.size = 1024;
23110 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23111 buffer_create_info.queueFamilyIndexCount = 1;
23112 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23113
23114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23115 VkBuffer buffer;
23116 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23117 m_errorMonitor->VerifyFound();
23118 }
23119 }
23120 }
23121}
23122
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023123TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23124 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23125
Tony Barbour1fa09702017-03-16 12:09:08 -060023126 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023127
23128 // Positive test to check parameter_validation and unique_objects support
23129 // for NV_dedicated_allocation
23130 uint32_t extension_count = 0;
23131 bool supports_nv_dedicated_allocation = false;
23132 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23133 ASSERT_VK_SUCCESS(err);
23134
23135 if (extension_count > 0) {
23136 std::vector<VkExtensionProperties> available_extensions(extension_count);
23137
23138 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23139 ASSERT_VK_SUCCESS(err);
23140
23141 for (const auto &extension_props : available_extensions) {
23142 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23143 supports_nv_dedicated_allocation = true;
23144 }
23145 }
23146 }
23147
23148 if (supports_nv_dedicated_allocation) {
23149 m_errorMonitor->ExpectSuccess();
23150
23151 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23152 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23153 dedicated_buffer_create_info.pNext = nullptr;
23154 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23155
23156 uint32_t queue_family_index = 0;
23157 VkBufferCreateInfo buffer_create_info = {};
23158 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23159 buffer_create_info.pNext = &dedicated_buffer_create_info;
23160 buffer_create_info.size = 1024;
23161 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23162 buffer_create_info.queueFamilyIndexCount = 1;
23163 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23164
23165 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023166 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023167 ASSERT_VK_SUCCESS(err);
23168
23169 VkMemoryRequirements memory_reqs;
23170 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23171
23172 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23173 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23174 dedicated_memory_info.pNext = nullptr;
23175 dedicated_memory_info.buffer = buffer;
23176 dedicated_memory_info.image = VK_NULL_HANDLE;
23177
23178 VkMemoryAllocateInfo memory_info = {};
23179 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23180 memory_info.pNext = &dedicated_memory_info;
23181 memory_info.allocationSize = memory_reqs.size;
23182
23183 bool pass;
23184 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23185 ASSERT_TRUE(pass);
23186
23187 VkDeviceMemory buffer_memory;
23188 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23189 ASSERT_VK_SUCCESS(err);
23190
23191 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
23192 ASSERT_VK_SUCCESS(err);
23193
23194 vkDestroyBuffer(m_device->device(), buffer, NULL);
23195 vkFreeMemory(m_device->device(), buffer_memory, NULL);
23196
23197 m_errorMonitor->VerifyNotFound();
23198 }
23199}
23200
23201TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23202 VkResult err;
23203
23204 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23205
Tony Barbour1fa09702017-03-16 12:09:08 -060023206 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023207 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23208
23209 std::vector<const char *> device_extension_names;
23210 auto features = m_device->phy().features();
23211 // Artificially disable support for non-solid fill modes
23212 features.fillModeNonSolid = false;
23213 // The sacrificial device object
23214 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23215
23216 VkRenderpassObj render_pass(&test_device);
23217
23218 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23219 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23220 pipeline_layout_ci.setLayoutCount = 0;
23221 pipeline_layout_ci.pSetLayouts = NULL;
23222
23223 VkPipelineLayout pipeline_layout;
23224 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23225 ASSERT_VK_SUCCESS(err);
23226
23227 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23228 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23229 rs_ci.pNext = nullptr;
23230 rs_ci.lineWidth = 1.0f;
23231 rs_ci.rasterizerDiscardEnable = true;
23232
23233 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23234 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23235
23236 // Set polygonMode=FILL. No error is expected
23237 m_errorMonitor->ExpectSuccess();
23238 {
23239 VkPipelineObj pipe(&test_device);
23240 pipe.AddShader(&vs);
23241 pipe.AddShader(&fs);
23242 pipe.AddColorAttachment();
23243 // Set polygonMode to a good value
23244 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23245 pipe.SetRasterization(&rs_ci);
23246 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23247 }
23248 m_errorMonitor->VerifyNotFound();
23249
23250 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23251}
23252
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023253#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023254TEST_F(VkPositiveLayerTest, LongFenceChain)
23255{
23256 m_errorMonitor->ExpectSuccess();
23257
Tony Barbour1fa09702017-03-16 12:09:08 -060023258 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023259 VkResult err;
23260
23261 std::vector<VkFence> fences;
23262
23263 const int chainLength = 32768;
23264
23265 for (int i = 0; i < chainLength; i++) {
23266 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23267 VkFence fence;
23268 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23269 ASSERT_VK_SUCCESS(err);
23270
23271 fences.push_back(fence);
23272
23273 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23274 0, nullptr, 0, nullptr };
23275 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23276 ASSERT_VK_SUCCESS(err);
23277
23278 }
23279
23280 // BOOM, stack overflow.
23281 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23282
23283 for (auto fence : fences)
23284 vkDestroyFence(m_device->device(), fence, nullptr);
23285
23286 m_errorMonitor->VerifyNotFound();
23287}
23288#endif
23289
Cody Northrop1242dfd2016-07-13 17:24:59 -060023290#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023291const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023292static bool initialized = false;
23293static bool active = false;
23294
23295// Convert Intents to argv
23296// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023297std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023298 std::vector<std::string> args;
23299 JavaVM &vm = *app.activity->vm;
23300 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023301 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023302
23303 JNIEnv &env = *p_env;
23304 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023305 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023306 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023307 jmethodID get_string_extra_method =
23308 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023309 jvalue get_string_extra_args;
23310 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023311 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023312
23313 std::string args_str;
23314 if (extra_str) {
23315 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23316 args_str = extra_utf;
23317 env.ReleaseStringUTFChars(extra_str, extra_utf);
23318 env.DeleteLocalRef(extra_str);
23319 }
23320
23321 env.DeleteLocalRef(get_string_extra_args.l);
23322 env.DeleteLocalRef(intent);
23323 vm.DetachCurrentThread();
23324
23325 // split args_str
23326 std::stringstream ss(args_str);
23327 std::string arg;
23328 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023329 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023330 }
23331
23332 return args;
23333}
23334
Cody Northropb94529f2017-04-05 13:05:51 -060023335void addFullTestCommentIfPresent(const ::testing::TestInfo& test_info, std::string& error_message) {
23336 const char* const type_param = test_info.type_param();
23337 const char* const value_param = test_info.value_param();
23338
23339 if (type_param != NULL || value_param != NULL) {
23340 error_message.append(", where ");
23341 if (type_param != NULL) {
23342 error_message.append("TypeParam = ").append(type_param);
23343 if (value_param != NULL)
23344 error_message.append(" and ");
23345 }
23346 if (value_param != NULL) {
23347 error_message.append("GetParam() = ").append(value_param);
23348 }
23349 }
23350}
23351
23352// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23353class LogcatPrinter : public ::testing::EmptyTestEventListener {
23354 // Called before a test starts.
23355 virtual void OnTestStart(const ::testing::TestInfo& test_info) {
23356 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23357 }
23358
23359 // Called after a failed assertion or a SUCCEED() invocation.
23360 virtual void OnTestPartResult(const ::testing::TestPartResult& result) {
23361
23362 // If the test part succeeded, we don't need to do anything.
23363 if (result.type() == ::testing::TestPartResult::kSuccess)
23364 return;
23365
23366 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s",
23367 result.failed() ? "*** Failure" : "Success",
23368 result.file_name(),
23369 result.line_number(),
23370 result.summary());
23371 }
23372
23373 // Called after a test ends.
23374 virtual void OnTestEnd(const ::testing::TestInfo& info) {
23375 std::string result;
23376 if (info.result()->Passed()) {
23377 result.append("[ OK ]");
23378 } else {
23379 result.append("[ FAILED ]");
23380 }
23381 result.append(info.test_case_name()).append(".").append(info.name());
23382 if (info.result()->Failed())
23383 addFullTestCommentIfPresent(info, result);
23384
23385 if (::testing::GTEST_FLAG(print_time)) {
23386 std::ostringstream os;
23387 os << info.result()->elapsed_time();
23388 result.append(" (").append(os.str()).append(" ms)");
23389 }
23390
23391 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23392 };
23393};
23394
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023395static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023396
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023397static void processCommand(struct android_app *app, int32_t cmd) {
23398 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023399 case APP_CMD_INIT_WINDOW: {
23400 if (app->window) {
23401 initialized = true;
23402 }
23403 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023404 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023405 case APP_CMD_GAINED_FOCUS: {
23406 active = true;
23407 break;
23408 }
23409 case APP_CMD_LOST_FOCUS: {
23410 active = false;
23411 break;
23412 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023413 }
23414}
23415
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023416void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023417 app_dummy();
23418
Cody Northrop1242dfd2016-07-13 17:24:59 -060023419
23420 int vulkanSupport = InitVulkan();
23421 if (vulkanSupport == 0) {
23422 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23423 return;
23424 }
23425
23426 app->onAppCmd = processCommand;
23427 app->onInputEvent = processInput;
23428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023429 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023430 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023431 struct android_poll_source *source;
23432 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023433 if (source) {
23434 source->process(app, source);
23435 }
23436
23437 if (app->destroyRequested != 0) {
23438 VkTestFramework::Finish();
23439 return;
23440 }
23441 }
23442
23443 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023444 // Use the following key to send arguments to gtest, i.e.
23445 // --es args "--gtest_filter=-VkLayerTest.foo"
23446 const char key[] = "args";
23447 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023448
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023449 std::string filter = "";
23450 if (args.size() > 0) {
23451 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23452 filter += args[0];
23453 } else {
23454 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23455 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023456
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023457 int argc = 2;
23458 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23459 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023460
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023461 // Route output to files until we can override the gtest output
23462 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23463 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023464
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023465 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023466
23467 ::testing::TestEventListeners& listeners = ::testing::UnitTest::GetInstance()->listeners();
23468 listeners.Append(new LogcatPrinter);
23469
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023470 VkTestFramework::InitArgs(&argc, argv);
23471 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023472
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023473 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023474
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023475 if (result != 0) {
23476 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23477 } else {
23478 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23479 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023480
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023481 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023482
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023483 fclose(stdout);
23484 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023485
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023486 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023487 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023488 }
23489 }
23490}
23491#endif
23492
Tony Barbour300a6082015-04-07 13:44:53 -060023493int main(int argc, char **argv) {
23494 int result;
23495
Cody Northrop8e54a402016-03-08 22:25:52 -070023496#ifdef ANDROID
23497 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023498 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023499#endif
23500
Tony Barbour300a6082015-04-07 13:44:53 -060023501 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023502 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023503
23504 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23505
23506 result = RUN_ALL_TESTS();
23507
Tony Barbour6918cd52015-04-09 12:58:51 -060023508 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023509 return result;
23510}