blob: d8a743db1cebe4f94c72c3f8aea6ca0c57ef9db6 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600341#ifdef _DEBUG
342 char embedded_code_string[2048];
343 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
344 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
345#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600346 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600347#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600348 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600349 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600350}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700353 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
355 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700356 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600357 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
358 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 }
Tony Barbour300a6082015-04-07 13:44:53 -0600360
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
362 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700363 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600364 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700365 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600366 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700367 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
369 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
370 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700371 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
372 }
373 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
374 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
375 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600376 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
378 InitState(features, flags);
379 }
380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700381 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700382 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600384 std::vector<const char *> instance_layer_names;
385 std::vector<const char *> instance_extension_names;
386 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600387
388 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700389 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600390 /*
391 * Since CreateDbgMsgCallback is an instance level extension call
392 * any extension / layer that utilizes that feature also needs
393 * to be enabled at create instance time.
394 */
Karl Schultz6addd812016-02-02 17:17:23 -0700395 // Use Threading layer first to protect others from
396 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700397 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800399 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700400 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600401 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700402 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600403
Ian Elliott2c1daf52016-05-12 09:41:46 -0600404 if (m_enableWSI) {
405 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
406 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
407#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
408#if defined(VK_USE_PLATFORM_ANDROID_KHR)
409 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_MIR_KHR)
412 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
415 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600417#if defined(VK_USE_PLATFORM_WIN32_KHR)
418 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_WIN32_KHR
420#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600421#if defined(VK_USE_PLATFORM_XCB_KHR)
422 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
423#elif defined(VK_USE_PLATFORM_XLIB_KHR)
424 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700425#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600426 }
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800430 this->app_info.pApplicationName = "layer_tests";
431 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600432 this->app_info.pEngineName = "unittest";
433 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600434 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600435
Tony Barbour15524c32015-04-29 17:34:29 -0600436 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
438
439 virtual void TearDown() {
440 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600441 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600442 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600443 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600446};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600448void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449 // Create identity matrix
450 int i;
451 struct vktriangle_vs_uniform data;
452
453 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700454 glm::mat4 View = glm::mat4(1.0f);
455 glm::mat4 Model = glm::mat4(1.0f);
456 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700458 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
460 memcpy(&data.mvp, &MVP[0][0], matrixSize);
461
Karl Schultz6addd812016-02-02 17:17:23 -0700462 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600463 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464 };
465
Karl Schultz6addd812016-02-02 17:17:23 -0700466 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 data.position[i][0] = tri_data[i].posX;
468 data.position[i][1] = tri_data[i].posY;
469 data.position[i][2] = tri_data[i].posZ;
470 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700471 data.color[i][0] = tri_data[i].r;
472 data.color[i][1] = tri_data[i].g;
473 data.color[i][2] = tri_data[i].b;
474 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475 }
476
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477 ASSERT_NO_FATAL_FAILURE(InitViewport());
478
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200479 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
480 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Karl Schultz6addd812016-02-02 17:17:23 -0700482 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800486 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487 pipelineobj.AddShader(&vs);
488 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 if (failMask & BsoFailLineWidth) {
490 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600492 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
494 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600495 }
496 if (failMask & BsoFailDepthBias) {
497 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600498 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600499 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600500 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600501 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600502 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700504 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700505 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600506 if (failMask & BsoFailViewport) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
508 }
509 if (failMask & BsoFailScissor) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
511 }
512 if (failMask & BsoFailBlend) {
513 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600514 VkPipelineColorBlendAttachmentState att_state = {};
515 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
516 att_state.blendEnable = VK_TRUE;
517 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 }
519 if (failMask & BsoFailDepthBounds) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
521 }
522 if (failMask & BsoFailStencilReadMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
524 }
525 if (failMask & BsoFailStencilWriteMask) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
527 }
528 if (failMask & BsoFailStencilReference) {
529 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
530 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600533 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700536 m_commandBuffer->BeginCommandBuffer();
537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538
Tony Barbourfe3351b2015-07-28 10:17:20 -0600539 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500540
541 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600542 if (failMask & BsoFailIndexBuffer) {
543 // Use DrawIndexed w/o an index buffer bound
544 DrawIndexed(3, 1, 0, 0, 0);
545 } else {
546 Draw(3, 1, 0, 0);
547 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500548
Mark Muellerd4914412016-06-13 17:52:06 -0600549 if (failMask & BsoFailCmdClearAttachments) {
550 VkClearAttachment color_attachment = {};
551 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700552 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600553 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
554
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600555 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600556 }
557
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500558 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700559 m_commandBuffer->EndRenderPass();
560 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600561 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562}
563
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
565 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500568 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600569 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500570 }
571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700573 // Make sure depthWriteEnable is set so that Depth fail test will work
574 // correctly
575 // Make sure stencilTestEnable is set so that Stencil fail test will work
576 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600577 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800578 stencil.failOp = VK_STENCIL_OP_KEEP;
579 stencil.passOp = VK_STENCIL_OP_KEEP;
580 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
581 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600582
583 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
584 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600585 ds_ci.pNext = NULL;
586 ds_ci.depthTestEnable = VK_FALSE;
587 ds_ci.depthWriteEnable = VK_TRUE;
588 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
589 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600590 if (failMask & BsoFailDepthBounds) {
591 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600592 ds_ci.maxDepthBounds = 0.0f;
593 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600594 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600595 ds_ci.stencilTestEnable = VK_TRUE;
596 ds_ci.front = stencil;
597 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600598
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600599 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600600 pipelineobj.SetViewport(m_viewports);
601 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600603 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 commandBuffer->BindPipeline(pipelineobj);
606 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500607}
608
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700610 public:
611 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600612};
613
Ian Elliott2c1daf52016-05-12 09:41:46 -0600614class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
616 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600617 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600618};
619
Mark Muellerdfe37552016-07-07 14:47:42 -0600620class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700621 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600622 enum eTestEnFlags {
623 eDoubleDelete,
624 eInvalidDeviceOffset,
625 eInvalidMemoryOffset,
626 eBindNullBuffer,
627 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600628 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 };
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
634 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635 return true;
636 }
637 VkDeviceSize offset_limit = 0;
638 if (eInvalidMemoryOffset == aTestFlag) {
639 VkBuffer vulkanBuffer;
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600646 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
650 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
652 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600654 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600656 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 }
658 if (eOffsetAlignment < offset_limit) {
659 return true;
660 }
661 return false;
662 }
663
664 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
666 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (eBindNullBuffer == aTestFlag) {
668 VulkanMemory = 0;
669 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
670 } else {
671 VkBufferCreateInfo buffer_create_info = {};
672 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
673 buffer_create_info.size = 32;
674 buffer_create_info.usage = aBufferUsage;
675
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600676 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677
678 CreateCurrent = true;
679
680 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 VkMemoryAllocateInfo memory_allocate_info = {};
684 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800685 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600686 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
687 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 if (!pass) {
689 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
690 return;
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 AllocateCurrent = true;
695 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600696 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
697 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 BoundCurrent = true;
699
700 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
701 }
702 }
703
704 ~VkBufferTest() {
705 if (CreateCurrent) {
706 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
707 }
708 if (AllocateCurrent) {
709 if (InvalidDeleteEn) {
710 union {
711 VkDeviceMemory device_memory;
712 unsigned long long index_access;
713 } bad_index;
714
715 bad_index.device_memory = VulkanMemory;
716 bad_index.index_access++;
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 }
720 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
721 }
722 }
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600725
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600727
728 void TestDoubleDestroy() {
729 // Destroy the buffer but leave the flag set, which will cause
730 // the buffer to be destroyed again in the destructor.
731 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
732 }
733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700734 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600735 bool AllocateCurrent;
736 bool BoundCurrent;
737 bool CreateCurrent;
738 bool InvalidDeleteEn;
739
740 VkBuffer VulkanBuffer;
741 VkDevice VulkanDevice;
742 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600743};
744
745class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600748 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700749 : BoundCurrent(false),
750 AttributeCount(aAttributeCount),
751 BindingCount(aBindingCount),
752 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600754 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
755 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700756 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
759 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
762 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
763 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
764 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
765 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600766
767 unsigned i = 0;
768 do {
769 VertexInputAttributeDescription[i].binding = BindId;
770 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
772 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 i++;
774 } while (AttributeCount < i);
775
776 i = 0;
777 do {
778 VertexInputBindingDescription[i].binding = BindId;
779 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600780 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600781 i++;
782 } while (BindingCount < i);
783 }
784
785 ~VkVerticesObj() {
786 if (VertexInputAttributeDescription) {
787 delete[] VertexInputAttributeDescription;
788 }
789 if (VertexInputBindingDescription) {
790 delete[] VertexInputBindingDescription;
791 }
792 }
793
794 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
796 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 return true;
798 }
799
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600800 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600801 VkDeviceSize *offsetList;
802 unsigned offsetCount;
803
804 if (aOffsetCount) {
805 offsetList = aOffsetList;
806 offsetCount = aOffsetCount;
807 } else {
808 offsetList = new VkDeviceSize[1]();
809 offsetCount = 1;
810 }
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600813 BoundCurrent = true;
814
815 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600817 }
818 }
819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700820 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600821 static uint32_t BindIdGenerator;
822
823 bool BoundCurrent;
824 unsigned AttributeCount;
825 unsigned BindingCount;
826 uint32_t BindId;
827
828 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
829 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
830 VkVertexInputBindingDescription *VertexInputBindingDescription;
831 VkConstantBufferObj VulkanMemoryBuffer;
832};
833
834uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500835// ********************************************************************************************************************
836// ********************************************************************************************************************
837// ********************************************************************************************************************
838// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700840 TEST_DESCRIPTION(
841 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
842 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600843
Tony Barbour1fa09702017-03-16 12:09:08 -0600844 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a pointer to a handle
848 // Expected to trigger an error with
849 // parameter_validation::validate_required_pointer
850 vkGetPhysicalDeviceFeatures(gpu(), NULL);
851 m_errorMonitor->VerifyFound();
852
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
854 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify NULL for pointer to array count
856 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600857 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify 0 for a required array count
862 // Expected to trigger an error with parameter_validation::validate_array
863 VkViewport view_port = {};
864 m_commandBuffer->SetViewport(0, 0, &view_port);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify NULL for a required array
869 // Expected to trigger an error with parameter_validation::validate_array
870 m_commandBuffer->SetViewport(0, 1, NULL);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify VK_NULL_HANDLE for a required handle
875 // Expected to trigger an error with
876 // parameter_validation::validate_required_handle
877 vkUnmapMemory(device(), VK_NULL_HANDLE);
878 m_errorMonitor->VerifyFound();
879
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
881 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882 // Specify VK_NULL_HANDLE for a required handle array entry
883 // Expected to trigger an error with
884 // parameter_validation::validate_required_handle_array
885 VkFence fence = VK_NULL_HANDLE;
886 vkResetFences(device(), 1, &fence);
887 m_errorMonitor->VerifyFound();
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags parameter
899 // Expected to trigger an error with parameter_validation::validate_flags
900 m_commandBuffer->SetStencilReference(0, 0);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600904 // Specify 0 for a required VkFlags array entry
905 // Expected to trigger an error with
906 // parameter_validation::validate_flags_array
907 VkSemaphore semaphore = VK_NULL_HANDLE;
908 VkPipelineStageFlags stageFlags = 0;
909 VkSubmitInfo submitInfo = {};
910 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
911 submitInfo.waitSemaphoreCount = 1;
912 submitInfo.pWaitSemaphores = &semaphore;
913 submitInfo.pWaitDstStageMask = &stageFlags;
914 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600917
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918TEST_F(VkLayerTest, ReservedParameter) {
919 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
920
Tony Barbour1fa09702017-03-16 12:09:08 -0600921 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600922
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600924 // Specify 0 for a reserved VkFlags parameter
925 // Expected to trigger an error with
926 // parameter_validation::validate_reserved_flags
927 VkEvent event_handle = VK_NULL_HANDLE;
928 VkEventCreateInfo event_info = {};
929 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
930 event_info.flags = 1;
931 vkCreateEvent(device(), &event_info, NULL, &event_handle);
932 m_errorMonitor->VerifyFound();
933}
934
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700936 TEST_DESCRIPTION(
937 "Specify an invalid VkStructureType for a Vulkan "
938 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939
Tony Barbour1fa09702017-03-16 12:09:08 -0600940 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600941
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943 // Zero struct memory, effectively setting sType to
944 // VK_STRUCTURE_TYPE_APPLICATION_INFO
945 // Expected to trigger an error with
946 // parameter_validation::validate_struct_type
947 VkMemoryAllocateInfo alloc_info = {};
948 VkDeviceMemory memory = VK_NULL_HANDLE;
949 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
950 m_errorMonitor->VerifyFound();
951
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600953 // Zero struct memory, effectively setting sType to
954 // VK_STRUCTURE_TYPE_APPLICATION_INFO
955 // Expected to trigger an error with
956 // parameter_validation::validate_struct_type_array
957 VkSubmitInfo submit_info = {};
958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
959 m_errorMonitor->VerifyFound();
960}
961
962TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600963 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600964
Tony Barbour1fa09702017-03-16 12:09:08 -0600965 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600966
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600968 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600969 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600970 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600971 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600972 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600973 // Zero-initialization will provide the correct sType
974 VkApplicationInfo app_info = {};
975 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
976 event_alloc_info.pNext = &app_info;
977 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
978 m_errorMonitor->VerifyFound();
979
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
981 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
983 // a function that has allowed pNext structure types and specify
984 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600985 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600987 VkMemoryAllocateInfo memory_alloc_info = {};
988 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
989 memory_alloc_info.pNext = &app_info;
990 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600991 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600992}
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
994TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600995 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600996
Tony Barbour1fa09702017-03-16 12:09:08 -0600997 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "does not fall within the begin..end "
1001 "range of the core VkFormat "
1002 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 // Specify an invalid VkFormat value
1004 // Expected to trigger an error with
1005 // parameter_validation::validate_ranged_enum
1006 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001008 m_errorMonitor->VerifyFound();
1009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001011 // Specify an invalid VkFlags bitmask value
1012 // Expected to trigger an error with parameter_validation::validate_flags
1013 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1015 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001016 m_errorMonitor->VerifyFound();
1017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001019 // Specify an invalid VkFlags array entry
1020 // Expected to trigger an error with
1021 // parameter_validation::validate_flags_array
1022 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001024 VkSubmitInfo submit_info = {};
1025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1026 submit_info.waitSemaphoreCount = 1;
1027 submit_info.pWaitSemaphores = &semaphore;
1028 submit_info.pWaitDstStageMask = &stage_flags;
1029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1030 m_errorMonitor->VerifyFound();
1031
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 // Specify an invalid VkBool32 value
1034 // Expected to trigger a warning with
1035 // parameter_validation::validate_bool32
1036 VkSampler sampler = VK_NULL_HANDLE;
1037 VkSamplerCreateInfo sampler_info = {};
1038 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1039 sampler_info.pNext = NULL;
1040 sampler_info.magFilter = VK_FILTER_NEAREST;
1041 sampler_info.minFilter = VK_FILTER_NEAREST;
1042 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1043 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1044 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1045 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1046 sampler_info.mipLodBias = 1.0;
1047 sampler_info.maxAnisotropy = 1;
1048 sampler_info.compareEnable = VK_FALSE;
1049 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1050 sampler_info.minLod = 1.0;
1051 sampler_info.maxLod = 1.0;
1052 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1053 sampler_info.unnormalizedCoordinates = VK_FALSE;
1054 // Not VK_TRUE or VK_FALSE
1055 sampler_info.anisotropyEnable = 3;
1056 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1057 m_errorMonitor->VerifyFound();
1058}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001059
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001060TEST_F(VkLayerTest, UpdateBufferAlignment) {
1061 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001062 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001063
Tony Barbour1fa09702017-03-16 12:09:08 -06001064 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001065
1066 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1067 vk_testing::Buffer buffer;
1068 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1069
Tony Barbour552f6c02016-12-21 14:34:07 -07001070 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001071 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1074 m_errorMonitor->VerifyFound();
1075
1076 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001078 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1079 m_errorMonitor->VerifyFound();
1080
1081 // Introduce failure by using dataSize that is < 0
1082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001083 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001084 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1085 m_errorMonitor->VerifyFound();
1086
1087 // Introduce failure by using dataSize that is > 65536
1088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001089 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1091 m_errorMonitor->VerifyFound();
1092
Tony Barbour552f6c02016-12-21 14:34:07 -07001093 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094}
1095
1096TEST_F(VkLayerTest, FillBufferAlignment) {
1097 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1098
Tony Barbour1fa09702017-03-16 12:09:08 -06001099 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100
1101 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1102 vk_testing::Buffer buffer;
1103 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1104
Tony Barbour552f6c02016-12-21 14:34:07 -07001105 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001106
1107 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001114 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1115 m_errorMonitor->VerifyFound();
1116
1117 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
Tony Barbour552f6c02016-12-21 14:34:07 -07001122 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001123}
Dustin Graves40f35822016-06-23 11:12:53 -06001124
Cortd889ff92016-07-27 09:51:27 -07001125TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1126 VkResult err;
1127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001128 TEST_DESCRIPTION(
1129 "Attempt to use a non-solid polygon fill mode in a "
1130 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001131
Tony Barbour1fa09702017-03-16 12:09:08 -06001132 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1134
1135 std::vector<const char *> device_extension_names;
1136 auto features = m_device->phy().features();
1137 // Artificially disable support for non-solid fill modes
1138 features.fillModeNonSolid = false;
1139 // The sacrificial device object
1140 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1141
1142 VkRenderpassObj render_pass(&test_device);
1143
1144 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1145 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1146 pipeline_layout_ci.setLayoutCount = 0;
1147 pipeline_layout_ci.pSetLayouts = NULL;
1148
1149 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001150 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001151 ASSERT_VK_SUCCESS(err);
1152
1153 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1154 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1155 rs_ci.pNext = nullptr;
1156 rs_ci.lineWidth = 1.0f;
1157 rs_ci.rasterizerDiscardEnable = true;
1158
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001159 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1160 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001161
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001162 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1164 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001165 {
1166 VkPipelineObj pipe(&test_device);
1167 pipe.AddShader(&vs);
1168 pipe.AddShader(&fs);
1169 pipe.AddColorAttachment();
1170 // Introduce failure by setting unsupported polygon mode
1171 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1172 pipe.SetRasterization(&rs_ci);
1173 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1174 }
1175 m_errorMonitor->VerifyFound();
1176
1177 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1179 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001180 {
1181 VkPipelineObj pipe(&test_device);
1182 pipe.AddShader(&vs);
1183 pipe.AddShader(&fs);
1184 pipe.AddColorAttachment();
1185 // Introduce failure by setting unsupported polygon mode
1186 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1187 pipe.SetRasterization(&rs_ci);
1188 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1189 }
1190 m_errorMonitor->VerifyFound();
1191
Cortd889ff92016-07-27 09:51:27 -07001192 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1193}
1194
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001195#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001196TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001197{
1198 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001199 VkFenceCreateInfo fenceInfo = {};
1200 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1201 fenceInfo.pNext = NULL;
1202 fenceInfo.flags = 0;
1203
Mike Weiblencce7ec72016-10-17 19:33:05 -06001204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001205
Tony Barbour1fa09702017-03-16 12:09:08 -06001206 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001207
1208 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1209 vk_testing::Buffer buffer;
1210 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001211
Tony Barbourfe3351b2015-07-28 10:17:20 -06001212 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001213 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001214 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001215
1216 testFence.init(*m_device, fenceInfo);
1217
1218 // Bypass framework since it does the waits automatically
1219 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001220 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001221 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1222 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001223 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001224 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001225 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001226 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001228 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001229 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001230
1231 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001232 ASSERT_VK_SUCCESS( err );
1233
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001234 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001235 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001237 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001238}
1239
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001240TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001241{
1242 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001243 VkFenceCreateInfo fenceInfo = {};
1244 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1245 fenceInfo.pNext = NULL;
1246 fenceInfo.flags = 0;
1247
Mike Weiblencce7ec72016-10-17 19:33:05 -06001248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001249
Tony Barbour1fa09702017-03-16 12:09:08 -06001250 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251 ASSERT_NO_FATAL_FAILURE(InitViewport());
1252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1253
Tony Barbourfe3351b2015-07-28 10:17:20 -06001254 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001255 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001256 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257
1258 testFence.init(*m_device, fenceInfo);
1259
1260 // Bypass framework since it does the waits automatically
1261 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001262 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001263 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1264 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001265 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001266 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001267 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001268 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001269 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001270 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001271 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001272
1273 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 ASSERT_VK_SUCCESS( err );
1275
Jon Ashburnf19916e2016-01-11 13:12:43 -07001276 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001277 VkCommandBufferBeginInfo info = {};
1278 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1279 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001280 info.renderPass = VK_NULL_HANDLE;
1281 info.subpass = 0;
1282 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001283 info.occlusionQueryEnable = VK_FALSE;
1284 info.queryFlags = 0;
1285 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001286
1287 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001288 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001289
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001290 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001291}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001292#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001293
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001294TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1295 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1296
Tony Barbour1fa09702017-03-16 12:09:08 -06001297 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001298
1299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1300 VkBuffer buffer;
1301 VkBufferCreateInfo buf_info = {};
1302 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1303 buf_info.pNext = NULL;
1304 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1305 buf_info.size = 2048;
1306 buf_info.queueFamilyIndexCount = 0;
1307 buf_info.pQueueFamilyIndices = NULL;
1308 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1309 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1310 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1311 m_errorMonitor->VerifyFound();
1312
1313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1314 VkImage image;
1315 VkImageCreateInfo image_create_info = {};
1316 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1317 image_create_info.pNext = NULL;
1318 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1319 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1320 image_create_info.extent.width = 512;
1321 image_create_info.extent.height = 64;
1322 image_create_info.extent.depth = 1;
1323 image_create_info.mipLevels = 1;
1324 image_create_info.arrayLayers = 1;
1325 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1326 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1327 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1328 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1329 image_create_info.queueFamilyIndexCount = 0;
1330 image_create_info.pQueueFamilyIndices = NULL;
1331 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1332 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1333 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1334 m_errorMonitor->VerifyFound();
1335}
1336
Dave Houlton829c0d82017-01-24 15:09:17 -07001337TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1338 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1339
1340 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001341 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001342 ASSERT_NO_FATAL_FAILURE(
1343 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001344 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001345
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001346 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001347 device_features.sparseResidencyImage2D = VK_FALSE;
1348 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001349 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 VkImage image = VK_NULL_HANDLE;
1352 VkResult result = VK_RESULT_MAX_ENUM;
1353 VkImageCreateInfo image_create_info = {};
1354 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1355 image_create_info.pNext = NULL;
1356 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1357 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1358 image_create_info.extent.width = 512;
1359 image_create_info.extent.height = 1;
1360 image_create_info.extent.depth = 1;
1361 image_create_info.mipLevels = 1;
1362 image_create_info.arrayLayers = 1;
1363 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1364 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1365 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1366 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1367 image_create_info.queueFamilyIndexCount = 0;
1368 image_create_info.pQueueFamilyIndices = NULL;
1369 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1370 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1371
1372 // 1D image w/ sparse residency is an error
1373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1374 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1375 m_errorMonitor->VerifyFound();
1376 if (VK_SUCCESS == result) {
1377 vkDestroyImage(m_device->device(), image, NULL);
1378 image = VK_NULL_HANDLE;
1379 }
1380
1381 // 2D image w/ sparse residency when feature isn't available
1382 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1383 image_create_info.extent.height = 64;
1384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1385 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1386 m_errorMonitor->VerifyFound();
1387 if (VK_SUCCESS == result) {
1388 vkDestroyImage(m_device->device(), image, NULL);
1389 image = VK_NULL_HANDLE;
1390 }
1391
1392 // 3D image w/ sparse residency when feature isn't available
1393 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1394 image_create_info.extent.depth = 8;
1395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1396 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1397 m_errorMonitor->VerifyFound();
1398 if (VK_SUCCESS == result) {
1399 vkDestroyImage(m_device->device(), image, NULL);
1400 image = VK_NULL_HANDLE;
1401 }
1402}
1403
1404TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1405 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1406
1407 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001408 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001409 ASSERT_NO_FATAL_FAILURE(
1410 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001411 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001412
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001413 // These tests require that the device support sparse residency for 2D images
1414 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1415 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001416 return;
1417 }
1418
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001419 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001420 device_features.sparseResidency2Samples = VK_FALSE;
1421 device_features.sparseResidency4Samples = VK_FALSE;
1422 device_features.sparseResidency8Samples = VK_FALSE;
1423 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001424 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001425
1426 VkImage image = VK_NULL_HANDLE;
1427 VkResult result = VK_RESULT_MAX_ENUM;
1428 VkImageCreateInfo image_create_info = {};
1429 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1430 image_create_info.pNext = NULL;
1431 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1432 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1433 image_create_info.extent.width = 64;
1434 image_create_info.extent.height = 64;
1435 image_create_info.extent.depth = 1;
1436 image_create_info.mipLevels = 1;
1437 image_create_info.arrayLayers = 1;
1438 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1439 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1440 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1441 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1442 image_create_info.queueFamilyIndexCount = 0;
1443 image_create_info.pQueueFamilyIndices = NULL;
1444 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1445 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1446
1447 // 2D image w/ sparse residency and linear tiling is an error
1448 m_errorMonitor->SetDesiredFailureMsg(
1449 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1450 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1451 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1452 m_errorMonitor->VerifyFound();
1453 if (VK_SUCCESS == result) {
1454 vkDestroyImage(m_device->device(), image, NULL);
1455 image = VK_NULL_HANDLE;
1456 }
1457 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1458
1459 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1460 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1462 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1463 m_errorMonitor->VerifyFound();
1464 if (VK_SUCCESS == result) {
1465 vkDestroyImage(m_device->device(), image, NULL);
1466 image = VK_NULL_HANDLE;
1467 }
1468
1469 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486
1487 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495}
1496
Tobin Ehlisf11be982016-05-11 13:52:53 -06001497TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001498 TEST_DESCRIPTION(
1499 "Create a buffer and image, allocate memory, and bind the "
1500 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001501 VkResult err;
1502 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001503 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001504
Tobin Ehlis077ded32016-05-12 17:39:13 -06001505 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001507 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001508 VkDeviceMemory mem; // buffer will be bound first
1509 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001510 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001511 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001512
1513 VkBufferCreateInfo buf_info = {};
1514 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1515 buf_info.pNext = NULL;
1516 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1517 buf_info.size = 256;
1518 buf_info.queueFamilyIndexCount = 0;
1519 buf_info.pQueueFamilyIndices = NULL;
1520 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1521 buf_info.flags = 0;
1522 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1523 ASSERT_VK_SUCCESS(err);
1524
Tobin Ehlis077ded32016-05-12 17:39:13 -06001525 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001526
1527 VkImageCreateInfo image_create_info = {};
1528 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1529 image_create_info.pNext = NULL;
1530 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1531 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1532 image_create_info.extent.width = 64;
1533 image_create_info.extent.height = 64;
1534 image_create_info.extent.depth = 1;
1535 image_create_info.mipLevels = 1;
1536 image_create_info.arrayLayers = 1;
1537 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001538 // Image tiling must be optimal to trigger error when aliasing linear buffer
1539 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001540 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1541 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1542 image_create_info.queueFamilyIndexCount = 0;
1543 image_create_info.pQueueFamilyIndices = NULL;
1544 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1545 image_create_info.flags = 0;
1546
Tobin Ehlisf11be982016-05-11 13:52:53 -06001547 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1548 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001549 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1550 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551
Tobin Ehlis077ded32016-05-12 17:39:13 -06001552 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1553
1554 VkMemoryAllocateInfo alloc_info = {};
1555 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1556 alloc_info.pNext = NULL;
1557 alloc_info.memoryTypeIndex = 0;
1558 // Ensure memory is big enough for both bindings
1559 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001560 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1561 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001562 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001563 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001564 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001565 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001566 return;
1567 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001568 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1569 ASSERT_VK_SUCCESS(err);
1570 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1571 ASSERT_VK_SUCCESS(err);
1572
Rene Lindsayd14f5572016-12-16 14:57:18 -07001573 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1574
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001576 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001577 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1578 m_errorMonitor->VerifyFound();
1579
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001581 // aliasing buffer2
1582 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1583 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001584 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1585 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001586 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001587 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001589 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 m_errorMonitor->VerifyFound();
1592
1593 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 vkFreeMemory(m_device->device(), mem, NULL);
1598 vkFreeMemory(m_device->device(), mem_img, NULL);
1599}
1600
Tobin Ehlis35372522016-05-12 08:32:31 -06001601TEST_F(VkLayerTest, InvalidMemoryMapping) {
1602 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1603 VkResult err;
1604 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001605 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001606
1607 VkBuffer buffer;
1608 VkDeviceMemory mem;
1609 VkMemoryRequirements mem_reqs;
1610
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001611 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1612
Tobin Ehlis35372522016-05-12 08:32:31 -06001613 VkBufferCreateInfo buf_info = {};
1614 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1615 buf_info.pNext = NULL;
1616 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1617 buf_info.size = 256;
1618 buf_info.queueFamilyIndexCount = 0;
1619 buf_info.pQueueFamilyIndices = NULL;
1620 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1621 buf_info.flags = 0;
1622 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1623 ASSERT_VK_SUCCESS(err);
1624
1625 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1626 VkMemoryAllocateInfo alloc_info = {};
1627 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1628 alloc_info.pNext = NULL;
1629 alloc_info.memoryTypeIndex = 0;
1630
1631 // Ensure memory is big enough for both bindings
1632 static const VkDeviceSize allocation_size = 0x10000;
1633 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001634 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001635 if (!pass) {
1636 vkDestroyBuffer(m_device->device(), buffer, NULL);
1637 return;
1638 }
1639 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1640 ASSERT_VK_SUCCESS(err);
1641
1642 uint8_t *pData;
1643 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001645 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1646 m_errorMonitor->VerifyFound();
1647 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001648 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001649 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1651 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1652 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001653 m_errorMonitor->VerifyFound();
1654
1655 // Unmap the memory to avoid re-map error
1656 vkUnmapMemory(m_device->device(), mem);
1657 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1659 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1660 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001661 m_errorMonitor->VerifyFound();
1662 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1664 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001665 m_errorMonitor->VerifyFound();
1666 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001668 vkUnmapMemory(m_device->device(), mem);
1669 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001670
Tobin Ehlis35372522016-05-12 08:32:31 -06001671 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001672 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001673 ASSERT_VK_SUCCESS(err);
1674 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001675 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001677 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001679 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1680 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 // Now flush range that oversteps mapped range
1683 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001684 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001686 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001687 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1689 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1690 m_errorMonitor->VerifyFound();
1691
1692 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1693 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001694 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001695 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001696 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 mmr.size = VK_WHOLE_SIZE;
1698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1700 m_errorMonitor->VerifyFound();
1701
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001702#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001703 // Some platforms have an atomsize of 1 which makes the test meaningless
1704 if (atom_size > 3) {
1705 // Now with an offset NOT a multiple of the device limit
1706 vkUnmapMemory(m_device->device(), mem);
1707 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1708 ASSERT_VK_SUCCESS(err);
1709 mmr.offset = 3; // Not a multiple of atom_size
1710 mmr.size = VK_WHOLE_SIZE;
1711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1712 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1713 m_errorMonitor->VerifyFound();
1714
1715 // Now with a size NOT a multiple of the device limit
1716 vkUnmapMemory(m_device->device(), mem);
1717 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1718 ASSERT_VK_SUCCESS(err);
1719 mmr.offset = atom_size;
1720 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1722 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1723 m_errorMonitor->VerifyFound();
1724 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001725#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001726 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1727 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001728 if (!pass) {
1729 vkFreeMemory(m_device->device(), mem, NULL);
1730 vkDestroyBuffer(m_device->device(), buffer, NULL);
1731 return;
1732 }
1733 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1734 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1735
1736 vkDestroyBuffer(m_device->device(), buffer, NULL);
1737 vkFreeMemory(m_device->device(), mem, NULL);
1738}
1739
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001740#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001741TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1742 VkResult err;
1743 bool pass;
1744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001745 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1746 // following declaration (which is temporarily being moved below):
1747 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001748 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001749 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001750 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001751 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001752 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001753 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001754
Tony Barbour1fa09702017-03-16 12:09:08 -06001755 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001756
Ian Elliott3f06ce52016-04-29 14:46:21 -06001757#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1758#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1759 // Use the functions from the VK_KHR_android_surface extension without
1760 // enabling that extension:
1761
1762 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001763 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1765 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766 pass = (err != VK_SUCCESS);
1767 ASSERT_TRUE(pass);
1768 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001769#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001770
Ian Elliott3f06ce52016-04-29 14:46:21 -06001771#if defined(VK_USE_PLATFORM_MIR_KHR)
1772 // Use the functions from the VK_KHR_mir_surface extension without enabling
1773 // that extension:
1774
1775 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001776 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001778 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1779 pass = (err != VK_SUCCESS);
1780 ASSERT_TRUE(pass);
1781 m_errorMonitor->VerifyFound();
1782
1783 // Tell whether an mir_connection supports presentation:
1784 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1786 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001788#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001789
Ian Elliott3f06ce52016-04-29 14:46:21 -06001790#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1791 // Use the functions from the VK_KHR_wayland_surface extension without
1792 // enabling that extension:
1793
1794 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001795 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1797 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798 pass = (err != VK_SUCCESS);
1799 ASSERT_TRUE(pass);
1800 m_errorMonitor->VerifyFound();
1801
1802 // Tell whether an wayland_display supports presentation:
1803 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1805 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001806 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001807#endif // VK_USE_PLATFORM_WAYLAND_KHR
1808#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809
Ian Elliott3f06ce52016-04-29 14:46:21 -06001810#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001811 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1812 // TO NON-LINUX PLATFORMS:
1813 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001814 // Use the functions from the VK_KHR_win32_surface extension without
1815 // enabling that extension:
1816
1817 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001818 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1820 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821 pass = (err != VK_SUCCESS);
1822 ASSERT_TRUE(pass);
1823 m_errorMonitor->VerifyFound();
1824
1825 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001827 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001828 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001829// Set this (for now, until all platforms are supported and tested):
1830#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001831#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001832#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001833 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1834 // TO NON-LINUX PLATFORMS:
1835 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001836#endif
1837#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001838 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1839 // that extension:
1840
1841 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001842 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001844 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1845 pass = (err != VK_SUCCESS);
1846 ASSERT_TRUE(pass);
1847 m_errorMonitor->VerifyFound();
1848
1849 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001850 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001851 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1853 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001854 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001855// Set this (for now, until all platforms are supported and tested):
1856#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001857#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001858
Ian Elliott12630812016-04-29 14:35:43 -06001859#if defined(VK_USE_PLATFORM_XLIB_KHR)
1860 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1861 // that extension:
1862
1863 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001864 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001866 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1867 pass = (err != VK_SUCCESS);
1868 ASSERT_TRUE(pass);
1869 m_errorMonitor->VerifyFound();
1870
1871 // Tell whether an Xlib VisualID supports presentation:
1872 Display *dpy = NULL;
1873 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1876 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001877// Set this (for now, until all platforms are supported and tested):
1878#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001879#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001880
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001881// Use the functions from the VK_KHR_surface extension without enabling
1882// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001883
Ian Elliott489eec02016-05-05 14:12:44 -06001884#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001887 vkDestroySurfaceKHR(instance(), surface, NULL);
1888 m_errorMonitor->VerifyFound();
1889
1890 // Check if surface supports presentation:
1891 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001893 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1894 pass = (err != VK_SUCCESS);
1895 ASSERT_TRUE(pass);
1896 m_errorMonitor->VerifyFound();
1897
1898 // Check surface capabilities:
1899 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1901 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 pass = (err != VK_SUCCESS);
1903 ASSERT_TRUE(pass);
1904 m_errorMonitor->VerifyFound();
1905
1906 // Check surface formats:
1907 uint32_t format_count = 0;
1908 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface present modes:
1916 uint32_t present_mode_count = 0;
1917 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001923#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001924
Ian Elliott1c32c772016-04-28 14:47:13 -06001925 // Use the functions from the VK_KHR_swapchain extension without enabling
1926 // that extension:
1927
1928 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001930 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1931 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001932 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1939 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001940 pass = (err != VK_SUCCESS);
1941 ASSERT_TRUE(pass);
1942 m_errorMonitor->VerifyFound();
1943
Chris Forbeseb7d5502016-09-13 18:19:21 +12001944 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1945 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1946 VkFence fence;
1947 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1948
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001951 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001952 pass = (err != VK_SUCCESS);
1953 ASSERT_TRUE(pass);
1954 m_errorMonitor->VerifyFound();
1955
Chris Forbeseb7d5502016-09-13 18:19:21 +12001956 vkDestroyFence(m_device->device(), fence, nullptr);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001959 //
1960 // NOTE: Currently can't test this because a real swapchain is needed (as
1961 // opposed to the fake one we created) in order for the layer to lookup the
1962 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001963
1964 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001966 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1967 m_errorMonitor->VerifyFound();
1968}
Chris Forbes09368e42016-10-13 11:59:22 +13001969#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001970
Karl Schultz6addd812016-02-02 17:17:23 -07001971TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1972 VkResult err;
1973 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001974
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1976 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001977
Tony Barbour1fa09702017-03-16 12:09:08 -06001978 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001979
1980 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001981 VkImage image;
1982 VkDeviceMemory mem;
1983 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001984
Karl Schultz6addd812016-02-02 17:17:23 -07001985 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1986 const int32_t tex_width = 32;
1987 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
Tony Barboureb254902015-07-15 12:50:33 -06001989 VkImageCreateInfo image_create_info = {};
1990 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001991 image_create_info.pNext = NULL;
1992 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1993 image_create_info.format = tex_format;
1994 image_create_info.extent.width = tex_width;
1995 image_create_info.extent.height = tex_height;
1996 image_create_info.extent.depth = 1;
1997 image_create_info.mipLevels = 1;
1998 image_create_info.arrayLayers = 1;
1999 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2000 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2001 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2002 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002003 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002004
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002005 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002006 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002007 mem_alloc.pNext = NULL;
2008 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002009
Chia-I Wuf7458c52015-10-26 21:10:41 +08002010 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002011 ASSERT_VK_SUCCESS(err);
2012
Karl Schultz6addd812016-02-02 17:17:23 -07002013 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002014
Mark Lobodzinski23065352015-05-29 09:32:35 -05002015 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002016
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002017 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002018 if (!pass) { // If we can't find any unmappable memory this test doesn't
2019 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002020 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002021 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002022 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002023
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002024 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002025 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002026 ASSERT_VK_SUCCESS(err);
2027
2028 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002029 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002030 ASSERT_VK_SUCCESS(err);
2031
2032 // Map memory as if to initialize the image
2033 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002034 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002036 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002037
Chia-I Wuf7458c52015-10-26 21:10:41 +08002038 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002039 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040}
2041
Karl Schultz6addd812016-02-02 17:17:23 -07002042TEST_F(VkLayerTest, RebindMemory) {
2043 VkResult err;
2044 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002045
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002047
Tony Barbour1fa09702017-03-16 12:09:08 -06002048 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002049
2050 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002051 VkImage image;
2052 VkDeviceMemory mem1;
2053 VkDeviceMemory mem2;
2054 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002055
Karl Schultz6addd812016-02-02 17:17:23 -07002056 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2057 const int32_t tex_width = 32;
2058 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002059
Tony Barboureb254902015-07-15 12:50:33 -06002060 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002061 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2062 image_create_info.pNext = NULL;
2063 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2064 image_create_info.format = tex_format;
2065 image_create_info.extent.width = tex_width;
2066 image_create_info.extent.height = tex_height;
2067 image_create_info.extent.depth = 1;
2068 image_create_info.mipLevels = 1;
2069 image_create_info.arrayLayers = 1;
2070 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2071 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2072 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2073 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002075 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002076 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2077 mem_alloc.pNext = NULL;
2078 mem_alloc.allocationSize = 0;
2079 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 // Introduce failure, do NOT set memProps to
2082 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002083 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002084 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002085 ASSERT_VK_SUCCESS(err);
2086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002088
2089 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002090 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002091 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002092
2093 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002094 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002095 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002096 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097 ASSERT_VK_SUCCESS(err);
2098
2099 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002100 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101 ASSERT_VK_SUCCESS(err);
2102
Karl Schultz6addd812016-02-02 17:17:23 -07002103 // Introduce validation failure, try to bind a different memory object to
2104 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002105 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002107 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002108
Chia-I Wuf7458c52015-10-26 21:10:41 +08002109 vkDestroyImage(m_device->device(), image, NULL);
2110 vkFreeMemory(m_device->device(), mem1, NULL);
2111 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002112}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002113
Karl Schultz6addd812016-02-02 17:17:23 -07002114TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002115 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002116
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2118 "submitted in SIGNALED state. Fences "
2119 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002120
2121 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002122 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2123 fenceInfo.pNext = NULL;
2124 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002125
Tony Barbour1fa09702017-03-16 12:09:08 -06002126 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002127 ASSERT_NO_FATAL_FAILURE(InitViewport());
2128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2129
Tony Barbour552f6c02016-12-21 14:34:07 -07002130 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002131 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002132 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002133
2134 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002135
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002136 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002137 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2138 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002139 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002140 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002141 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002142 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002143 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002144 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002146
2147 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002148 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002149
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002150 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002151}
Chris Forbes4e44c912016-06-16 10:20:00 +12002152
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002153TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002154 TEST_DESCRIPTION(
2155 "Specify wrong usage for image then create conflicting view of image "
2156 "Initialize buffer with wrong usage then perform copy expecting errors "
2157 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002159
Tony Barbour1fa09702017-03-16 12:09:08 -06002160 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002161 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002162 if (!format) {
2163 printf(" No Depth + Stencil format found. Skipped.\n");
2164 return;
2165 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002166
Tony Barbourf92621a2016-05-02 14:28:12 -06002167 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002168 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002169 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002170 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002171
Tony Barbourf92621a2016-05-02 14:28:12 -06002172 VkImageView dsv;
2173 VkImageViewCreateInfo dsvci = {};
2174 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2175 dsvci.image = image.handle();
2176 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002177 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002178 dsvci.subresourceRange.layerCount = 1;
2179 dsvci.subresourceRange.baseMipLevel = 0;
2180 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002181 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002182
Tony Barbourf92621a2016-05-02 14:28:12 -06002183 // Create a view with depth / stencil aspect for image with different usage
2184 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002186 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002187
2188 // Initialize buffer with TRANSFER_DST usage
2189 vk_testing::Buffer buffer;
2190 VkMemoryPropertyFlags reqs = 0;
2191 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2192 VkBufferImageCopy region = {};
2193 region.bufferRowLength = 128;
2194 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002195 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002196 region.imageSubresource.layerCount = 1;
2197 region.imageExtent.height = 16;
2198 region.imageExtent.width = 16;
2199 region.imageExtent.depth = 1;
2200
Mark Lobodzinski80871462017-02-16 10:37:27 -07002201 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002202 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002203
Chris Forbesda581202016-10-06 18:25:26 +13002204 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Chris Forbesda581202016-10-06 18:25:26 +13002207
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002208 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2209 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002210 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002211}
Tony Barbour75d79f02016-08-30 09:39:07 -06002212
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002213TEST_F(VkLayerTest, LeakAnObject) {
2214 VkResult err;
2215
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002216 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002217
2218 // Note that we have to create a new device since destroying the
2219 // framework's device causes Teardown() to fail and just calling Teardown
2220 // will destroy the errorMonitor.
2221
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223
Tony Barbour1fa09702017-03-16 12:09:08 -06002224 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227 std::vector<VkDeviceQueueCreateInfo> queue_info;
2228 queue_info.reserve(queue_props.size());
2229 std::vector<std::vector<float>> queue_priorities;
2230 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2231 VkDeviceQueueCreateInfo qi = {};
2232 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2233 qi.pNext = NULL;
2234 qi.queueFamilyIndex = i;
2235 qi.queueCount = queue_props[i].queueCount;
2236 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2237 qi.pQueuePriorities = queue_priorities[i].data();
2238 queue_info.push_back(qi);
2239 }
2240
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002241 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002242
2243 // The sacrificial device object
2244 VkDevice testDevice;
2245 VkDeviceCreateInfo device_create_info = {};
2246 auto features = m_device->phy().features();
2247 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2248 device_create_info.pNext = NULL;
2249 device_create_info.queueCreateInfoCount = queue_info.size();
2250 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002251 device_create_info.enabledLayerCount = 0;
2252 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002253 device_create_info.pEnabledFeatures = &features;
2254 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2255 ASSERT_VK_SUCCESS(err);
2256
2257 VkFence fence;
2258 VkFenceCreateInfo fence_create_info = {};
2259 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2260 fence_create_info.pNext = NULL;
2261 fence_create_info.flags = 0;
2262 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2263 ASSERT_VK_SUCCESS(err);
2264
2265 // Induce failure by not calling vkDestroyFence
2266 vkDestroyDevice(testDevice, NULL);
2267 m_errorMonitor->VerifyFound();
2268}
2269
2270TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002271 TEST_DESCRIPTION(
2272 "Allocate command buffers from one command pool and "
2273 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002274
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002276
Tony Barbour1fa09702017-03-16 12:09:08 -06002277 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002278 VkCommandPool command_pool_one;
2279 VkCommandPool command_pool_two;
2280
2281 VkCommandPoolCreateInfo pool_create_info{};
2282 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2283 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2284 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2285
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002286 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002288 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002289
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002290 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002291 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002292 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002293 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002294 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002295 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002296 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002298 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
2300 m_errorMonitor->VerifyFound();
2301
2302 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2303 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2304}
2305
2306TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2307 VkResult err;
2308
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002309 TEST_DESCRIPTION(
2310 "Allocate descriptor sets from one DS pool and "
2311 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002312
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002314
Tony Barbour1fa09702017-03-16 12:09:08 -06002315 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002316 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2317
2318 VkDescriptorPoolSize ds_type_count = {};
2319 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2320 ds_type_count.descriptorCount = 1;
2321
2322 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2323 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2324 ds_pool_ci.pNext = NULL;
2325 ds_pool_ci.flags = 0;
2326 ds_pool_ci.maxSets = 1;
2327 ds_pool_ci.poolSizeCount = 1;
2328 ds_pool_ci.pPoolSizes = &ds_type_count;
2329
2330 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002331 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002332 ASSERT_VK_SUCCESS(err);
2333
2334 // Create a second descriptor pool
2335 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002336 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002337 ASSERT_VK_SUCCESS(err);
2338
2339 VkDescriptorSetLayoutBinding dsl_binding = {};
2340 dsl_binding.binding = 0;
2341 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2342 dsl_binding.descriptorCount = 1;
2343 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2344 dsl_binding.pImmutableSamplers = NULL;
2345
2346 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2347 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2348 ds_layout_ci.pNext = NULL;
2349 ds_layout_ci.bindingCount = 1;
2350 ds_layout_ci.pBindings = &dsl_binding;
2351
2352 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002353 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002354 ASSERT_VK_SUCCESS(err);
2355
2356 VkDescriptorSet descriptorSet;
2357 VkDescriptorSetAllocateInfo alloc_info = {};
2358 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2359 alloc_info.descriptorSetCount = 1;
2360 alloc_info.descriptorPool = ds_pool_one;
2361 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2366
2367 m_errorMonitor->VerifyFound();
2368
2369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2370 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2371 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2372}
2373
2374TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002376
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002377 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002378
Tony Barbour1fa09702017-03-16 12:09:08 -06002379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002380
2381 // Pass bogus handle into GetImageMemoryRequirements
2382 VkMemoryRequirements mem_reqs;
2383 uint64_t fakeImageHandle = 0xCADECADE;
2384 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2385
2386 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2387
2388 m_errorMonitor->VerifyFound();
2389}
2390
Mike Schuchardt17838902017-02-21 09:48:06 -07002391TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2392 TEST_DESCRIPTION(
2393 "Try to destroy a render pass object using a device other than the one it was created on. "
2394 "This should generate a distinct error from the invalid handle error.");
2395 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002396 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2398
2399 // Create second device
2400 float priorities[] = {1.0f};
2401 VkDeviceQueueCreateInfo queue_info{};
2402 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2403 queue_info.pNext = NULL;
2404 queue_info.flags = 0;
2405 queue_info.queueFamilyIndex = 0;
2406 queue_info.queueCount = 1;
2407 queue_info.pQueuePriorities = &priorities[0];
2408
2409 VkDeviceCreateInfo device_create_info = {};
2410 auto features = m_device->phy().features();
2411 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2412 device_create_info.pNext = NULL;
2413 device_create_info.queueCreateInfoCount = 1;
2414 device_create_info.pQueueCreateInfos = &queue_info;
2415 device_create_info.enabledLayerCount = 0;
2416 device_create_info.ppEnabledLayerNames = NULL;
2417 device_create_info.pEnabledFeatures = &features;
2418
2419 VkDevice second_device;
2420 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2421
2422 // Try to destroy the renderpass from the first device using the second device
2423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2424 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2425 m_errorMonitor->VerifyFound();
2426
2427 vkDestroyDevice(second_device, NULL);
2428}
2429
Karl Schultz6addd812016-02-02 17:17:23 -07002430TEST_F(VkLayerTest, PipelineNotBound) {
2431 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002432
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002433 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002434
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002436
Tony Barbour1fa09702017-03-16 12:09:08 -06002437 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002439
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002440 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002441 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2442 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002443
2444 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002445 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2446 ds_pool_ci.pNext = NULL;
2447 ds_pool_ci.maxSets = 1;
2448 ds_pool_ci.poolSizeCount = 1;
2449 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002450
2451 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002452 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453 ASSERT_VK_SUCCESS(err);
2454
2455 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002456 dsl_binding.binding = 0;
2457 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2458 dsl_binding.descriptorCount = 1;
2459 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2460 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002461
2462 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002463 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2464 ds_layout_ci.pNext = NULL;
2465 ds_layout_ci.bindingCount = 1;
2466 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002467
2468 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002469 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470 ASSERT_VK_SUCCESS(err);
2471
2472 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002473 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002474 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002475 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002476 alloc_info.descriptorPool = ds_pool;
2477 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002478 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002479 ASSERT_VK_SUCCESS(err);
2480
2481 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002482 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2483 pipeline_layout_ci.pNext = NULL;
2484 pipeline_layout_ci.setLayoutCount = 1;
2485 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002486
2487 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
Mark Youngad779052016-01-06 14:26:04 -07002491 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
Tony Barbour552f6c02016-12-21 14:34:07 -07002493 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002494 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002497
Chia-I Wuf7458c52015-10-26 21:10:41 +08002498 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002501}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002502
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002503TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2504 VkResult err;
2505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002506 TEST_DESCRIPTION(
2507 "Test validation check for an invalid memory type index "
2508 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002509
Tony Barbour1fa09702017-03-16 12:09:08 -06002510 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002511
2512 // Create an image, allocate memory, set a bad typeIndex and then try to
2513 // bind it
2514 VkImage image;
2515 VkDeviceMemory mem;
2516 VkMemoryRequirements mem_reqs;
2517 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2518 const int32_t tex_width = 32;
2519 const int32_t tex_height = 32;
2520
2521 VkImageCreateInfo image_create_info = {};
2522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2523 image_create_info.pNext = NULL;
2524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2525 image_create_info.format = tex_format;
2526 image_create_info.extent.width = tex_width;
2527 image_create_info.extent.height = tex_height;
2528 image_create_info.extent.depth = 1;
2529 image_create_info.mipLevels = 1;
2530 image_create_info.arrayLayers = 1;
2531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2532 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2533 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2534 image_create_info.flags = 0;
2535
2536 VkMemoryAllocateInfo mem_alloc = {};
2537 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2538 mem_alloc.pNext = NULL;
2539 mem_alloc.allocationSize = 0;
2540 mem_alloc.memoryTypeIndex = 0;
2541
2542 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2543 ASSERT_VK_SUCCESS(err);
2544
2545 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2546 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002547
2548 // Introduce Failure, select invalid TypeIndex
2549 VkPhysicalDeviceMemoryProperties memory_info;
2550
2551 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2552 unsigned int i;
2553 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2554 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2555 mem_alloc.memoryTypeIndex = i;
2556 break;
2557 }
2558 }
2559 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002560 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002561 vkDestroyImage(m_device->device(), image, NULL);
2562 return;
2563 }
2564
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002566
2567 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2568 ASSERT_VK_SUCCESS(err);
2569
2570 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2571 (void)err;
2572
2573 m_errorMonitor->VerifyFound();
2574
2575 vkDestroyImage(m_device->device(), image, NULL);
2576 vkFreeMemory(m_device->device(), mem, NULL);
2577}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
Karl Schultz6addd812016-02-02 17:17:23 -07002579TEST_F(VkLayerTest, BindInvalidMemory) {
2580 VkResult err;
2581 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002582
Tony Barbour1fa09702017-03-16 12:09:08 -06002583 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002584
Cortf801b982017-01-17 18:10:21 -08002585 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002586 const int32_t tex_width = 256;
2587 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002588
2589 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002590 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2591 image_create_info.pNext = NULL;
2592 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2593 image_create_info.format = tex_format;
2594 image_create_info.extent.width = tex_width;
2595 image_create_info.extent.height = tex_height;
2596 image_create_info.extent.depth = 1;
2597 image_create_info.mipLevels = 1;
2598 image_create_info.arrayLayers = 1;
2599 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002600 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002601 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2602 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002603
Cortf801b982017-01-17 18:10:21 -08002604 VkBufferCreateInfo buffer_create_info = {};
2605 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2606 buffer_create_info.pNext = NULL;
2607 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002608 buffer_create_info.size = 4 * 1024 * 1024;
2609 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002610 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002611
Cortf801b982017-01-17 18:10:21 -08002612 // Create an image/buffer, allocate memory, free it, and then try to bind it
2613 {
2614 VkImage image = VK_NULL_HANDLE;
2615 VkBuffer buffer = VK_NULL_HANDLE;
2616 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2617 ASSERT_VK_SUCCESS(err);
2618 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2619 ASSERT_VK_SUCCESS(err);
2620 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2621 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2622 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002623
Cortf801b982017-01-17 18:10:21 -08002624 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2625 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2626 image_mem_alloc.allocationSize = image_mem_reqs.size;
2627 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2628 ASSERT_TRUE(pass);
2629 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2630 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2631 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2632 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2635 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2636 ASSERT_VK_SUCCESS(err);
2637 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2638 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002639
Cortf801b982017-01-17 18:10:21 -08002640 vkFreeMemory(device(), image_mem, NULL);
2641 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2644 err = vkBindImageMemory(device(), image, image_mem, 0);
2645 (void)err; // This may very well return an error.
2646 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002647
Cortf801b982017-01-17 18:10:21 -08002648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2649 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2650 (void)err; // This may very well return an error.
2651 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 vkDestroyImage(m_device->device(), image, NULL);
2654 vkDestroyBuffer(m_device->device(), buffer, NULL);
2655 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002656
2657 // Try to bind memory to an object that already has a memory binding
2658 {
2659 VkImage image = VK_NULL_HANDLE;
2660 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2661 ASSERT_VK_SUCCESS(err);
2662 VkBuffer buffer = VK_NULL_HANDLE;
2663 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2664 ASSERT_VK_SUCCESS(err);
2665 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2666 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2667 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2668 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2669 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2670 image_alloc_info.allocationSize = image_mem_reqs.size;
2671 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2672 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2673 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2674 ASSERT_TRUE(pass);
2675 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2676 ASSERT_TRUE(pass);
2677 VkDeviceMemory image_mem, buffer_mem;
2678 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2679 ASSERT_VK_SUCCESS(err);
2680 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2681 ASSERT_VK_SUCCESS(err);
2682
2683 err = vkBindImageMemory(device(), image, image_mem, 0);
2684 ASSERT_VK_SUCCESS(err);
2685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2686 err = vkBindImageMemory(device(), image, image_mem, 0);
2687 (void)err; // This may very well return an error.
2688 m_errorMonitor->VerifyFound();
2689
2690 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2691 ASSERT_VK_SUCCESS(err);
2692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2693 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2694 (void)err; // This may very well return an error.
2695 m_errorMonitor->VerifyFound();
2696
2697 vkFreeMemory(device(), image_mem, NULL);
2698 vkFreeMemory(device(), buffer_mem, NULL);
2699 vkDestroyImage(device(), image, NULL);
2700 vkDestroyBuffer(device(), buffer, NULL);
2701 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002702
Cort Strattonde748202017-02-17 12:50:01 -08002703 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002704 {
2705 VkImage image = VK_NULL_HANDLE;
2706 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2707 ASSERT_VK_SUCCESS(err);
2708 VkBuffer buffer = VK_NULL_HANDLE;
2709 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2710 ASSERT_VK_SUCCESS(err);
2711 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2712 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2713 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2714 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2715 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002716 // Leave some extra space for alignment wiggle room
2717 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002718 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002719 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002720 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2721 ASSERT_TRUE(pass);
2722 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2723 ASSERT_TRUE(pass);
2724 VkDeviceMemory image_mem, buffer_mem;
2725 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2726 ASSERT_VK_SUCCESS(err);
2727 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2728 ASSERT_VK_SUCCESS(err);
2729
Cort Strattonde748202017-02-17 12:50:01 -08002730 // Test unaligned memory offset
2731 {
2732 if (image_mem_reqs.alignment > 1) {
2733 VkDeviceSize image_offset = 1;
2734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2735 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2736 (void)err; // This may very well return an error.
2737 m_errorMonitor->VerifyFound();
2738 }
Cort6c7dff72017-01-27 18:34:50 -08002739
Cort Strattonde748202017-02-17 12:50:01 -08002740 if (buffer_mem_reqs.alignment > 1) {
2741 VkDeviceSize buffer_offset = 1;
2742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2743 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2744 (void)err; // This may very well return an error.
2745 m_errorMonitor->VerifyFound();
2746 }
2747 }
2748
2749 // Test memory offsets outside the memory allocation
2750 {
2751 VkDeviceSize image_offset =
2752 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2754 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2755 (void)err; // This may very well return an error.
2756 m_errorMonitor->VerifyFound();
2757
2758 VkDeviceSize buffer_offset =
2759 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2761 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2762 (void)err; // This may very well return an error.
2763 m_errorMonitor->VerifyFound();
2764 }
2765
2766 // Test memory offsets within the memory allocation, but which leave too little memory for
2767 // the resource.
2768 {
2769 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002770 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2772 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2773 (void)err; // This may very well return an error.
2774 m_errorMonitor->VerifyFound();
2775 }
2776
2777 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2778 if (buffer_offset > 0) {
2779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2780 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2781 (void)err; // This may very well return an error.
2782 m_errorMonitor->VerifyFound();
2783 }
2784 }
Cort6c7dff72017-01-27 18:34:50 -08002785
2786 vkFreeMemory(device(), image_mem, NULL);
2787 vkFreeMemory(device(), buffer_mem, NULL);
2788 vkDestroyImage(device(), image, NULL);
2789 vkDestroyBuffer(device(), buffer, NULL);
2790 }
2791
Cort Stratton4c38bb52017-01-28 13:33:10 -08002792 // Try to bind memory to an object with an invalid memory type
2793 {
2794 VkImage image = VK_NULL_HANDLE;
2795 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2796 ASSERT_VK_SUCCESS(err);
2797 VkBuffer buffer = VK_NULL_HANDLE;
2798 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2799 ASSERT_VK_SUCCESS(err);
2800 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2801 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2802 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2803 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2804 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2805 image_alloc_info.allocationSize = image_mem_reqs.size;
2806 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2807 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002808 // Create a mask of available memory types *not* supported by these resources,
2809 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002810 VkPhysicalDeviceMemoryProperties memory_properties = {};
2811 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002812 VkDeviceMemory image_mem, buffer_mem;
2813
Cort Stratton4c38bb52017-01-28 13:33:10 -08002814 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002815 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002816 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2817 ASSERT_TRUE(pass);
2818 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2819 ASSERT_VK_SUCCESS(err);
2820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2821 err = vkBindImageMemory(device(), image, image_mem, 0);
2822 (void)err; // This may very well return an error.
2823 m_errorMonitor->VerifyFound();
2824 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 }
2826
Cort Stratton4c38bb52017-01-28 13:33:10 -08002827 uint32_t buffer_unsupported_mem_type_bits =
2828 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002829 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002830 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2831 ASSERT_TRUE(pass);
2832 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2833 ASSERT_VK_SUCCESS(err);
2834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2835 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2836 (void)err; // This may very well return an error.
2837 m_errorMonitor->VerifyFound();
2838 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002840
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 vkDestroyImage(device(), image, NULL);
2842 vkDestroyBuffer(device(), buffer, NULL);
2843 }
2844
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002845 // Try to bind memory to an image created with sparse memory flags
2846 {
2847 VkImageCreateInfo sparse_image_create_info = image_create_info;
2848 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2849 VkImageFormatProperties image_format_properties = {};
2850 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2851 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2852 sparse_image_create_info.usage, sparse_image_create_info.flags,
2853 &image_format_properties);
2854 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2855 // most likely means sparse formats aren't supported here; skip this test.
2856 } else {
2857 ASSERT_VK_SUCCESS(err);
2858 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002859 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002860 return;
2861 } else {
2862 VkImage sparse_image = VK_NULL_HANDLE;
2863 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2864 ASSERT_VK_SUCCESS(err);
2865 VkMemoryRequirements sparse_mem_reqs = {};
2866 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2867 if (sparse_mem_reqs.memoryTypeBits != 0) {
2868 VkMemoryAllocateInfo sparse_mem_alloc = {};
2869 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2870 sparse_mem_alloc.pNext = NULL;
2871 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2872 sparse_mem_alloc.memoryTypeIndex = 0;
2873 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2874 ASSERT_TRUE(pass);
2875 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2876 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2877 ASSERT_VK_SUCCESS(err);
2878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2879 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2880 // This may very well return an error.
2881 (void)err;
2882 m_errorMonitor->VerifyFound();
2883 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2884 }
2885 vkDestroyImage(m_device->device(), sparse_image, NULL);
2886 }
2887 }
2888 }
2889
2890 // Try to bind memory to a buffer created with sparse memory flags
2891 {
2892 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2893 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2894 if (!m_device->phy().features().sparseResidencyBuffer) {
2895 // most likely means sparse formats aren't supported here; skip this test.
2896 } else {
2897 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2898 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2899 ASSERT_VK_SUCCESS(err);
2900 VkMemoryRequirements sparse_mem_reqs = {};
2901 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2902 if (sparse_mem_reqs.memoryTypeBits != 0) {
2903 VkMemoryAllocateInfo sparse_mem_alloc = {};
2904 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2905 sparse_mem_alloc.pNext = NULL;
2906 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2907 sparse_mem_alloc.memoryTypeIndex = 0;
2908 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2909 ASSERT_TRUE(pass);
2910 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2911 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2912 ASSERT_VK_SUCCESS(err);
2913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2914 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2915 // This may very well return an error.
2916 (void)err;
2917 m_errorMonitor->VerifyFound();
2918 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2919 }
2920 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2921 }
2922 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002923}
2924
Karl Schultz6addd812016-02-02 17:17:23 -07002925TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2926 VkResult err;
2927 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002928
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002930
Tony Barbour1fa09702017-03-16 12:09:08 -06002931 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002932
Karl Schultz6addd812016-02-02 17:17:23 -07002933 // Create an image object, allocate memory, destroy the object and then try
2934 // to bind it
2935 VkImage image;
2936 VkDeviceMemory mem;
2937 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultz6addd812016-02-02 17:17:23 -07002939 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2940 const int32_t tex_width = 32;
2941 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
2943 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002944 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2945 image_create_info.pNext = NULL;
2946 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2947 image_create_info.format = tex_format;
2948 image_create_info.extent.width = tex_width;
2949 image_create_info.extent.height = tex_height;
2950 image_create_info.extent.depth = 1;
2951 image_create_info.mipLevels = 1;
2952 image_create_info.arrayLayers = 1;
2953 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2954 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2955 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2956 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002957
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002958 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002959 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2960 mem_alloc.pNext = NULL;
2961 mem_alloc.allocationSize = 0;
2962 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Chia-I Wuf7458c52015-10-26 21:10:41 +08002964 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002965 ASSERT_VK_SUCCESS(err);
2966
Karl Schultz6addd812016-02-02 17:17:23 -07002967 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002968
2969 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002970 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002971 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002972
2973 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002974 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
2977 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002978 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002979 ASSERT_VK_SUCCESS(err);
2980
2981 // Now Try to bind memory to this destroyed object
2982 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2983 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002984 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002985
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002986 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002987
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002989}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002990
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002991TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2992 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2993
Tony Barbour1fa09702017-03-16 12:09:08 -06002994 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2996
2997 VkVertexInputBindingDescription input_binding;
2998 memset(&input_binding, 0, sizeof(input_binding));
2999
3000 VkVertexInputAttributeDescription input_attribs;
3001 memset(&input_attribs, 0, sizeof(input_attribs));
3002
3003 // Pick a really bad format for this purpose and make sure it should fail
3004 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3005 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3006 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003007 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003008 return;
3009 }
3010
3011 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003012 char const *vsSource =
3013 "#version 450\n"
3014 "\n"
3015 "out gl_PerVertex {\n"
3016 " vec4 gl_Position;\n"
3017 "};\n"
3018 "void main(){\n"
3019 " gl_Position = vec4(1);\n"
3020 "}\n";
3021 char const *fsSource =
3022 "#version 450\n"
3023 "\n"
3024 "layout(location=0) out vec4 color;\n"
3025 "void main(){\n"
3026 " color = vec4(1);\n"
3027 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003028
3029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3030 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3031 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3032
3033 VkPipelineObj pipe(m_device);
3034 pipe.AddColorAttachment();
3035 pipe.AddShader(&vs);
3036 pipe.AddShader(&fs);
3037
3038 pipe.AddVertexInputBindings(&input_binding, 1);
3039 pipe.AddVertexInputAttribs(&input_attribs, 1);
3040
3041 VkDescriptorSetObj descriptorSet(m_device);
3042 descriptorSet.AppendDummy();
3043 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3044
3045 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3046
3047 m_errorMonitor->VerifyFound();
3048}
3049
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003050TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003051 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003052 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003053
3054 VkMemoryPropertyFlags reqs = 0;
3055 VkImageCreateInfo image_create_info = {};
3056 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3057 image_create_info.pNext = NULL;
3058 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3059 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3060 image_create_info.extent.width = 256;
3061 image_create_info.extent.height = 256;
3062 image_create_info.extent.depth = 1;
3063 image_create_info.mipLevels = 1;
3064 image_create_info.arrayLayers = 1;
3065 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3066 image_create_info.flags = 0;
3067
3068 VkImageBlit blit_region = {};
3069 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3070 blit_region.srcSubresource.baseArrayLayer = 0;
3071 blit_region.srcSubresource.layerCount = 1;
3072 blit_region.srcSubresource.mipLevel = 0;
3073 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3074 blit_region.dstSubresource.baseArrayLayer = 0;
3075 blit_region.dstSubresource.layerCount = 1;
3076 blit_region.dstSubresource.mipLevel = 0;
3077
3078 // Create two images, the source with sampleCount = 2, and attempt to blit
3079 // between them
3080 {
3081 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003082 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003083 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003084 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003086 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003087 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003088 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003089 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003090 m_errorMonitor->SetDesiredFailureMsg(
3091 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3092 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003093 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3094 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 m_errorMonitor->VerifyFound();
3096 m_commandBuffer->EndCommandBuffer();
3097 }
3098
3099 // Create two images, the dest with sampleCount = 4, and attempt to blit
3100 // between them
3101 {
3102 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003103 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003104 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003105 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003106 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003107 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003108 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003109 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003110 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003111 m_errorMonitor->SetDesiredFailureMsg(
3112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3113 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003114 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3115 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 m_errorMonitor->VerifyFound();
3117 m_commandBuffer->EndCommandBuffer();
3118 }
3119
3120 VkBufferImageCopy copy_region = {};
3121 copy_region.bufferRowLength = 128;
3122 copy_region.bufferImageHeight = 128;
3123 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3124 copy_region.imageSubresource.layerCount = 1;
3125 copy_region.imageExtent.height = 64;
3126 copy_region.imageExtent.width = 64;
3127 copy_region.imageExtent.depth = 1;
3128
3129 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3130 // buffer to image
3131 {
3132 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003133 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3134 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003135 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003136 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003137 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003138 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003139 m_errorMonitor->SetDesiredFailureMsg(
3140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3141 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003142 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3143 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003144 m_errorMonitor->VerifyFound();
3145 m_commandBuffer->EndCommandBuffer();
3146 }
3147
3148 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3149 // image to buffer
3150 {
3151 vk_testing::Buffer dst_buffer;
3152 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3153 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003154 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003155 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003156 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003157 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003158 m_errorMonitor->SetDesiredFailureMsg(
3159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3160 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003161 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003162 dst_buffer.handle(), 1, &copy_region);
3163 m_errorMonitor->VerifyFound();
3164 m_commandBuffer->EndCommandBuffer();
3165 }
3166}
3167
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003168TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003169 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003170
3171 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003172 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003173 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003174 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003175 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003176 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003177
3178 VkImageBlit blitRegion = {};
3179 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3180 blitRegion.srcSubresource.baseArrayLayer = 0;
3181 blitRegion.srcSubresource.layerCount = 1;
3182 blitRegion.srcSubresource.mipLevel = 0;
3183 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3184 blitRegion.dstSubresource.baseArrayLayer = 0;
3185 blitRegion.dstSubresource.layerCount = 1;
3186 blitRegion.dstSubresource.mipLevel = 0;
3187
Dave Houlton34df4cb2016-12-01 16:43:06 -07003188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3189
3190 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3191 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003192
3193 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003194 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003195 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003196 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003197
3198 m_errorMonitor->VerifyFound();
3199
Dave Houlton34df4cb2016-12-01 16:43:06 -07003200 // Test should generate 2 VU failures
3201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003203
3204 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
Dave Houlton34df4cb2016-12-01 16:43:06 -07003208 // TODO: Note that this only verifies that at least one of the VU enums was found
3209 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003210 m_errorMonitor->VerifyFound();
3211
Tony Barbour552f6c02016-12-21 14:34:07 -07003212 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213}
3214
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003215TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3216 VkResult err;
3217 bool pass;
3218
3219 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003220 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003221
3222 // If w/d/h granularity is 1, test is not meaningful
3223 // TODO: When virtual device limits are available, create a set of limits for this test that
3224 // will always have a granularity of > 1 for w, h, and d
3225 auto index = m_device->graphics_queue_node_index_;
3226 auto queue_family_properties = m_device->phy().queue_properties();
3227
3228 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3229 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3230 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3231 return;
3232 }
3233
3234 // Create two images of different types and try to copy between them
3235 VkImage srcImage;
3236 VkImage dstImage;
3237 VkDeviceMemory srcMem;
3238 VkDeviceMemory destMem;
3239 VkMemoryRequirements memReqs;
3240
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003241 VkImageCreateInfo image_create_info = {};
3242 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3243 image_create_info.pNext = NULL;
3244 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3245 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3246 image_create_info.extent.width = 32;
3247 image_create_info.extent.height = 32;
3248 image_create_info.extent.depth = 1;
3249 image_create_info.mipLevels = 1;
3250 image_create_info.arrayLayers = 4;
3251 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3252 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3253 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3254 image_create_info.flags = 0;
3255
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003256 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003257 ASSERT_VK_SUCCESS(err);
3258
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003259 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003260 ASSERT_VK_SUCCESS(err);
3261
3262 // Allocate memory
3263 VkMemoryAllocateInfo memAlloc = {};
3264 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3265 memAlloc.pNext = NULL;
3266 memAlloc.allocationSize = 0;
3267 memAlloc.memoryTypeIndex = 0;
3268
3269 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3270 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003271 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 ASSERT_TRUE(pass);
3273 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3274 ASSERT_VK_SUCCESS(err);
3275
3276 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3277 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003278 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003279 ASSERT_VK_SUCCESS(err);
3280 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3281 ASSERT_VK_SUCCESS(err);
3282
3283 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3284 ASSERT_VK_SUCCESS(err);
3285 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3286 ASSERT_VK_SUCCESS(err);
3287
Tony Barbour552f6c02016-12-21 14:34:07 -07003288 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 VkImageCopy copyRegion;
3290 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3291 copyRegion.srcSubresource.mipLevel = 0;
3292 copyRegion.srcSubresource.baseArrayLayer = 0;
3293 copyRegion.srcSubresource.layerCount = 1;
3294 copyRegion.srcOffset.x = 0;
3295 copyRegion.srcOffset.y = 0;
3296 copyRegion.srcOffset.z = 0;
3297 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3298 copyRegion.dstSubresource.mipLevel = 0;
3299 copyRegion.dstSubresource.baseArrayLayer = 0;
3300 copyRegion.dstSubresource.layerCount = 1;
3301 copyRegion.dstOffset.x = 0;
3302 copyRegion.dstOffset.y = 0;
3303 copyRegion.dstOffset.z = 0;
3304 copyRegion.extent.width = 1;
3305 copyRegion.extent.height = 1;
3306 copyRegion.extent.depth = 1;
3307
3308 // Introduce failure by setting srcOffset to a bad granularity value
3309 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3311 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003312 m_errorMonitor->VerifyFound();
3313
3314 // Introduce failure by setting extent to a bad granularity value
3315 copyRegion.srcOffset.y = 0;
3316 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3318 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003319 m_errorMonitor->VerifyFound();
3320
3321 // Now do some buffer/image copies
3322 vk_testing::Buffer buffer;
3323 VkMemoryPropertyFlags reqs = 0;
3324 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3325 VkBufferImageCopy region = {};
3326 region.bufferOffset = 0;
3327 region.bufferRowLength = 3;
3328 region.bufferImageHeight = 128;
3329 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3330 region.imageSubresource.layerCount = 1;
3331 region.imageExtent.height = 16;
3332 region.imageExtent.width = 16;
3333 region.imageExtent.depth = 1;
3334 region.imageOffset.x = 0;
3335 region.imageOffset.y = 0;
3336 region.imageOffset.z = 0;
3337
3338 // Introduce failure by setting bufferRowLength to a bad granularity value
3339 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3341 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3342 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344 region.bufferRowLength = 128;
3345
3346 // Introduce failure by setting bufferOffset to a bad granularity value
3347 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3350 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003351 m_errorMonitor->VerifyFound();
3352 region.bufferOffset = 0;
3353
3354 // Introduce failure by setting bufferImageHeight to a bad granularity value
3355 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3357 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3358 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003359 m_errorMonitor->VerifyFound();
3360 region.bufferImageHeight = 128;
3361
3362 // Introduce failure by setting imageExtent to a bad granularity value
3363 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3365 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3366 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003367 m_errorMonitor->VerifyFound();
3368 region.imageExtent.width = 16;
3369
3370 // Introduce failure by setting imageOffset to a bad granularity value
3371 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3373 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3374 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003375 m_errorMonitor->VerifyFound();
3376
Tony Barbour552f6c02016-12-21 14:34:07 -07003377 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003378
3379 vkDestroyImage(m_device->device(), srcImage, NULL);
3380 vkDestroyImage(m_device->device(), dstImage, NULL);
3381 vkFreeMemory(m_device->device(), srcMem, NULL);
3382 vkFreeMemory(m_device->device(), destMem, NULL);
3383}
3384
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003385TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003386 TEST_DESCRIPTION(
3387 "Submit command buffer created using one queue family and "
3388 "attempt to submit them on a queue created in a different "
3389 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003390
Tony Barbour1fa09702017-03-16 12:09:08 -06003391 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003392
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003393 // This test is meaningless unless we have multiple queue families
3394 auto queue_family_properties = m_device->phy().queue_properties();
3395 if (queue_family_properties.size() < 2) {
3396 return;
3397 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003399 // Get safe index of another queue family
3400 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003401 VkQueue other_queue;
3402 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3403
3404 // Record an empty cmd buffer
3405 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3406 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3407 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3408 vkEndCommandBuffer(m_commandBuffer->handle());
3409
3410 // And submit on the wrong queue
3411 VkSubmitInfo submit_info = {};
3412 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3413 submit_info.commandBufferCount = 1;
3414 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003415 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416
3417 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003418}
3419
Chris Forbes4c24a922016-11-16 08:59:10 +13003420TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003421 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003422
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003423 // There are no attachments, but refer to attachment 0.
3424 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003425 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003426 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003427 };
3428
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003429 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003430 VkRenderPass rp;
3431
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003432 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003434 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3435 m_errorMonitor->VerifyFound();
3436}
3437
Chris Forbesa58c4522016-09-28 15:19:39 +13003438TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3439 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003440 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003441
3442 // A renderpass with two subpasses, both writing the same attachment.
3443 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003444 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3445 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3446 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003447 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003448 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003449 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003450 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3451 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003452 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003453 VkSubpassDependency dep = {0,
3454 1,
3455 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3456 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3457 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3458 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3459 VK_DEPENDENCY_BY_REGION_BIT};
3460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkRenderPass rp;
3462 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3463 ASSERT_VK_SUCCESS(err);
3464
3465 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003466 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003467 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3468
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003469 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003470 VkFramebuffer fb;
3471 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3472 ASSERT_VK_SUCCESS(err);
3473
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003474 char const *vsSource =
3475 "#version 450\n"
3476 "void main() { gl_Position = vec4(1); }\n";
3477 char const *fsSource =
3478 "#version 450\n"
3479 "layout(location=0) out vec4 color;\n"
3480 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003481
3482 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3484 VkPipelineObj pipe(m_device);
3485 pipe.AddColorAttachment();
3486 pipe.AddShader(&vs);
3487 pipe.AddShader(&fs);
3488 VkViewport view_port = {};
3489 m_viewports.push_back(view_port);
3490 pipe.SetViewport(m_viewports);
3491 VkRect2D rect = {};
3492 m_scissors.push_back(rect);
3493 pipe.SetScissor(m_scissors);
3494
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003495 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003496 VkPipelineLayout pl;
3497 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3498 ASSERT_VK_SUCCESS(err);
3499 pipe.CreateVKPipeline(pl, rp);
3500
Tony Barbour552f6c02016-12-21 14:34:07 -07003501 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003502
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003503 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3504 nullptr,
3505 rp,
3506 fb,
3507 {{
3508 0, 0,
3509 },
3510 {32, 32}},
3511 0,
3512 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003513
3514 // subtest 1: bind in the wrong subpass
3515 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3516 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003518 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3519 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3520 m_errorMonitor->VerifyFound();
3521
3522 vkCmdEndRenderPass(m_commandBuffer->handle());
3523
3524 // subtest 2: bind in correct subpass, then transition to next subpass
3525 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3526 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3527 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003529 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3530 m_errorMonitor->VerifyFound();
3531
3532 vkCmdEndRenderPass(m_commandBuffer->handle());
3533
Tony Barbour552f6c02016-12-21 14:34:07 -07003534 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003535
3536 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3537 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3538 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3539}
3540
Tony Barbour4e919972016-08-09 13:27:40 -06003541TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003542 TEST_DESCRIPTION(
3543 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3544 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003545 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3547
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3549 "Cannot execute a render pass with renderArea "
3550 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003551
3552 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3553 m_renderPassBeginInfo.renderArea.extent.width = 257;
3554 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003555 m_commandBuffer->BeginCommandBuffer();
3556 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003557 m_errorMonitor->VerifyFound();
3558}
3559
3560TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003561 TEST_DESCRIPTION(
3562 "Generate INDEPENDENT_BLEND by disabling independent "
3563 "blend and then specifying different blend states for two "
3564 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003565 VkPhysicalDeviceFeatures features = {};
3566 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003567 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003568
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3570 "Invalid Pipeline CreateInfo: If independent blend feature not "
3571 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003572
Cody Northropc31a84f2016-08-22 10:41:47 -06003573 VkDescriptorSetObj descriptorSet(m_device);
3574 descriptorSet.AppendDummy();
3575 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003576
Cody Northropc31a84f2016-08-22 10:41:47 -06003577 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003578 // Create a renderPass with two color attachments
3579 VkAttachmentReference attachments[2] = {};
3580 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003581 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003582 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3583
3584 VkSubpassDescription subpass = {};
3585 subpass.pColorAttachments = attachments;
3586 subpass.colorAttachmentCount = 2;
3587
3588 VkRenderPassCreateInfo rpci = {};
3589 rpci.subpassCount = 1;
3590 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003591 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003592
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 VkAttachmentDescription attach_desc[2] = {};
3594 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3595 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3596 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3597 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3598 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3599 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3600 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3601 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003602
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3605
3606 VkRenderPass renderpass;
3607 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003608 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003609 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003610
Cody Northropc31a84f2016-08-22 10:41:47 -06003611 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3612 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3613 att_state1.blendEnable = VK_TRUE;
3614 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3615 att_state2.blendEnable = VK_FALSE;
3616 pipeline.AddColorAttachment(0, &att_state1);
3617 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003618 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003619 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003620 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003621}
3622
Mike Weiblen40b160e2017-02-06 19:21:52 -07003623// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3624TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3625 TEST_DESCRIPTION(
3626 "Create a graphics pipeline that is incompatible with the requirements "
3627 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003628 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003629
3630 VkDescriptorSetObj ds_obj(m_device);
3631 ds_obj.AppendDummy();
3632 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3633
3634 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3635
3636 VkPipelineColorBlendAttachmentState att_state1 = {};
3637 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3638 att_state1.blendEnable = VK_TRUE;
3639
3640 VkRenderpassObj rp_obj(m_device);
3641
3642 {
3643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3644 VkPipelineObj pipeline(m_device);
3645 pipeline.AddShader(&vs_obj);
3646 pipeline.AddColorAttachment(0, &att_state1);
3647
3648 VkGraphicsPipelineCreateInfo info = {};
3649 pipeline.InitGraphicsPipelineCreateInfo(&info);
3650 info.pColorBlendState = nullptr;
3651
3652 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3653 m_errorMonitor->VerifyFound();
3654 }
3655}
3656
Cort Stratton7547f772017-05-04 15:18:52 -07003657TEST_F(VkLayerTest, CreateRenderPassAttachments) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003658 TEST_DESCRIPTION(
Cort Stratton7547f772017-05-04 15:18:52 -07003659 "Ensure that CreateRenderPass produces the expected validation errors "
3660 "when a subpass's attachments violate the valid usage conditions.");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003661
Tony Barbour1fa09702017-03-16 12:09:08 -06003662 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003663
Cort Stratton7547f772017-05-04 15:18:52 -07003664 std::vector<VkAttachmentDescription> attachments = {
3665 // input attachments
3666 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3667 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_GENERAL,
3668 VK_IMAGE_LAYOUT_GENERAL},
3669 // color attachments
3670 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3671 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3672 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3673 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3674 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3675 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3676 // depth attachment
3677 {0, VK_FORMAT_D24_UNORM_S8_UINT, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3678 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
3679 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
3680 // resolve attachment
3681 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3682 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3683 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3684 // preserve attachments
3685 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3686 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3687 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3688 };
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003689
Cort Stratton7547f772017-05-04 15:18:52 -07003690 std::vector<VkAttachmentReference> input = {
3691 {0, VK_IMAGE_LAYOUT_GENERAL},
3692 };
3693 std::vector<VkAttachmentReference> color = {
3694 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3695 };
3696 VkAttachmentReference depth = {3, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
3697 std::vector<VkAttachmentReference> resolve = {
3698 {4, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3699 };
3700 std::vector<uint32_t> preserve = {5};
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003701
Cort Stratton7547f772017-05-04 15:18:52 -07003702 VkSubpassDescription subpass = {0,
3703 VK_PIPELINE_BIND_POINT_GRAPHICS,
3704 (uint32_t)input.size(),
3705 input.data(),
3706 (uint32_t)color.size(),
3707 color.data(),
3708 resolve.data(),
3709 &depth,
3710 (uint32_t)preserve.size(),
3711 preserve.data()};
3712
3713 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3714 nullptr,
3715 0,
3716 (uint32_t)attachments.size(),
3717 attachments.data(),
3718 1,
3719 &subpass,
3720 0,
3721 nullptr};
3722
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003723 VkRenderPass rp;
Cort Stratton7547f772017-05-04 15:18:52 -07003724 VkResult err;
3725 // Test too many color attachments
3726 {
3727 std::vector<VkAttachmentReference> too_many_colors(m_device->props.limits.maxColorAttachments + 1, color[0]);
3728 subpass.colorAttachmentCount = (uint32_t)too_many_colors.size();
3729 subpass.pColorAttachments = too_many_colors.data();
3730 subpass.pResolveAttachments = NULL;
3731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00348);
3732 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3733 m_errorMonitor->VerifyFound();
3734 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3735 subpass.colorAttachmentCount = (uint32_t)color.size();
3736 subpass.pColorAttachments = color.data();
3737 subpass.pResolveAttachments = resolve.data();
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003738 }
Cort Stratton7547f772017-05-04 15:18:52 -07003739 // Test sample count mismatch between color buffers
3740 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3742 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003743 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003744 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003745 attachments[subpass.pColorAttachments[1].attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3746 // Test sample count mismatch between color buffers and depth buffer
3747 attachments[subpass.pDepthStencilAttachment->attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3749 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003750 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003751 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003752 attachments[subpass.pDepthStencilAttachment->attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3753 // Test resolve attachment with UNUSED color attachment
3754 color[0].attachment = VK_ATTACHMENT_UNUSED;
3755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00350);
3756 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003757 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003758 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003759 color[0].attachment = 1;
3760 // Test resolve from a single-sampled color attachment
3761 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3762 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_1_BIT; // avoid mismatch (00337)
3763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00351);
3764 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3765 m_errorMonitor->VerifyFound();
3766 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3767 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3768 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3769 // Test resolve to a multi-sampled resolve attachment
3770 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00352);
3772 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3773 m_errorMonitor->VerifyFound();
3774 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3775 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3776 // Test with color/resolve format mismatch
3777 attachments[subpass.pColorAttachments[0].attachment].format = VK_FORMAT_R8G8B8A8_SRGB;
3778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00353);
3779 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3780 m_errorMonitor->VerifyFound();
3781 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3782 attachments[subpass.pColorAttachments[0].attachment].format = attachments[subpass.pResolveAttachments[0].attachment].format;
3783 // Test for UNUSED preserve attachments
3784 preserve[0] = VK_ATTACHMENT_UNUSED;
3785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00356);
3786 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3787 m_errorMonitor->VerifyFound();
3788 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3789 preserve[0] = 5;
3790 // Test for preserve attachments used elsewhere in the subpass
3791 color[0].attachment = preserve[0];
3792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00357);
3793 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3794 m_errorMonitor->VerifyFound();
3795 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3796 color[0].attachment = 1;
3797 // test for layout mismatch between input attachment and color attachment
3798 input[0].attachment = color[0].attachment;
3799 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3801 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3802 m_errorMonitor->VerifyFound();
3803 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3804 input[0].attachment = 0;
3805 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3806 // test for layout mismatch between input attachment and depth attachment
3807 input[0].attachment = depth.attachment;
3808 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3810 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3811 m_errorMonitor->VerifyFound();
3812 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3813 input[0].attachment = 0;
3814 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3815 // Test for attachment used first as input with loadOp=CLEAR
3816 {
3817 std::vector<VkSubpassDescription> subpasses = {subpass, subpass, subpass};
3818 subpasses[0].inputAttachmentCount = 0;
3819 subpasses[1].inputAttachmentCount = 0;
3820 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3821 VkRenderPassCreateInfo rpci_multipass = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3822 nullptr,
3823 0,
3824 (uint32_t)attachments.size(),
3825 attachments.data(),
3826 (uint32_t)subpasses.size(),
3827 subpasses.data(),
3828 0,
3829 nullptr};
3830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00349);
3831 err = vkCreateRenderPass(m_device->device(), &rpci_multipass, nullptr, &rp);
3832 m_errorMonitor->VerifyFound();
3833 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3834 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3835 }
Chris Forbes3f128ef2016-06-29 14:58:53 +12003836}
3837
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003838TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003839 TEST_DESCRIPTION(
3840 "Hit errors when attempting to create a framebuffer :\n"
3841 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3842 " 2. Use a color image as depthStencil attachment\n"
3843 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3844 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3845 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3846 " 6. Framebuffer attachment where dimensions don't match\n"
Cort Stratton8133ec22017-04-27 16:25:03 +02003847 " 7. Framebuffer attachment where dimensions don't match\n"
3848 " 8. Framebuffer attachment w/o identity swizzle\n"
3849 " 9. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003850
Tony Barbour1fa09702017-03-16 12:09:08 -06003851 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3853
Cort Stratton8133ec22017-04-27 16:25:03 +02003854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00404);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003855
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003856 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003857 VkAttachmentReference attach = {};
3858 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3859 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003860 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003861 VkRenderPassCreateInfo rpci = {};
3862 rpci.subpassCount = 1;
3863 rpci.pSubpasses = &subpass;
3864 rpci.attachmentCount = 1;
3865 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003866 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003867 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003868 rpci.pAttachments = &attach_desc;
3869 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3870 VkRenderPass rp;
3871 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3872 ASSERT_VK_SUCCESS(err);
3873
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003874 VkImageView ivs[2];
3875 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3876 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003877 VkFramebufferCreateInfo fb_info = {};
3878 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3879 fb_info.pNext = NULL;
3880 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003881 // Set mis-matching attachmentCount
3882 fb_info.attachmentCount = 2;
3883 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003884 fb_info.width = 100;
3885 fb_info.height = 100;
3886 fb_info.layers = 1;
3887
3888 VkFramebuffer fb;
3889 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3890
3891 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 if (err == VK_SUCCESS) {
3893 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3894 }
3895 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003896
3897 // Create a renderPass with a depth-stencil attachment created with
3898 // IMAGE_USAGE_COLOR_ATTACHMENT
3899 // Add our color attachment to pDepthStencilAttachment
3900 subpass.pDepthStencilAttachment = &attach;
3901 subpass.pColorAttachments = NULL;
3902 VkRenderPass rp_ds;
3903 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3904 ASSERT_VK_SUCCESS(err);
3905 // Set correct attachment count, but attachment has COLOR usage bit set
3906 fb_info.attachmentCount = 1;
3907 fb_info.renderPass = rp_ds;
3908
Cort Stratton8133ec22017-04-27 16:25:03 +02003909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00406);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003910 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3911
3912 m_errorMonitor->VerifyFound();
3913 if (err == VK_SUCCESS) {
3914 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3915 }
3916 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003917
3918 // Create new renderpass with alternate attachment format from fb
3919 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3920 subpass.pDepthStencilAttachment = NULL;
3921 subpass.pColorAttachments = &attach;
3922 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3923 ASSERT_VK_SUCCESS(err);
3924
3925 // Cause error due to mis-matched formats between rp & fb
3926 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3927 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00408);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003929 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3930
3931 m_errorMonitor->VerifyFound();
3932 if (err == VK_SUCCESS) {
3933 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3934 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003935 vkDestroyRenderPass(m_device->device(), rp, NULL);
3936
3937 // Create new renderpass with alternate sample count from fb
3938 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3939 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3940 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3941 ASSERT_VK_SUCCESS(err);
3942
3943 // Cause error due to mis-matched sample count between rp & fb
3944 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00409);
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003946 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3947
3948 m_errorMonitor->VerifyFound();
3949 if (err == VK_SUCCESS) {
3950 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3951 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003952
3953 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003954
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003955 {
3956 // Create an image with 2 mip levels.
3957 VkImageObj image(m_device);
3958 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3959 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003960
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003961 // Create a image view with two mip levels.
3962 VkImageView view;
3963 VkImageViewCreateInfo ivci = {};
3964 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3965 ivci.image = image.handle();
3966 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3967 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3968 ivci.subresourceRange.layerCount = 1;
3969 ivci.subresourceRange.baseMipLevel = 0;
3970 // Set level count to 2 (only 1 is allowed for FB attachment)
3971 ivci.subresourceRange.levelCount = 2;
3972 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3973 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3974 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003975
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003976 // Re-create renderpass to have matching sample count
3977 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3978 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3979 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003981 fb_info.renderPass = rp;
3982 fb_info.pAttachments = &view;
Cort Stratton8133ec22017-04-27 16:25:03 +02003983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00411);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003984 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3985
3986 m_errorMonitor->VerifyFound();
3987 if (err == VK_SUCCESS) {
3988 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3989 }
3990 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003991 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003992
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003993 // Update view to original color buffer and grow FB dimensions too big
3994 fb_info.pAttachments = ivs;
3995 fb_info.height = 1024;
3996 fb_info.width = 1024;
3997 fb_info.layers = 2;
Cort Stratton8133ec22017-04-27 16:25:03 +02003998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003999 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4000
4001 m_errorMonitor->VerifyFound();
4002 if (err == VK_SUCCESS) {
4003 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4004 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004005
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004006 {
4007 // Create an image with one mip level.
4008 VkImageObj image(m_device);
4009 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4010 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004011
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004012 // Create view attachment with non-identity swizzle
4013 VkImageView view;
4014 VkImageViewCreateInfo ivci = {};
4015 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4016 ivci.image = image.handle();
4017 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4018 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4019 ivci.subresourceRange.layerCount = 1;
4020 ivci.subresourceRange.baseMipLevel = 0;
4021 ivci.subresourceRange.levelCount = 1;
4022 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4023 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4024 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4025 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4026 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4027 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4028 ASSERT_VK_SUCCESS(err);
4029
4030 fb_info.pAttachments = &view;
4031 fb_info.height = 100;
4032 fb_info.width = 100;
4033 fb_info.layers = 1;
4034
Cort Stratton8133ec22017-04-27 16:25:03 +02004035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00412);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004036 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4037
4038 m_errorMonitor->VerifyFound();
4039 if (err == VK_SUCCESS) {
4040 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4041 }
4042 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004043 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004044
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004045 // reset attachment to color attachment
4046 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004047
4048 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004049 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004050 fb_info.height = 100;
4051 fb_info.layers = 1;
4052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Cort Stratton8133ec22017-04-27 16:25:03 +02004053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004054 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004055 m_errorMonitor->VerifyFound();
4056 if (err == VK_SUCCESS) {
4057 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4058 }
4059 // and width=0
4060 fb_info.width = 0;
4061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02806);
4062 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004063 m_errorMonitor->VerifyFound();
4064 if (err == VK_SUCCESS) {
4065 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4066 }
4067
4068 // Request fb that exceeds max height
4069 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004070 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004071 fb_info.layers = 1;
4072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Cort Stratton8133ec22017-04-27 16:25:03 +02004073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004074 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004075 m_errorMonitor->VerifyFound();
4076 if (err == VK_SUCCESS) {
4077 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4078 }
4079 // and height=0
4080 fb_info.height = 0;
4081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02807);
4082 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004083 m_errorMonitor->VerifyFound();
4084 if (err == VK_SUCCESS) {
4085 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4086 }
4087
4088 // Request fb that exceeds max layers
4089 fb_info.width = 100;
4090 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004091 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Cort Stratton8133ec22017-04-27 16:25:03 +02004093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004094 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004095 m_errorMonitor->VerifyFound();
4096 if (err == VK_SUCCESS) {
4097 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4098 }
4099 // and layers=0
4100 fb_info.layers = 0;
4101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02808);
4102 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinski33826372017-04-13 11:10:11 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Mark Lobodzinski33826372017-04-13 11:10:11 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinski33826372017-04-13 11:10:11 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005060 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005194 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005195 subpass.pColorAttachments = &attach;
5196 VkRenderPassCreateInfo rpci = {};
5197 rpci.subpassCount = 1;
5198 rpci.pSubpasses = &subpass;
5199 rpci.attachmentCount = 1;
5200 VkAttachmentDescription attach_desc = {};
5201 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5202 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5203 rpci.pAttachments = &attach_desc;
5204 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5205 VkRenderPass rp;
5206 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5207 ASSERT_VK_SUCCESS(err);
5208
5209 // Create a pipeline that uses the given renderpass
5210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5212
5213 VkPipelineLayout pipeline_layout;
5214 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5215 ASSERT_VK_SUCCESS(err);
5216
5217 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5218 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005220 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005221 vp_state_ci.pViewports = &vp;
5222 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005223 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 vp_state_ci.pScissors = &scissors;
5225
5226 VkPipelineShaderStageCreateInfo shaderStages[2];
5227 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5228
5229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005230 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005231 // but add it to be able to run on more devices
5232 shaderStages[0] = vs.GetStageCreateInfo();
5233 shaderStages[1] = fs.GetStageCreateInfo();
5234
5235 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5236 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5237
5238 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5239 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5240 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5241
5242 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5243 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5244 rs_ci.rasterizerDiscardEnable = true;
5245 rs_ci.lineWidth = 1.0f;
5246
5247 VkPipelineColorBlendAttachmentState att = {};
5248 att.blendEnable = VK_FALSE;
5249 att.colorWriteMask = 0xf;
5250
5251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5253 cb_ci.attachmentCount = 1;
5254 cb_ci.pAttachments = &att;
5255
5256 VkGraphicsPipelineCreateInfo gp_ci = {};
5257 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5258 gp_ci.stageCount = 2;
5259 gp_ci.pStages = shaderStages;
5260 gp_ci.pVertexInputState = &vi_ci;
5261 gp_ci.pInputAssemblyState = &ia_ci;
5262 gp_ci.pViewportState = &vp_state_ci;
5263 gp_ci.pRasterizationState = &rs_ci;
5264 gp_ci.pColorBlendState = &cb_ci;
5265 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5266 gp_ci.layout = pipeline_layout;
5267 gp_ci.renderPass = rp;
5268
5269 VkPipelineCacheCreateInfo pc_ci = {};
5270 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5271
Dave Houlton756e6742017-03-23 14:33:22 -06005272 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 VkPipeline pipeline;
5274 VkPipelineCache pipe_cache;
5275 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5276 ASSERT_VK_SUCCESS(err);
5277
5278 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5279 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005280
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005281 // Bind pipeline to cmd buffer, will also bind renderpass
5282 m_commandBuffer->BeginCommandBuffer();
5283 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5284 m_commandBuffer->EndCommandBuffer();
5285
5286 VkSubmitInfo submit_info = {};
5287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5288 submit_info.commandBufferCount = 1;
5289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5290 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005291 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005292
5293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5294 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5295 m_errorMonitor->VerifyFound();
5296
5297 // Wait for queue to complete so we can safely destroy everything
5298 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005299 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005300 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005301 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5302 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5303 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5304 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5305}
5306
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005307TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005308 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005310
5311 VkImage image;
5312 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5313 VkImageCreateInfo image_create_info = {};
5314 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5315 image_create_info.pNext = NULL;
5316 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5317 image_create_info.format = tex_format;
5318 image_create_info.extent.width = 32;
5319 image_create_info.extent.height = 32;
5320 image_create_info.extent.depth = 1;
5321 image_create_info.mipLevels = 1;
5322 image_create_info.arrayLayers = 1;
5323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5324 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005326 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005327 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005328 ASSERT_VK_SUCCESS(err);
5329 // Have to bind memory to image before recording cmd in cmd buffer using it
5330 VkMemoryRequirements mem_reqs;
5331 VkDeviceMemory image_mem;
5332 bool pass;
5333 VkMemoryAllocateInfo mem_alloc = {};
5334 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5335 mem_alloc.pNext = NULL;
5336 mem_alloc.memoryTypeIndex = 0;
5337 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5338 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005339 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340 ASSERT_TRUE(pass);
5341 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5342 ASSERT_VK_SUCCESS(err);
5343
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005344 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005346 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005347
5348 m_commandBuffer->BeginCommandBuffer();
5349 VkClearColorValue ccv;
5350 ccv.float32[0] = 1.0f;
5351 ccv.float32[1] = 1.0f;
5352 ccv.float32[2] = 1.0f;
5353 ccv.float32[3] = 1.0f;
5354 VkImageSubresourceRange isr = {};
5355 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5356 isr.baseArrayLayer = 0;
5357 isr.baseMipLevel = 0;
5358 isr.layerCount = 1;
5359 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005360 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005361 m_commandBuffer->EndCommandBuffer();
5362
5363 m_errorMonitor->VerifyFound();
5364 vkDestroyImage(m_device->device(), image, NULL);
5365 vkFreeMemory(m_device->device(), image_mem, nullptr);
5366}
5367
5368TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005371
5372 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005373 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005374 VK_IMAGE_TILING_OPTIMAL, 0);
5375 ASSERT_TRUE(image.initialized());
5376
5377 VkBuffer buffer;
5378 VkDeviceMemory mem;
5379 VkMemoryRequirements mem_reqs;
5380
5381 VkBufferCreateInfo buf_info = {};
5382 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005383 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005384 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005385 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5386 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5387 ASSERT_VK_SUCCESS(err);
5388
5389 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5390
5391 VkMemoryAllocateInfo alloc_info = {};
5392 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005393 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005394 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005395 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005396 if (!pass) {
5397 vkDestroyBuffer(m_device->device(), buffer, NULL);
5398 return;
5399 }
5400 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5401 ASSERT_VK_SUCCESS(err);
5402
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005403 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005405 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005406 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005407 region.bufferRowLength = 16;
5408 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005409 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5410
5411 region.imageSubresource.layerCount = 1;
5412 region.imageExtent.height = 4;
5413 region.imageExtent.width = 4;
5414 region.imageExtent.depth = 1;
5415 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005416 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5417 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005418 m_commandBuffer->EndCommandBuffer();
5419
5420 m_errorMonitor->VerifyFound();
5421
5422 vkDestroyBuffer(m_device->device(), buffer, NULL);
5423 vkFreeMemory(m_device->handle(), mem, NULL);
5424}
5425
Tobin Ehlis85940f52016-07-07 16:57:21 -06005426TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005427 TEST_DESCRIPTION(
5428 "Attempt to draw with a command buffer that is invalid "
5429 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005431
5432 VkEvent event;
5433 VkEventCreateInfo evci = {};
5434 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5435 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5436 ASSERT_VK_SUCCESS(result);
5437
5438 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005439 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005440 m_commandBuffer->EndCommandBuffer();
5441
Mark Lobodzinski33826372017-04-13 11:10:11 -06005442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005443 // Destroy event dependency prior to submit to cause ERROR
5444 vkDestroyEvent(m_device->device(), event, NULL);
5445
5446 VkSubmitInfo submit_info = {};
5447 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5448 submit_info.commandBufferCount = 1;
5449 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5450 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5451
5452 m_errorMonitor->VerifyFound();
5453}
5454
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005455TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005456 TEST_DESCRIPTION(
5457 "Attempt to draw with a command buffer that is invalid "
5458 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005459 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005460
5461 VkQueryPool query_pool;
5462 VkQueryPoolCreateInfo qpci{};
5463 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5464 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5465 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005466 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005467 ASSERT_VK_SUCCESS(result);
5468
5469 m_commandBuffer->BeginCommandBuffer();
5470 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5471 m_commandBuffer->EndCommandBuffer();
5472
Mark Lobodzinski33826372017-04-13 11:10:11 -06005473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005474 // Destroy query pool dependency prior to submit to cause ERROR
5475 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5476
5477 VkSubmitInfo submit_info = {};
5478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5479 submit_info.commandBufferCount = 1;
5480 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5482
5483 m_errorMonitor->VerifyFound();
5484}
5485
Tobin Ehlis24130d92016-07-08 15:50:53 -06005486TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005487 TEST_DESCRIPTION(
5488 "Attempt to draw with a command buffer that is invalid "
5489 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005490 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5492
5493 VkResult err;
5494
5495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5497
5498 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005500 ASSERT_VK_SUCCESS(err);
5501
5502 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5503 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5504 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005505 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005506 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005507 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005508 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005510
5511 VkPipelineShaderStageCreateInfo shaderStages[2];
5512 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5513
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005514 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005515 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005516 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005517 shaderStages[0] = vs.GetStageCreateInfo();
5518 shaderStages[1] = fs.GetStageCreateInfo();
5519
5520 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5521 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5522
5523 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5524 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5525 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5526
5527 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5528 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005529 rs_ci.rasterizerDiscardEnable = true;
5530 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005531
5532 VkPipelineColorBlendAttachmentState att = {};
5533 att.blendEnable = VK_FALSE;
5534 att.colorWriteMask = 0xf;
5535
5536 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5537 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5538 cb_ci.attachmentCount = 1;
5539 cb_ci.pAttachments = &att;
5540
5541 VkGraphicsPipelineCreateInfo gp_ci = {};
5542 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5543 gp_ci.stageCount = 2;
5544 gp_ci.pStages = shaderStages;
5545 gp_ci.pVertexInputState = &vi_ci;
5546 gp_ci.pInputAssemblyState = &ia_ci;
5547 gp_ci.pViewportState = &vp_state_ci;
5548 gp_ci.pRasterizationState = &rs_ci;
5549 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005550 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5551 gp_ci.layout = pipeline_layout;
5552 gp_ci.renderPass = renderPass();
5553
5554 VkPipelineCacheCreateInfo pc_ci = {};
5555 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5556
5557 VkPipeline pipeline;
5558 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005559 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005560 ASSERT_VK_SUCCESS(err);
5561
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005562 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005563 ASSERT_VK_SUCCESS(err);
5564
5565 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005566 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567 m_commandBuffer->EndCommandBuffer();
5568 // Now destroy pipeline in order to cause error when submitting
5569 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5570
Mark Lobodzinski33826372017-04-13 11:10:11 -06005571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005572
5573 VkSubmitInfo submit_info = {};
5574 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5575 submit_info.commandBufferCount = 1;
5576 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5578
5579 m_errorMonitor->VerifyFound();
5580 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5581 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5582}
5583
Tobin Ehlis31289162016-08-17 14:57:58 -06005584TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005585 TEST_DESCRIPTION(
5586 "Attempt to draw with a command buffer that is invalid "
5587 "due to a bound descriptor set with a buffer dependency "
5588 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005590 ASSERT_NO_FATAL_FAILURE(InitViewport());
5591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5592
5593 VkDescriptorPoolSize ds_type_count = {};
5594 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5595 ds_type_count.descriptorCount = 1;
5596
5597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5599 ds_pool_ci.pNext = NULL;
5600 ds_pool_ci.maxSets = 1;
5601 ds_pool_ci.poolSizeCount = 1;
5602 ds_pool_ci.pPoolSizes = &ds_type_count;
5603
5604 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSetLayoutBinding dsl_binding = {};
5609 dsl_binding.binding = 0;
5610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5611 dsl_binding.descriptorCount = 1;
5612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5613 dsl_binding.pImmutableSamplers = NULL;
5614
5615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5617 ds_layout_ci.pNext = NULL;
5618 ds_layout_ci.bindingCount = 1;
5619 ds_layout_ci.pBindings = &dsl_binding;
5620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSet descriptorSet;
5625 VkDescriptorSetAllocateInfo alloc_info = {};
5626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5627 alloc_info.descriptorSetCount = 1;
5628 alloc_info.descriptorPool = ds_pool;
5629 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5635 pipeline_layout_ci.pNext = NULL;
5636 pipeline_layout_ci.setLayoutCount = 1;
5637 pipeline_layout_ci.pSetLayouts = &ds_layout;
5638
5639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005641 ASSERT_VK_SUCCESS(err);
5642
5643 // Create a buffer to update the descriptor with
5644 uint32_t qfi = 0;
5645 VkBufferCreateInfo buffCI = {};
5646 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5647 buffCI.size = 1024;
5648 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5649 buffCI.queueFamilyIndexCount = 1;
5650 buffCI.pQueueFamilyIndices = &qfi;
5651
5652 VkBuffer buffer;
5653 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5654 ASSERT_VK_SUCCESS(err);
5655 // Allocate memory and bind to buffer so we can make it to the appropriate
5656 // error
5657 VkMemoryAllocateInfo mem_alloc = {};
5658 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5659 mem_alloc.pNext = NULL;
5660 mem_alloc.allocationSize = 1024;
5661 mem_alloc.memoryTypeIndex = 0;
5662
5663 VkMemoryRequirements memReqs;
5664 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005665 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005666 if (!pass) {
5667 vkDestroyBuffer(m_device->device(), buffer, NULL);
5668 return;
5669 }
5670
5671 VkDeviceMemory mem;
5672 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5673 ASSERT_VK_SUCCESS(err);
5674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5675 ASSERT_VK_SUCCESS(err);
5676 // Correctly update descriptor to avoid "NOT_UPDATED" error
5677 VkDescriptorBufferInfo buffInfo = {};
5678 buffInfo.buffer = buffer;
5679 buffInfo.offset = 0;
5680 buffInfo.range = 1024;
5681
5682 VkWriteDescriptorSet descriptor_write;
5683 memset(&descriptor_write, 0, sizeof(descriptor_write));
5684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5685 descriptor_write.dstSet = descriptorSet;
5686 descriptor_write.dstBinding = 0;
5687 descriptor_write.descriptorCount = 1;
5688 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5689 descriptor_write.pBufferInfo = &buffInfo;
5690
5691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5692
5693 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005694 char const *vsSource =
5695 "#version 450\n"
5696 "\n"
5697 "out gl_PerVertex { \n"
5698 " vec4 gl_Position;\n"
5699 "};\n"
5700 "void main(){\n"
5701 " gl_Position = vec4(1);\n"
5702 "}\n";
5703 char const *fsSource =
5704 "#version 450\n"
5705 "\n"
5706 "layout(location=0) out vec4 x;\n"
5707 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5708 "void main(){\n"
5709 " x = vec4(bar.y);\n"
5710 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5713 VkPipelineObj pipe(m_device);
5714 pipe.AddShader(&vs);
5715 pipe.AddShader(&fs);
5716 pipe.AddColorAttachment();
5717 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5718
Tony Barbour552f6c02016-12-21 14:34:07 -07005719 m_commandBuffer->BeginCommandBuffer();
5720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005721 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5722 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5723 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005724
5725 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5726 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5727
Tobin Ehlis31289162016-08-17 14:57:58 -06005728 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005729 m_commandBuffer->EndRenderPass();
5730 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005732 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5733 vkDestroyBuffer(m_device->device(), buffer, NULL);
5734 // Attempt to submit cmd buffer
5735 VkSubmitInfo submit_info = {};
5736 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5737 submit_info.commandBufferCount = 1;
5738 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5740 m_errorMonitor->VerifyFound();
5741 // Cleanup
5742 vkFreeMemory(m_device->device(), mem, NULL);
5743
5744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5747}
5748
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005749TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005750 TEST_DESCRIPTION(
5751 "Attempt to draw with a command buffer that is invalid "
5752 "due to a bound descriptor sets with a combined image "
5753 "sampler having their image, sampler, and descriptor set "
5754 "each respectively destroyed and then attempting to "
5755 "submit associated cmd buffers. Attempt to destroy a "
5756 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005757 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005758 ASSERT_NO_FATAL_FAILURE(InitViewport());
5759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5760
5761 VkDescriptorPoolSize ds_type_count = {};
5762 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5763 ds_type_count.descriptorCount = 1;
5764
5765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5767 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005768 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005769 ds_pool_ci.maxSets = 1;
5770 ds_pool_ci.poolSizeCount = 1;
5771 ds_pool_ci.pPoolSizes = &ds_type_count;
5772
5773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005775 ASSERT_VK_SUCCESS(err);
5776
5777 VkDescriptorSetLayoutBinding dsl_binding = {};
5778 dsl_binding.binding = 0;
5779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5780 dsl_binding.descriptorCount = 1;
5781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5782 dsl_binding.pImmutableSamplers = NULL;
5783
5784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5786 ds_layout_ci.pNext = NULL;
5787 ds_layout_ci.bindingCount = 1;
5788 ds_layout_ci.pBindings = &dsl_binding;
5789 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 ASSERT_VK_SUCCESS(err);
5792
5793 VkDescriptorSet descriptorSet;
5794 VkDescriptorSetAllocateInfo alloc_info = {};
5795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5796 alloc_info.descriptorSetCount = 1;
5797 alloc_info.descriptorPool = ds_pool;
5798 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_VK_SUCCESS(err);
5801
5802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5804 pipeline_layout_ci.pNext = NULL;
5805 pipeline_layout_ci.setLayoutCount = 1;
5806 pipeline_layout_ci.pSetLayouts = &ds_layout;
5807
5808 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005810 ASSERT_VK_SUCCESS(err);
5811
5812 // Create images to update the descriptor with
5813 VkImage image;
5814 VkImage image2;
5815 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5816 const int32_t tex_width = 32;
5817 const int32_t tex_height = 32;
5818 VkImageCreateInfo image_create_info = {};
5819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5820 image_create_info.pNext = NULL;
5821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5822 image_create_info.format = tex_format;
5823 image_create_info.extent.width = tex_width;
5824 image_create_info.extent.height = tex_height;
5825 image_create_info.extent.depth = 1;
5826 image_create_info.mipLevels = 1;
5827 image_create_info.arrayLayers = 1;
5828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5831 image_create_info.flags = 0;
5832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5833 ASSERT_VK_SUCCESS(err);
5834 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5835 ASSERT_VK_SUCCESS(err);
5836
5837 VkMemoryRequirements memory_reqs;
5838 VkDeviceMemory image_memory;
5839 bool pass;
5840 VkMemoryAllocateInfo memory_info = {};
5841 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5842 memory_info.pNext = NULL;
5843 memory_info.allocationSize = 0;
5844 memory_info.memoryTypeIndex = 0;
5845 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5846 // Allocate enough memory for both images
5847 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005848 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005849 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005850 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005851 ASSERT_VK_SUCCESS(err);
5852 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5853 ASSERT_VK_SUCCESS(err);
5854 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005856 ASSERT_VK_SUCCESS(err);
5857
5858 VkImageViewCreateInfo image_view_create_info = {};
5859 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5860 image_view_create_info.image = image;
5861 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5862 image_view_create_info.format = tex_format;
5863 image_view_create_info.subresourceRange.layerCount = 1;
5864 image_view_create_info.subresourceRange.baseMipLevel = 0;
5865 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005866 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005867
5868 VkImageView view;
5869 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005870 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005871 ASSERT_VK_SUCCESS(err);
5872 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005874 ASSERT_VK_SUCCESS(err);
5875 // Create Samplers
5876 VkSamplerCreateInfo sampler_ci = {};
5877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5878 sampler_ci.pNext = NULL;
5879 sampler_ci.magFilter = VK_FILTER_NEAREST;
5880 sampler_ci.minFilter = VK_FILTER_NEAREST;
5881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5885 sampler_ci.mipLodBias = 1.0;
5886 sampler_ci.anisotropyEnable = VK_FALSE;
5887 sampler_ci.maxAnisotropy = 1;
5888 sampler_ci.compareEnable = VK_FALSE;
5889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5890 sampler_ci.minLod = 1.0;
5891 sampler_ci.maxLod = 1.0;
5892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5894 VkSampler sampler;
5895 VkSampler sampler2;
5896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5897 ASSERT_VK_SUCCESS(err);
5898 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5899 ASSERT_VK_SUCCESS(err);
5900 // Update descriptor with image and sampler
5901 VkDescriptorImageInfo img_info = {};
5902 img_info.sampler = sampler;
5903 img_info.imageView = view;
5904 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5905
5906 VkWriteDescriptorSet descriptor_write;
5907 memset(&descriptor_write, 0, sizeof(descriptor_write));
5908 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5909 descriptor_write.dstSet = descriptorSet;
5910 descriptor_write.dstBinding = 0;
5911 descriptor_write.descriptorCount = 1;
5912 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5913 descriptor_write.pImageInfo = &img_info;
5914
5915 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5916
5917 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005918 char const *vsSource =
5919 "#version 450\n"
5920 "\n"
5921 "out gl_PerVertex { \n"
5922 " vec4 gl_Position;\n"
5923 "};\n"
5924 "void main(){\n"
5925 " gl_Position = vec4(1);\n"
5926 "}\n";
5927 char const *fsSource =
5928 "#version 450\n"
5929 "\n"
5930 "layout(set=0, binding=0) uniform sampler2D s;\n"
5931 "layout(location=0) out vec4 x;\n"
5932 "void main(){\n"
5933 " x = texture(s, vec2(1));\n"
5934 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5937 VkPipelineObj pipe(m_device);
5938 pipe.AddShader(&vs);
5939 pipe.AddShader(&fs);
5940 pipe.AddColorAttachment();
5941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5942
5943 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005945 m_commandBuffer->BeginCommandBuffer();
5946 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005947 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5948 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5949 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005950 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5951 VkRect2D scissor = {{0, 0}, {16, 16}};
5952 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5953 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005954 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005955 m_commandBuffer->EndRenderPass();
5956 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005957 // Destroy sampler invalidates the cmd buffer, causing error on submit
5958 vkDestroySampler(m_device->device(), sampler, NULL);
5959 // Attempt to submit cmd buffer
5960 VkSubmitInfo submit_info = {};
5961 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5962 submit_info.commandBufferCount = 1;
5963 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5965 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005966
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005967 // Now re-update descriptor with valid sampler and delete image
5968 img_info.sampler = sampler2;
5969 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005970
5971 VkCommandBufferBeginInfo info = {};
5972 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5973 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5974
Mark Lobodzinski33826372017-04-13 11:10:11 -06005975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005976 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005977 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005978 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5979 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5980 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005981 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5982 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005983 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005984 m_commandBuffer->EndRenderPass();
5985 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005986 // Destroy image invalidates the cmd buffer, causing error on submit
5987 vkDestroyImage(m_device->device(), image, NULL);
5988 // Attempt to submit cmd buffer
5989 submit_info = {};
5990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5991 submit_info.commandBufferCount = 1;
5992 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5994 m_errorMonitor->VerifyFound();
5995 // Now update descriptor to be valid, but then free descriptor
5996 img_info.imageView = view2;
5997 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005998 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005999 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006000 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6001 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6002 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006003 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6004 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006005 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006006 m_commandBuffer->EndRenderPass();
6007 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006009
6010 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006012 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006013 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006014
6015 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006016 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006017 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006018 m_errorMonitor->SetUnexpectedError(
6019 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6020 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006021 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006022 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6023
6024 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006030 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6031 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006032
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006033 // Cleanup
6034 vkFreeMemory(m_device->device(), image_memory, NULL);
6035 vkDestroySampler(m_device->device(), sampler2, NULL);
6036 vkDestroyImage(m_device->device(), image2, NULL);
6037 vkDestroyImageView(m_device->device(), view, NULL);
6038 vkDestroyImageView(m_device->device(), view2, NULL);
6039 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6042}
6043
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006044TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6045 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6046 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6047 ASSERT_NO_FATAL_FAILURE(InitViewport());
6048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6049
6050 VkDescriptorPoolSize ds_type_count = {};
6051 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6052 ds_type_count.descriptorCount = 1;
6053
6054 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6055 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6056 ds_pool_ci.pNext = NULL;
6057 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6058 ds_pool_ci.maxSets = 1;
6059 ds_pool_ci.poolSizeCount = 1;
6060 ds_pool_ci.pPoolSizes = &ds_type_count;
6061
6062 VkDescriptorPool ds_pool;
6063 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6064 ASSERT_VK_SUCCESS(err);
6065
6066 VkDescriptorSetLayoutBinding dsl_binding = {};
6067 dsl_binding.binding = 0;
6068 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6069 dsl_binding.descriptorCount = 1;
6070 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6071 dsl_binding.pImmutableSamplers = NULL;
6072
6073 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6074 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6075 ds_layout_ci.pNext = NULL;
6076 ds_layout_ci.bindingCount = 1;
6077 ds_layout_ci.pBindings = &dsl_binding;
6078 VkDescriptorSetLayout ds_layout;
6079 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6080 ASSERT_VK_SUCCESS(err);
6081
6082 VkDescriptorSet descriptorSet;
6083 VkDescriptorSetAllocateInfo alloc_info = {};
6084 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6085 alloc_info.descriptorSetCount = 1;
6086 alloc_info.descriptorPool = ds_pool;
6087 alloc_info.pSetLayouts = &ds_layout;
6088 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6089 ASSERT_VK_SUCCESS(err);
6090
6091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6093 pipeline_layout_ci.pNext = NULL;
6094 pipeline_layout_ci.setLayoutCount = 1;
6095 pipeline_layout_ci.pSetLayouts = &ds_layout;
6096
6097 VkPipelineLayout pipeline_layout;
6098 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6099 ASSERT_VK_SUCCESS(err);
6100
6101 // Create images to update the descriptor with
6102 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6103 VkImageObj image(m_device);
6104 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6105 0);
6106 ASSERT_TRUE(image.initialized());
6107
6108 VkImageViewCreateInfo image_view_create_info = {};
6109 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6110 image_view_create_info.image = image.handle();
6111 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6112 image_view_create_info.format = format;
6113 image_view_create_info.subresourceRange.layerCount = 1;
6114 image_view_create_info.subresourceRange.baseMipLevel = 0;
6115 image_view_create_info.subresourceRange.levelCount = 1;
6116 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6117
6118 VkImageView view;
6119 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6120 ASSERT_VK_SUCCESS(err);
6121 // Create Sampler
6122 VkSamplerCreateInfo sampler_ci = {};
6123 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6124 sampler_ci.pNext = NULL;
6125 sampler_ci.magFilter = VK_FILTER_NEAREST;
6126 sampler_ci.minFilter = VK_FILTER_NEAREST;
6127 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6128 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6129 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6130 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6131 sampler_ci.mipLodBias = 1.0;
6132 sampler_ci.anisotropyEnable = VK_FALSE;
6133 sampler_ci.maxAnisotropy = 1;
6134 sampler_ci.compareEnable = VK_FALSE;
6135 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6136 sampler_ci.minLod = 1.0;
6137 sampler_ci.maxLod = 1.0;
6138 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6139 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6140 VkSampler sampler;
6141 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6142 ASSERT_VK_SUCCESS(err);
6143 // Update descriptor with image and sampler
6144 VkDescriptorImageInfo img_info = {};
6145 img_info.sampler = sampler;
6146 img_info.imageView = view;
6147 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6148 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6149
6150 VkWriteDescriptorSet descriptor_write;
6151 memset(&descriptor_write, 0, sizeof(descriptor_write));
6152 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6153 descriptor_write.dstSet = descriptorSet;
6154 descriptor_write.dstBinding = 0;
6155 descriptor_write.descriptorCount = 1;
6156 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6157 descriptor_write.pImageInfo = &img_info;
6158
6159 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6160
6161 // Create PSO to be used for draw-time errors below
6162 char const *vsSource =
6163 "#version 450\n"
6164 "\n"
6165 "out gl_PerVertex { \n"
6166 " vec4 gl_Position;\n"
6167 "};\n"
6168 "void main(){\n"
6169 " gl_Position = vec4(1);\n"
6170 "}\n";
6171 char const *fsSource =
6172 "#version 450\n"
6173 "\n"
6174 "layout(set=0, binding=0) uniform sampler2D s;\n"
6175 "layout(location=0) out vec4 x;\n"
6176 "void main(){\n"
6177 " x = texture(s, vec2(1));\n"
6178 "}\n";
6179 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6180 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6181 VkPipelineObj pipe(m_device);
6182 pipe.AddShader(&vs);
6183 pipe.AddShader(&fs);
6184 pipe.AddColorAttachment();
6185 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6186
6187 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6188 cmd_buf.BeginCommandBuffer();
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006189 // record layout different than actual descriptor layout of SHADER_RO
6190 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski95512b72017-05-10 12:21:30 -06006191 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006192 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6193 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6194 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6195 VkRect2D scissor = {{0, 0}, {16, 16}};
6196 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6197 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6198 // At draw time the update layout will mis-match the actual layout
6199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6200 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6201 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6202 m_errorMonitor->SetDesiredFailureMsg(
6203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6204 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6205 cmd_buf.Draw(1, 0, 0, 0);
6206 m_errorMonitor->VerifyFound();
6207 cmd_buf.EndRenderPass();
6208 cmd_buf.EndCommandBuffer();
6209 // Submit cmd buffer
6210 VkSubmitInfo submit_info = {};
6211 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6212 submit_info.commandBufferCount = 1;
6213 submit_info.pCommandBuffers = &cmd_buf.handle();
6214 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6215 vkQueueWaitIdle(m_device->m_queue);
6216 // Cleanup
6217 vkDestroySampler(m_device->device(), sampler, NULL);
6218 vkDestroyImageView(m_device->device(), view, NULL);
6219 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6221 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6222}
6223
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006224TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6225 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006226 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006227 ASSERT_NO_FATAL_FAILURE(InitViewport());
6228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6229
6230 VkDescriptorPoolSize ds_type_count = {};
6231 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6232 ds_type_count.descriptorCount = 1;
6233
6234 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6235 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6236 ds_pool_ci.pNext = NULL;
6237 ds_pool_ci.maxSets = 1;
6238 ds_pool_ci.poolSizeCount = 1;
6239 ds_pool_ci.pPoolSizes = &ds_type_count;
6240
6241 VkDescriptorPool ds_pool;
6242 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6243 ASSERT_VK_SUCCESS(err);
6244
6245 VkDescriptorSetLayoutBinding dsl_binding = {};
6246 dsl_binding.binding = 0;
6247 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6248 dsl_binding.descriptorCount = 1;
6249 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6250 dsl_binding.pImmutableSamplers = NULL;
6251
6252 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6253 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6254 ds_layout_ci.pNext = NULL;
6255 ds_layout_ci.bindingCount = 1;
6256 ds_layout_ci.pBindings = &dsl_binding;
6257 VkDescriptorSetLayout ds_layout;
6258 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6259 ASSERT_VK_SUCCESS(err);
6260
6261 VkDescriptorSet descriptor_set;
6262 VkDescriptorSetAllocateInfo alloc_info = {};
6263 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6264 alloc_info.descriptorSetCount = 1;
6265 alloc_info.descriptorPool = ds_pool;
6266 alloc_info.pSetLayouts = &ds_layout;
6267 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6268 ASSERT_VK_SUCCESS(err);
6269
6270 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6271 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6272 pipeline_layout_ci.pNext = NULL;
6273 pipeline_layout_ci.setLayoutCount = 1;
6274 pipeline_layout_ci.pSetLayouts = &ds_layout;
6275
6276 VkPipelineLayout pipeline_layout;
6277 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6278 ASSERT_VK_SUCCESS(err);
6279
6280 // Create image to update the descriptor with
6281 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006282 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006283 ASSERT_TRUE(image.initialized());
6284
6285 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6286 // Create Sampler
6287 VkSamplerCreateInfo sampler_ci = {};
6288 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6289 sampler_ci.pNext = NULL;
6290 sampler_ci.magFilter = VK_FILTER_NEAREST;
6291 sampler_ci.minFilter = VK_FILTER_NEAREST;
6292 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6293 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6294 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6295 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6296 sampler_ci.mipLodBias = 1.0;
6297 sampler_ci.anisotropyEnable = VK_FALSE;
6298 sampler_ci.maxAnisotropy = 1;
6299 sampler_ci.compareEnable = VK_FALSE;
6300 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6301 sampler_ci.minLod = 1.0;
6302 sampler_ci.maxLod = 1.0;
6303 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6304 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6305 VkSampler sampler;
6306 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6307 ASSERT_VK_SUCCESS(err);
6308 // Update descriptor with image and sampler
6309 VkDescriptorImageInfo img_info = {};
6310 img_info.sampler = sampler;
6311 img_info.imageView = view;
6312 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6313
6314 VkWriteDescriptorSet descriptor_write;
6315 memset(&descriptor_write, 0, sizeof(descriptor_write));
6316 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6317 descriptor_write.dstSet = descriptor_set;
6318 descriptor_write.dstBinding = 0;
6319 descriptor_write.descriptorCount = 1;
6320 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6321 descriptor_write.pImageInfo = &img_info;
6322
6323 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6324
6325 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006326 char const *vsSource =
6327 "#version 450\n"
6328 "\n"
6329 "out gl_PerVertex { \n"
6330 " vec4 gl_Position;\n"
6331 "};\n"
6332 "void main(){\n"
6333 " gl_Position = vec4(1);\n"
6334 "}\n";
6335 char const *fsSource =
6336 "#version 450\n"
6337 "\n"
6338 "layout(set=0, binding=0) uniform sampler2D s;\n"
6339 "layout(location=0) out vec4 x;\n"
6340 "void main(){\n"
6341 " x = texture(s, vec2(1));\n"
6342 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006343 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6344 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6345 VkPipelineObj pipe(m_device);
6346 pipe.AddShader(&vs);
6347 pipe.AddShader(&fs);
6348 pipe.AddColorAttachment();
6349 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6350
Tony Barbour552f6c02016-12-21 14:34:07 -07006351 m_commandBuffer->BeginCommandBuffer();
6352 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006353 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6354 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6355 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006356
6357 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6358 VkRect2D scissor = {{0, 0}, {16, 16}};
6359 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6360 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6361
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006362 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006363 m_commandBuffer->EndRenderPass();
6364 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006365 // Submit cmd buffer to put pool in-flight
6366 VkSubmitInfo submit_info = {};
6367 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6368 submit_info.commandBufferCount = 1;
6369 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6370 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6371 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006373 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6374 m_errorMonitor->VerifyFound();
6375 vkQueueWaitIdle(m_device->m_queue);
6376 // Cleanup
6377 vkDestroySampler(m_device->device(), sampler, NULL);
6378 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006380 m_errorMonitor->SetUnexpectedError(
6381 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006382 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006383 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006384 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006385}
6386
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006387TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6388 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006389 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006390 ASSERT_NO_FATAL_FAILURE(InitViewport());
6391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6392
6393 VkDescriptorPoolSize ds_type_count = {};
6394 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6395 ds_type_count.descriptorCount = 1;
6396
6397 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6398 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6399 ds_pool_ci.pNext = NULL;
6400 ds_pool_ci.maxSets = 1;
6401 ds_pool_ci.poolSizeCount = 1;
6402 ds_pool_ci.pPoolSizes = &ds_type_count;
6403
6404 VkDescriptorPool ds_pool;
6405 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6406 ASSERT_VK_SUCCESS(err);
6407
6408 VkDescriptorSetLayoutBinding dsl_binding = {};
6409 dsl_binding.binding = 0;
6410 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6411 dsl_binding.descriptorCount = 1;
6412 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6413 dsl_binding.pImmutableSamplers = NULL;
6414
6415 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6416 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6417 ds_layout_ci.pNext = NULL;
6418 ds_layout_ci.bindingCount = 1;
6419 ds_layout_ci.pBindings = &dsl_binding;
6420 VkDescriptorSetLayout ds_layout;
6421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6422 ASSERT_VK_SUCCESS(err);
6423
6424 VkDescriptorSet descriptorSet;
6425 VkDescriptorSetAllocateInfo alloc_info = {};
6426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6427 alloc_info.descriptorSetCount = 1;
6428 alloc_info.descriptorPool = ds_pool;
6429 alloc_info.pSetLayouts = &ds_layout;
6430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6431 ASSERT_VK_SUCCESS(err);
6432
6433 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6434 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6435 pipeline_layout_ci.pNext = NULL;
6436 pipeline_layout_ci.setLayoutCount = 1;
6437 pipeline_layout_ci.pSetLayouts = &ds_layout;
6438
6439 VkPipelineLayout pipeline_layout;
6440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6441 ASSERT_VK_SUCCESS(err);
6442
6443 // Create images to update the descriptor with
6444 VkImage image;
6445 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6446 const int32_t tex_width = 32;
6447 const int32_t tex_height = 32;
6448 VkImageCreateInfo image_create_info = {};
6449 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6450 image_create_info.pNext = NULL;
6451 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6452 image_create_info.format = tex_format;
6453 image_create_info.extent.width = tex_width;
6454 image_create_info.extent.height = tex_height;
6455 image_create_info.extent.depth = 1;
6456 image_create_info.mipLevels = 1;
6457 image_create_info.arrayLayers = 1;
6458 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6459 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6460 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6461 image_create_info.flags = 0;
6462 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6463 ASSERT_VK_SUCCESS(err);
6464 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6465 VkMemoryRequirements memory_reqs;
6466 VkDeviceMemory image_memory;
6467 bool pass;
6468 VkMemoryAllocateInfo memory_info = {};
6469 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6470 memory_info.pNext = NULL;
6471 memory_info.allocationSize = 0;
6472 memory_info.memoryTypeIndex = 0;
6473 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6474 // Allocate enough memory for image
6475 memory_info.allocationSize = memory_reqs.size;
6476 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6477 ASSERT_TRUE(pass);
6478 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6479 ASSERT_VK_SUCCESS(err);
6480 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6481 ASSERT_VK_SUCCESS(err);
6482
6483 VkImageViewCreateInfo image_view_create_info = {};
6484 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6485 image_view_create_info.image = image;
6486 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6487 image_view_create_info.format = tex_format;
6488 image_view_create_info.subresourceRange.layerCount = 1;
6489 image_view_create_info.subresourceRange.baseMipLevel = 0;
6490 image_view_create_info.subresourceRange.levelCount = 1;
6491 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6492
6493 VkImageView view;
6494 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6495 ASSERT_VK_SUCCESS(err);
6496 // Create Samplers
6497 VkSamplerCreateInfo sampler_ci = {};
6498 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6499 sampler_ci.pNext = NULL;
6500 sampler_ci.magFilter = VK_FILTER_NEAREST;
6501 sampler_ci.minFilter = VK_FILTER_NEAREST;
6502 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6503 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6504 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6505 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6506 sampler_ci.mipLodBias = 1.0;
6507 sampler_ci.anisotropyEnable = VK_FALSE;
6508 sampler_ci.maxAnisotropy = 1;
6509 sampler_ci.compareEnable = VK_FALSE;
6510 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6511 sampler_ci.minLod = 1.0;
6512 sampler_ci.maxLod = 1.0;
6513 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6514 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6515 VkSampler sampler;
6516 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6517 ASSERT_VK_SUCCESS(err);
6518 // Update descriptor with image and sampler
6519 VkDescriptorImageInfo img_info = {};
6520 img_info.sampler = sampler;
6521 img_info.imageView = view;
6522 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6523
6524 VkWriteDescriptorSet descriptor_write;
6525 memset(&descriptor_write, 0, sizeof(descriptor_write));
6526 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6527 descriptor_write.dstSet = descriptorSet;
6528 descriptor_write.dstBinding = 0;
6529 descriptor_write.descriptorCount = 1;
6530 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6531 descriptor_write.pImageInfo = &img_info;
6532 // Break memory binding and attempt update
6533 vkFreeMemory(m_device->device(), image_memory, nullptr);
6534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006535 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6537 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6538 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6539 m_errorMonitor->VerifyFound();
6540 // Cleanup
6541 vkDestroyImage(m_device->device(), image, NULL);
6542 vkDestroySampler(m_device->device(), sampler, NULL);
6543 vkDestroyImageView(m_device->device(), view, NULL);
6544 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6545 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6547}
6548
Karl Schultz6addd812016-02-02 17:17:23 -07006549TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006550 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6551 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006552 // Create a valid cmd buffer
6553 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006554 uint64_t fake_pipeline_handle = 0xbaad6001;
6555 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006556 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6558
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006560 m_commandBuffer->BeginCommandBuffer();
6561 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006562 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006563 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006564
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006565 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006567 Draw(1, 0, 0, 0);
6568 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006569
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006570 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006572 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006573 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6574 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006575}
6576
Karl Schultz6addd812016-02-02 17:17:23 -07006577TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006578 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006579 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006582
Tony Barbour1fa09702017-03-16 12:09:08 -06006583 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006584 ASSERT_NO_FATAL_FAILURE(InitViewport());
6585 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006586 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6588 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006589
6590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6592 ds_pool_ci.pNext = NULL;
6593 ds_pool_ci.maxSets = 1;
6594 ds_pool_ci.poolSizeCount = 1;
6595 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006596
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006597 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006598 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006599 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006600
Tony Barboureb254902015-07-15 12:50:33 -06006601 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006602 dsl_binding.binding = 0;
6603 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6604 dsl_binding.descriptorCount = 1;
6605 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6606 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006607
Tony Barboureb254902015-07-15 12:50:33 -06006608 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006609 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6610 ds_layout_ci.pNext = NULL;
6611 ds_layout_ci.bindingCount = 1;
6612 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006613 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006614 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006615 ASSERT_VK_SUCCESS(err);
6616
6617 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006618 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006619 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006620 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006621 alloc_info.descriptorPool = ds_pool;
6622 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006624 ASSERT_VK_SUCCESS(err);
6625
Tony Barboureb254902015-07-15 12:50:33 -06006626 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6628 pipeline_layout_ci.pNext = NULL;
6629 pipeline_layout_ci.setLayoutCount = 1;
6630 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006631
6632 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006634 ASSERT_VK_SUCCESS(err);
6635
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006636 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006637 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006638 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006639 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006640
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006641 VkPipelineObj pipe(m_device);
6642 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006643 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006644 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006645 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006646
Tony Barbour552f6c02016-12-21 14:34:07 -07006647 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006648 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6649 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6650 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006651
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006652 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006653
Chia-I Wuf7458c52015-10-26 21:10:41 +08006654 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6655 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6656 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006657}
6658
Karl Schultz6addd812016-02-02 17:17:23 -07006659TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006660 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006661 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006662
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006664
Tony Barbour1fa09702017-03-16 12:09:08 -06006665 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006666 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006667 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6668 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006669
6670 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006671 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6672 ds_pool_ci.pNext = NULL;
6673 ds_pool_ci.maxSets = 1;
6674 ds_pool_ci.poolSizeCount = 1;
6675 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006676
6677 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006679 ASSERT_VK_SUCCESS(err);
6680
6681 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006682 dsl_binding.binding = 0;
6683 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6684 dsl_binding.descriptorCount = 1;
6685 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6686 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006687
6688 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006689 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6690 ds_layout_ci.pNext = NULL;
6691 ds_layout_ci.bindingCount = 1;
6692 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006693 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006694 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006695 ASSERT_VK_SUCCESS(err);
6696
6697 VkDescriptorSet descriptorSet;
6698 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006700 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006701 alloc_info.descriptorPool = ds_pool;
6702 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006704 ASSERT_VK_SUCCESS(err);
6705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006706 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006707 VkWriteDescriptorSet descriptor_write;
6708 memset(&descriptor_write, 0, sizeof(descriptor_write));
6709 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6710 descriptor_write.dstSet = descriptorSet;
6711 descriptor_write.dstBinding = 0;
6712 descriptor_write.descriptorCount = 1;
6713 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6714 descriptor_write.pTexelBufferView = &view;
6715
6716 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6717
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006718 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006719
6720 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6721 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6722}
6723
Mark Youngd339ba32016-05-30 13:28:35 -06006724TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006725 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006726
6727 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006729 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006730
Tony Barbour1fa09702017-03-16 12:09:08 -06006731 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006732
6733 // Create a buffer with no bound memory and then attempt to create
6734 // a buffer view.
6735 VkBufferCreateInfo buff_ci = {};
6736 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006737 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006738 buff_ci.size = 256;
6739 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6740 VkBuffer buffer;
6741 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6742 ASSERT_VK_SUCCESS(err);
6743
6744 VkBufferViewCreateInfo buff_view_ci = {};
6745 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6746 buff_view_ci.buffer = buffer;
6747 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6748 buff_view_ci.range = VK_WHOLE_SIZE;
6749 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006750 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006751
6752 m_errorMonitor->VerifyFound();
6753 vkDestroyBuffer(m_device->device(), buffer, NULL);
6754 // If last error is success, it still created the view, so delete it.
6755 if (err == VK_SUCCESS) {
6756 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6757 }
6758}
6759
Karl Schultz6addd812016-02-02 17:17:23 -07006760TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6761 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6762 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006763 // 1. No dynamicOffset supplied
6764 // 2. Too many dynamicOffsets supplied
6765 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006766 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6768 " requires 1 dynamicOffsets, but only "
6769 "0 dynamicOffsets are left in "
6770 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006771
Tony Barbour1fa09702017-03-16 12:09:08 -06006772 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006773 ASSERT_NO_FATAL_FAILURE(InitViewport());
6774 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6775
6776 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006777 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6778 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006779
6780 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006781 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6782 ds_pool_ci.pNext = NULL;
6783 ds_pool_ci.maxSets = 1;
6784 ds_pool_ci.poolSizeCount = 1;
6785 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006786
6787 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006788 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006789 ASSERT_VK_SUCCESS(err);
6790
6791 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006792 dsl_binding.binding = 0;
6793 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6794 dsl_binding.descriptorCount = 1;
6795 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6796 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006797
6798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6800 ds_layout_ci.pNext = NULL;
6801 ds_layout_ci.bindingCount = 1;
6802 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006803 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006805 ASSERT_VK_SUCCESS(err);
6806
6807 VkDescriptorSet descriptorSet;
6808 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006809 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006810 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006811 alloc_info.descriptorPool = ds_pool;
6812 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006813 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006814 ASSERT_VK_SUCCESS(err);
6815
6816 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6818 pipeline_layout_ci.pNext = NULL;
6819 pipeline_layout_ci.setLayoutCount = 1;
6820 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006821
6822 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006823 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006824 ASSERT_VK_SUCCESS(err);
6825
6826 // Create a buffer to update the descriptor with
6827 uint32_t qfi = 0;
6828 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006829 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6830 buffCI.size = 1024;
6831 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6832 buffCI.queueFamilyIndexCount = 1;
6833 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006834
6835 VkBuffer dyub;
6836 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6837 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006838 // Allocate memory and bind to buffer so we can make it to the appropriate
6839 // error
6840 VkMemoryAllocateInfo mem_alloc = {};
6841 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6842 mem_alloc.pNext = NULL;
6843 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006844 mem_alloc.memoryTypeIndex = 0;
6845
6846 VkMemoryRequirements memReqs;
6847 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006848 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006849 if (!pass) {
6850 vkDestroyBuffer(m_device->device(), dyub, NULL);
6851 return;
6852 }
6853
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006854 VkDeviceMemory mem;
6855 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6856 ASSERT_VK_SUCCESS(err);
6857 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6858 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006859 // Correctly update descriptor to avoid "NOT_UPDATED" error
6860 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006861 buffInfo.buffer = dyub;
6862 buffInfo.offset = 0;
6863 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006864
6865 VkWriteDescriptorSet descriptor_write;
6866 memset(&descriptor_write, 0, sizeof(descriptor_write));
6867 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6868 descriptor_write.dstSet = descriptorSet;
6869 descriptor_write.dstBinding = 0;
6870 descriptor_write.descriptorCount = 1;
6871 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6872 descriptor_write.pBufferInfo = &buffInfo;
6873
6874 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6875
Tony Barbour552f6c02016-12-21 14:34:07 -07006876 m_commandBuffer->BeginCommandBuffer();
6877 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006878 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6879 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006880 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006881 uint32_t pDynOff[2] = {512, 756};
6882 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6884 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6885 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6886 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006887 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006888 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6890 " dynamic offset 512 combined with "
6891 "offset 0 and range 1024 that "
6892 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006893 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006894 char const *vsSource =
6895 "#version 450\n"
6896 "\n"
6897 "out gl_PerVertex { \n"
6898 " vec4 gl_Position;\n"
6899 "};\n"
6900 "void main(){\n"
6901 " gl_Position = vec4(1);\n"
6902 "}\n";
6903 char const *fsSource =
6904 "#version 450\n"
6905 "\n"
6906 "layout(location=0) out vec4 x;\n"
6907 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6908 "void main(){\n"
6909 " x = vec4(bar.y);\n"
6910 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006911 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6912 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6913 VkPipelineObj pipe(m_device);
6914 pipe.AddShader(&vs);
6915 pipe.AddShader(&fs);
6916 pipe.AddColorAttachment();
6917 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6918
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006919 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6920 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6921 VkRect2D scissor = {{0, 0}, {16, 16}};
6922 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6923
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006924 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006925 // This update should succeed, but offset size of 512 will overstep buffer
6926 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6928 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006929 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006930 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006931
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006932 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006933 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006934
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006935 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006936 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006937 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6938}
6939
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006940TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006941 TEST_DESCRIPTION(
6942 "Attempt to update a descriptor with a non-sparse buffer "
6943 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006944 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006946 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6948 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006949
Tony Barbour1fa09702017-03-16 12:09:08 -06006950 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006951 ASSERT_NO_FATAL_FAILURE(InitViewport());
6952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6953
6954 VkDescriptorPoolSize ds_type_count = {};
6955 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6956 ds_type_count.descriptorCount = 1;
6957
6958 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6959 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6960 ds_pool_ci.pNext = NULL;
6961 ds_pool_ci.maxSets = 1;
6962 ds_pool_ci.poolSizeCount = 1;
6963 ds_pool_ci.pPoolSizes = &ds_type_count;
6964
6965 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006966 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006967 ASSERT_VK_SUCCESS(err);
6968
6969 VkDescriptorSetLayoutBinding dsl_binding = {};
6970 dsl_binding.binding = 0;
6971 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6972 dsl_binding.descriptorCount = 1;
6973 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6974 dsl_binding.pImmutableSamplers = NULL;
6975
6976 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6977 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6978 ds_layout_ci.pNext = NULL;
6979 ds_layout_ci.bindingCount = 1;
6980 ds_layout_ci.pBindings = &dsl_binding;
6981 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006982 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006983 ASSERT_VK_SUCCESS(err);
6984
6985 VkDescriptorSet descriptorSet;
6986 VkDescriptorSetAllocateInfo alloc_info = {};
6987 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6988 alloc_info.descriptorSetCount = 1;
6989 alloc_info.descriptorPool = ds_pool;
6990 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006991 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006992 ASSERT_VK_SUCCESS(err);
6993
6994 // Create a buffer to update the descriptor with
6995 uint32_t qfi = 0;
6996 VkBufferCreateInfo buffCI = {};
6997 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6998 buffCI.size = 1024;
6999 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7000 buffCI.queueFamilyIndexCount = 1;
7001 buffCI.pQueueFamilyIndices = &qfi;
7002
7003 VkBuffer dyub;
7004 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7005 ASSERT_VK_SUCCESS(err);
7006
7007 // Attempt to update descriptor without binding memory to it
7008 VkDescriptorBufferInfo buffInfo = {};
7009 buffInfo.buffer = dyub;
7010 buffInfo.offset = 0;
7011 buffInfo.range = 1024;
7012
7013 VkWriteDescriptorSet descriptor_write;
7014 memset(&descriptor_write, 0, sizeof(descriptor_write));
7015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7016 descriptor_write.dstSet = descriptorSet;
7017 descriptor_write.dstBinding = 0;
7018 descriptor_write.descriptorCount = 1;
7019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7020 descriptor_write.pBufferInfo = &buffInfo;
7021
7022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7023 m_errorMonitor->VerifyFound();
7024
7025 vkDestroyBuffer(m_device->device(), dyub, NULL);
7026 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7027 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7028}
7029
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007030TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007031 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007032 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007033 ASSERT_NO_FATAL_FAILURE(InitViewport());
7034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7035
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007036 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007037 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007038 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7039 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7040 pipeline_layout_ci.pushConstantRangeCount = 1;
7041 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7042
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007043 //
7044 // Check for invalid push constant ranges in pipeline layouts.
7045 //
7046 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007047 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007048 char const *msg;
7049 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007050
Karl Schultzc81037d2016-05-12 08:11:23 -06007051 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7052 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7053 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7054 "vkCreatePipelineLayout() call has push constants index 0 with "
7055 "size 0."},
7056 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7057 "vkCreatePipelineLayout() call has push constants index 0 with "
7058 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007059 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007060 "vkCreatePipelineLayout() call has push constants index 0 with "
7061 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007062 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007063 "vkCreatePipelineLayout() call has push constants index 0 with "
7064 "size 0."},
7065 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7066 "vkCreatePipelineLayout() call has push constants index 0 with "
7067 "offset 1. Offset must"},
7068 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7069 "vkCreatePipelineLayout() call has push constants index 0 "
7070 "with offset "},
7071 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7072 "vkCreatePipelineLayout() call has push constants "
7073 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007074 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007075 "vkCreatePipelineLayout() call has push constants index 0 "
7076 "with offset "},
7077 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7078 "vkCreatePipelineLayout() call has push "
7079 "constants index 0 with offset "},
7080 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7081 "vkCreatePipelineLayout() call has push "
7082 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007083 }};
7084
7085 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007086 for (const auto &iter : range_tests) {
7087 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7089 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007090 m_errorMonitor->VerifyFound();
7091 if (VK_SUCCESS == err) {
7092 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7093 }
7094 }
7095
7096 // Check for invalid stage flag
7097 pc_range.offset = 0;
7098 pc_range.size = 16;
7099 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007100 m_errorMonitor->SetDesiredFailureMsg(
7101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7102 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007103 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007104 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007105 if (VK_SUCCESS == err) {
7106 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7107 }
7108
Karl Schultzc59b72d2017-02-24 15:45:05 -07007109 // Check for duplicate stage flags in a list of push constant ranges.
7110 // A shader can only have one push constant block and that block is mapped
7111 // to the push constant range that has that shader's stage flag set.
7112 // The shader's stage flag can only appear once in all the ranges, so the
7113 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007114 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007115 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007116 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007117 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007118 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007119 // Overlapping ranges are OK, but a stage flag can appear only once.
7120 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7121 {
7122 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7123 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7124 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7125 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007126 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007127 {
7128 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7129 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7130 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7131 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7132 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7133 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7134 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7135 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7136 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7137 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7138 }},
7139 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7140 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7141 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7142 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7143 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7144 {
7145 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7146 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7147 }},
7148 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7149 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7150 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7151 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7152 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7153 {
7154 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7155 }},
7156 },
7157 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007158
Karl Schultzc59b72d2017-02-24 15:45:05 -07007159 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007160 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007161 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007163 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007164 m_errorMonitor->VerifyFound();
7165 if (VK_SUCCESS == err) {
7166 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7167 }
7168 }
7169
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007170 //
7171 // CmdPushConstants tests
7172 //
7173
Karl Schultzc59b72d2017-02-24 15:45:05 -07007174 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007175 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007176 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007177 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007178 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007179 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007181 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007182
7183 const uint8_t dummy_values[100] = {};
7184
7185 m_commandBuffer->BeginCommandBuffer();
7186 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007187
7188 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007189 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007191 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007192 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007193
Karl Schultzc59b72d2017-02-24 15:45:05 -07007194 m_errorMonitor->ExpectSuccess();
7195 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7196 m_errorMonitor->VerifyNotFound();
7197 m_errorMonitor->ExpectSuccess();
7198 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7199 m_errorMonitor->VerifyNotFound();
7200 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7201 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7202 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7203 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7204 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7205 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7206 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007207 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007208 for (const auto &iter : cmd_range_tests) {
7209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7210 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7211 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007212 m_errorMonitor->VerifyFound();
7213 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007214
Tony Barbour552f6c02016-12-21 14:34:07 -07007215 m_commandBuffer->EndRenderPass();
7216 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007217 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007218}
7219
Karl Schultz6addd812016-02-02 17:17:23 -07007220TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007221 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007222 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007223
Tony Barbour1fa09702017-03-16 12:09:08 -06007224 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007225 ASSERT_NO_FATAL_FAILURE(InitViewport());
7226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7227
7228 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7229 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007230 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7231 ds_type_count[0].descriptorCount = 10;
7232 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7233 ds_type_count[1].descriptorCount = 2;
7234 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7235 ds_type_count[2].descriptorCount = 2;
7236 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7237 ds_type_count[3].descriptorCount = 5;
7238 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7239 // type
7240 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7241 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7242 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007243
7244 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007245 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7246 ds_pool_ci.pNext = NULL;
7247 ds_pool_ci.maxSets = 5;
7248 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7249 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007250
7251 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007252 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007253 ASSERT_VK_SUCCESS(err);
7254
7255 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7256 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007257 dsl_binding[0].binding = 0;
7258 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7259 dsl_binding[0].descriptorCount = 5;
7260 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7261 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007262
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007263 // Create layout identical to set0 layout but w/ different stageFlags
7264 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007265 dsl_fs_stage_only.binding = 0;
7266 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7267 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007268 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7269 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007270 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007271 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007272 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7273 ds_layout_ci.pNext = NULL;
7274 ds_layout_ci.bindingCount = 1;
7275 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007276 static const uint32_t NUM_LAYOUTS = 4;
7277 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007278 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007279 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7280 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007281 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007282 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007283 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007284 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007285 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007286 dsl_binding[0].binding = 0;
7287 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007288 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007289 dsl_binding[1].binding = 1;
7290 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7291 dsl_binding[1].descriptorCount = 2;
7292 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7293 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007294 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007295 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007296 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007297 ASSERT_VK_SUCCESS(err);
7298 dsl_binding[0].binding = 0;
7299 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007300 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007301 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007302 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007303 ASSERT_VK_SUCCESS(err);
7304 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007305 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007306 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007307 ASSERT_VK_SUCCESS(err);
7308
7309 static const uint32_t NUM_SETS = 4;
7310 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7311 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007312 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007313 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007314 alloc_info.descriptorPool = ds_pool;
7315 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007316 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007317 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007318 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007319 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007320 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007321 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007322 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007323
7324 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007325 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7326 pipeline_layout_ci.pNext = NULL;
7327 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7328 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007329
7330 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007331 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007332 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007333 // Create pipelineLayout with only one setLayout
7334 pipeline_layout_ci.setLayoutCount = 1;
7335 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007336 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007337 ASSERT_VK_SUCCESS(err);
7338 // Create pipelineLayout with 2 descriptor setLayout at index 0
7339 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7340 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007341 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 ASSERT_VK_SUCCESS(err);
7343 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7344 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7345 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007346 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007347 ASSERT_VK_SUCCESS(err);
7348 // Create pipelineLayout with UB type, but stageFlags for FS only
7349 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7350 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007351 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007352 ASSERT_VK_SUCCESS(err);
7353 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7354 VkDescriptorSetLayout pl_bad_s0[2] = {};
7355 pl_bad_s0[0] = ds_layout_fs_only;
7356 pl_bad_s0[1] = ds_layout[1];
7357 pipeline_layout_ci.setLayoutCount = 2;
7358 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7359 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007360 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007361 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007362
Tobin Ehlis88452832015-12-03 09:40:56 -07007363 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007364 char const *vsSource =
7365 "#version 450\n"
7366 "\n"
7367 "out gl_PerVertex {\n"
7368 " vec4 gl_Position;\n"
7369 "};\n"
7370 "void main(){\n"
7371 " gl_Position = vec4(1);\n"
7372 "}\n";
7373 char const *fsSource =
7374 "#version 450\n"
7375 "\n"
7376 "layout(location=0) out vec4 x;\n"
7377 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7378 "void main(){\n"
7379 " x = vec4(bar.y);\n"
7380 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007381 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007383 VkPipelineObj pipe(m_device);
7384 pipe.AddShader(&vs);
7385 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007386 pipe.AddColorAttachment();
7387 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007388
Tony Barbour552f6c02016-12-21 14:34:07 -07007389 m_commandBuffer->BeginCommandBuffer();
7390 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007391
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007392 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007393 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7394 // of PSO
7395 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7396 // cmd_pipeline.c
7397 // due to the fact that cmd_alloc_dset_data() has not been called in
7398 // cmd_bind_graphics_pipeline()
7399 // TODO : Want to cause various binding incompatibility issues here to test
7400 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007401 // First cause various verify_layout_compatibility() fails
7402 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007403 // verify_set_layout_compatibility fail cases:
7404 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007406 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7407 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007408 m_errorMonitor->VerifyFound();
7409
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007410 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7412 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7413 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007414 m_errorMonitor->VerifyFound();
7415
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007416 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007417 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7418 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7420 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7421 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007422 m_errorMonitor->VerifyFound();
7423
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007424 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7425 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7427 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7428 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007429 m_errorMonitor->VerifyFound();
7430
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007431 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7432 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7434 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7435 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7436 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007437 m_errorMonitor->VerifyFound();
7438
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 // Cause INFO messages due to disturbing previously bound Sets
7440 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007441 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7442 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007443 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7445 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7446 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007447 m_errorMonitor->VerifyFound();
7448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007449 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7450 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007451 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7453 " newly bound as set #0 so set #1 and "
7454 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7456 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007457 m_errorMonitor->VerifyFound();
7458
Tobin Ehlis10fad692016-07-07 12:00:36 -06007459 // Now that we're done actively using the pipelineLayout that gfx pipeline
7460 // was created with, we should be able to delete it. Do that now to verify
7461 // that validation obeys pipelineLayout lifetime
7462 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7463
Tobin Ehlis88452832015-12-03 09:40:56 -07007464 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007465 // 1. Error due to not binding required set (we actually use same code as
7466 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007467 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7468 &descriptorSet[0], 0, NULL);
7469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7470 &descriptorSet[1], 0, NULL);
7471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007472
7473 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7474 VkRect2D scissor = {{0, 0}, {16, 16}};
7475 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7476 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7477
Tobin Ehlis88452832015-12-03 09:40:56 -07007478 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007479 m_errorMonitor->VerifyFound();
7480
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007481 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007482 // 2. Error due to bound set not being compatible with PSO's
7483 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007484 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7485 &descriptorSet[0], 0, NULL);
7486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007487 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007488 m_errorMonitor->VerifyFound();
7489
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007490 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007491 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007492 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7493 }
7494 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007495 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7497}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007498
Karl Schultz6addd812016-02-02 17:17:23 -07007499TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7501 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007502
Tony Barbour1fa09702017-03-16 12:09:08 -06007503 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007504 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007505 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007506 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007508 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007509}
7510
Karl Schultz6addd812016-02-02 17:17:23 -07007511TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7512 VkResult err;
7513 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007514
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007516
Tony Barbour1fa09702017-03-16 12:09:08 -06007517 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007518
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007519 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007520 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007521 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007522 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007523 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007524 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007525
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007526 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007527 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007528
7529 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007530 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007531 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7532
7533 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007534 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007535 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007536 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007537 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007538
7539 // The error should be caught by validation of the BeginCommandBuffer call
7540 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007542 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007543 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007544}
7545
Karl Schultz6addd812016-02-02 17:17:23 -07007546TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007547 // Cause error due to Begin while recording CB
7548 // Then cause 2 errors for attempting to reset CB w/o having
7549 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7550 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007552
Tony Barbour1fa09702017-03-16 12:09:08 -06007553 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007554
7555 // Calls AllocateCommandBuffers
7556 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7557
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007558 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007559 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007560 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7561 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007562 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7563 cmd_buf_info.pNext = NULL;
7564 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007565 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007566
7567 // Begin CB to transition to recording state
7568 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7569 // Can't re-begin. This should trigger error
7570 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007571 m_errorMonitor->VerifyFound();
7572
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007574 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007575 // Reset attempt will trigger error due to incorrect CommandPool state
7576 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007577 m_errorMonitor->VerifyFound();
7578
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007580 // Transition CB to RECORDED state
7581 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7582 // Now attempting to Begin will implicitly reset, which triggers error
7583 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007584 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007585}
7586
Karl Schultz6addd812016-02-02 17:17:23 -07007587TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007588 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007589 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007590
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7592 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007593
Tony Barbour1fa09702017-03-16 12:09:08 -06007594 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007596
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007597 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007598 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7599 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007600
7601 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007602 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7603 ds_pool_ci.pNext = NULL;
7604 ds_pool_ci.maxSets = 1;
7605 ds_pool_ci.poolSizeCount = 1;
7606 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007607
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007608 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007609 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007610 ASSERT_VK_SUCCESS(err);
7611
Tony Barboureb254902015-07-15 12:50:33 -06007612 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007613 dsl_binding.binding = 0;
7614 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7615 dsl_binding.descriptorCount = 1;
7616 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7617 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007618
Tony Barboureb254902015-07-15 12:50:33 -06007619 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007620 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7621 ds_layout_ci.pNext = NULL;
7622 ds_layout_ci.bindingCount = 1;
7623 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007624
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007625 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007626 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007627 ASSERT_VK_SUCCESS(err);
7628
7629 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007630 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007631 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007632 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007633 alloc_info.descriptorPool = ds_pool;
7634 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007635 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007636 ASSERT_VK_SUCCESS(err);
7637
Tony Barboureb254902015-07-15 12:50:33 -06007638 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007639 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7640 pipeline_layout_ci.setLayoutCount = 1;
7641 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007642
7643 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007644 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007645 ASSERT_VK_SUCCESS(err);
7646
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007647 VkViewport vp = {}; // Just need dummy vp to point to
7648 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007649
7650 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007651 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7652 vp_state_ci.scissorCount = 1;
7653 vp_state_ci.pScissors = &sc;
7654 vp_state_ci.viewportCount = 1;
7655 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007656
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007657 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7658 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7659 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7660 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7661 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7662 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007663 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007664 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007665 rs_state_ci.lineWidth = 1.0f;
7666
7667 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7668 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7669 vi_ci.pNext = nullptr;
7670 vi_ci.vertexBindingDescriptionCount = 0;
7671 vi_ci.pVertexBindingDescriptions = nullptr;
7672 vi_ci.vertexAttributeDescriptionCount = 0;
7673 vi_ci.pVertexAttributeDescriptions = nullptr;
7674
7675 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7676 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7677 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7678
7679 VkPipelineShaderStageCreateInfo shaderStages[2];
7680 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7681
7682 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7683 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007684 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007685 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007686
Tony Barboureb254902015-07-15 12:50:33 -06007687 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007688 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7689 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007690 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007691 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7692 gp_ci.layout = pipeline_layout;
7693 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007694 gp_ci.pVertexInputState = &vi_ci;
7695 gp_ci.pInputAssemblyState = &ia_ci;
7696
7697 gp_ci.stageCount = 1;
7698 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007699
7700 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007701 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7702 pc_ci.initialDataSize = 0;
7703 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007704
7705 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007706 VkPipelineCache pipelineCache;
7707
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007708 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007709 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007710 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007711 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007712
Chia-I Wuf7458c52015-10-26 21:10:41 +08007713 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7714 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7715 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7716 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007717}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007718
Tobin Ehlis912df022015-09-17 08:46:18 -06007719/*// TODO : This test should be good, but needs Tess support in compiler to run
7720TEST_F(VkLayerTest, InvalidPatchControlPoints)
7721{
7722 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007723 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007724
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007726 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7727primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007728
Tony Barbour1fa09702017-03-16 12:09:08 -06007729 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007731
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007732 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007733 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007734 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007735
7736 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7737 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7738 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007739 ds_pool_ci.poolSizeCount = 1;
7740 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007741
7742 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007743 err = vkCreateDescriptorPool(m_device->device(),
7744VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007745 ASSERT_VK_SUCCESS(err);
7746
7747 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007748 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007749 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007750 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007751 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7752 dsl_binding.pImmutableSamplers = NULL;
7753
7754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007755 ds_layout_ci.sType =
7756VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007757 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007758 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007759 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007760
7761 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007762 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7763&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007764 ASSERT_VK_SUCCESS(err);
7765
7766 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007767 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7768VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007769 ASSERT_VK_SUCCESS(err);
7770
7771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007772 pipeline_layout_ci.sType =
7773VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007774 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007775 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007776 pipeline_layout_ci.pSetLayouts = &ds_layout;
7777
7778 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007779 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7780&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007781 ASSERT_VK_SUCCESS(err);
7782
7783 VkPipelineShaderStageCreateInfo shaderStages[3];
7784 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7785
Karl Schultz6addd812016-02-02 17:17:23 -07007786 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7787this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007788 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007789 VkShaderObj
7790tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7791this);
7792 VkShaderObj
7793te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7794this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007795
Karl Schultz6addd812016-02-02 17:17:23 -07007796 shaderStages[0].sType =
7797VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007798 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007799 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007800 shaderStages[1].sType =
7801VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007802 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007803 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007804 shaderStages[2].sType =
7805VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007806 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007807 shaderStages[2].shader = te.handle();
7808
7809 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007810 iaCI.sType =
7811VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007812 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007813
7814 VkPipelineTessellationStateCreateInfo tsCI = {};
7815 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7816 tsCI.patchControlPoints = 0; // This will cause an error
7817
7818 VkGraphicsPipelineCreateInfo gp_ci = {};
7819 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7820 gp_ci.pNext = NULL;
7821 gp_ci.stageCount = 3;
7822 gp_ci.pStages = shaderStages;
7823 gp_ci.pVertexInputState = NULL;
7824 gp_ci.pInputAssemblyState = &iaCI;
7825 gp_ci.pTessellationState = &tsCI;
7826 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007827 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007828 gp_ci.pMultisampleState = NULL;
7829 gp_ci.pDepthStencilState = NULL;
7830 gp_ci.pColorBlendState = NULL;
7831 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7832 gp_ci.layout = pipeline_layout;
7833 gp_ci.renderPass = renderPass();
7834
7835 VkPipelineCacheCreateInfo pc_ci = {};
7836 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7837 pc_ci.pNext = NULL;
7838 pc_ci.initialSize = 0;
7839 pc_ci.initialData = 0;
7840 pc_ci.maxSize = 0;
7841
7842 VkPipeline pipeline;
7843 VkPipelineCache pipelineCache;
7844
Karl Schultz6addd812016-02-02 17:17:23 -07007845 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7846&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007847 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007848 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7849&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007850
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007851 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007852
Chia-I Wuf7458c52015-10-26 21:10:41 +08007853 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7854 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7855 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7856 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007857}
7858*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007859
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007860TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007861 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007862
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007863 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007864
Tony Barbour1fa09702017-03-16 12:09:08 -06007865 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007867
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007868 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007869 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7870 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007871
7872 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007873 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7874 ds_pool_ci.maxSets = 1;
7875 ds_pool_ci.poolSizeCount = 1;
7876 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007877
7878 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007879 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007880 ASSERT_VK_SUCCESS(err);
7881
7882 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007883 dsl_binding.binding = 0;
7884 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7885 dsl_binding.descriptorCount = 1;
7886 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007887
7888 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007889 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7890 ds_layout_ci.bindingCount = 1;
7891 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007892
7893 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007894 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007895 ASSERT_VK_SUCCESS(err);
7896
7897 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007898 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007899 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007900 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007901 alloc_info.descriptorPool = ds_pool;
7902 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007903 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007904 ASSERT_VK_SUCCESS(err);
7905
7906 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007907 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7908 pipeline_layout_ci.setLayoutCount = 1;
7909 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910
7911 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007912 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007913 ASSERT_VK_SUCCESS(err);
7914
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007915 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007916 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007917 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007918 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007919 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007920 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007921
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007922 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7923 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7924 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7925 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7926 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7927 rs_state_ci.depthClampEnable = VK_FALSE;
7928 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7929 rs_state_ci.depthBiasEnable = VK_FALSE;
7930
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007931 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7932 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7933 vi_ci.pNext = nullptr;
7934 vi_ci.vertexBindingDescriptionCount = 0;
7935 vi_ci.pVertexBindingDescriptions = nullptr;
7936 vi_ci.vertexAttributeDescriptionCount = 0;
7937 vi_ci.pVertexAttributeDescriptions = nullptr;
7938
7939 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7940 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7941 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7942
7943 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7944 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7945 pipe_ms_state_ci.pNext = NULL;
7946 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7947 pipe_ms_state_ci.sampleShadingEnable = 0;
7948 pipe_ms_state_ci.minSampleShading = 1.0;
7949 pipe_ms_state_ci.pSampleMask = NULL;
7950
Cody Northropeb3a6c12015-10-05 14:44:45 -06007951 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007952 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007953
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007954 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007955 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007956 shaderStages[0] = vs.GetStageCreateInfo();
7957 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007958
7959 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007960 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7961 gp_ci.stageCount = 2;
7962 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007963 gp_ci.pVertexInputState = &vi_ci;
7964 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007965 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007966 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007967 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007968 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7969 gp_ci.layout = pipeline_layout;
7970 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007971
7972 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007973 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007974
7975 VkPipeline pipeline;
7976 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007977 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007978 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007979
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007980 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007981 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007982
7983 // Check case where multiViewport is disabled and viewport count is not 1
7984 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7987 vp_state_ci.scissorCount = 0;
7988 vp_state_ci.viewportCount = 0;
7989 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7990 m_errorMonitor->VerifyFound();
7991 } else {
7992 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007993 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007994 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007995 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007996
7997 // Check is that viewportcount and scissorcount match
7998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7999 vp_state_ci.scissorCount = 1;
8000 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8001 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8002 m_errorMonitor->VerifyFound();
8003
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008004 // Check case where multiViewport is enabled and viewport count is greater than max
8005 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8008 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8009 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8010 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8011 m_errorMonitor->VerifyFound();
8012 }
8013 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008014
Chia-I Wuf7458c52015-10-26 21:10:41 +08008015 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8016 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8017 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8018 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008019}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008020
8021// 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
8022// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008023TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008024 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008025
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008026 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8027
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008029
Tony Barbour1fa09702017-03-16 12:09:08 -06008030 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008032
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008033 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008034 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8035 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008036
8037 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008038 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8039 ds_pool_ci.maxSets = 1;
8040 ds_pool_ci.poolSizeCount = 1;
8041 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008042
8043 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008044 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008045 ASSERT_VK_SUCCESS(err);
8046
8047 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008048 dsl_binding.binding = 0;
8049 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8050 dsl_binding.descriptorCount = 1;
8051 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008052
8053 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008054 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8055 ds_layout_ci.bindingCount = 1;
8056 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008057
8058 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008059 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008060 ASSERT_VK_SUCCESS(err);
8061
8062 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008063 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008064 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008065 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008066 alloc_info.descriptorPool = ds_pool;
8067 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008068 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008069 ASSERT_VK_SUCCESS(err);
8070
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008071 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8072 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8073 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8074
8075 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8076 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8077 vi_ci.pNext = nullptr;
8078 vi_ci.vertexBindingDescriptionCount = 0;
8079 vi_ci.pVertexBindingDescriptions = nullptr;
8080 vi_ci.vertexAttributeDescriptionCount = 0;
8081 vi_ci.pVertexAttributeDescriptions = nullptr;
8082
8083 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8084 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8085 pipe_ms_state_ci.pNext = NULL;
8086 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8087 pipe_ms_state_ci.sampleShadingEnable = 0;
8088 pipe_ms_state_ci.minSampleShading = 1.0;
8089 pipe_ms_state_ci.pSampleMask = NULL;
8090
Tobin Ehlise68360f2015-10-01 11:15:13 -06008091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8093 pipeline_layout_ci.setLayoutCount = 1;
8094 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008095
8096 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008097 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008098 ASSERT_VK_SUCCESS(err);
8099
8100 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8101 // Set scissor as dynamic to avoid second error
8102 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008103 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8104 dyn_state_ci.dynamicStateCount = 1;
8105 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008106
Cody Northropeb3a6c12015-10-05 14:44:45 -06008107 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008108 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008109
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008110 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008111 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8112 // 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 +08008113 shaderStages[0] = vs.GetStageCreateInfo();
8114 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008115
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008116 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8117 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8118 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8119 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8120 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8121 rs_state_ci.depthClampEnable = VK_FALSE;
8122 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8123 rs_state_ci.depthBiasEnable = VK_FALSE;
8124
Tobin Ehlise68360f2015-10-01 11:15:13 -06008125 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008126 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8127 gp_ci.stageCount = 2;
8128 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008129 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008130 // Not setting VP state w/o dynamic vp state should cause validation error
8131 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008132 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008133 gp_ci.pVertexInputState = &vi_ci;
8134 gp_ci.pInputAssemblyState = &ia_ci;
8135 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008136 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8137 gp_ci.layout = pipeline_layout;
8138 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008139
8140 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008141 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008142
8143 VkPipeline pipeline;
8144 VkPipelineCache pipelineCache;
8145
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008146 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008147 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008148 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008149
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008150 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151
Chia-I Wuf7458c52015-10-26 21:10:41 +08008152 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8153 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8154 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8155 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008156}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008157
8158// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8159// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008160TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8161 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008162
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008164
Tony Barbour1fa09702017-03-16 12:09:08 -06008165 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008166
8167 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008168 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008169 return;
8170 }
8171
Tobin Ehlise68360f2015-10-01 11:15:13 -06008172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008173
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008174 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008175 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8176 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008177
8178 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008179 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8180 ds_pool_ci.maxSets = 1;
8181 ds_pool_ci.poolSizeCount = 1;
8182 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008183
8184 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008185 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008186 ASSERT_VK_SUCCESS(err);
8187
8188 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008189 dsl_binding.binding = 0;
8190 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8191 dsl_binding.descriptorCount = 1;
8192 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008193
8194 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008195 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8196 ds_layout_ci.bindingCount = 1;
8197 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008198
8199 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008200 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008201 ASSERT_VK_SUCCESS(err);
8202
8203 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008204 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008205 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008206 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008207 alloc_info.descriptorPool = ds_pool;
8208 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008209 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008210 ASSERT_VK_SUCCESS(err);
8211
8212 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008213 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8214 pipeline_layout_ci.setLayoutCount = 1;
8215 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008216
8217 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008218 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008219 ASSERT_VK_SUCCESS(err);
8220
8221 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008222 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8223 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008224 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008225 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008226 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008227
8228 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8229 // Set scissor as dynamic to avoid that error
8230 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8232 dyn_state_ci.dynamicStateCount = 1;
8233 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008234
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008235 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8236 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8237 pipe_ms_state_ci.pNext = NULL;
8238 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8239 pipe_ms_state_ci.sampleShadingEnable = 0;
8240 pipe_ms_state_ci.minSampleShading = 1.0;
8241 pipe_ms_state_ci.pSampleMask = NULL;
8242
Cody Northropeb3a6c12015-10-05 14:44:45 -06008243 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008244 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008245
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008246 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008247 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8248 // 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 +08008249 shaderStages[0] = vs.GetStageCreateInfo();
8250 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008251
Cody Northropf6622dc2015-10-06 10:33:21 -06008252 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8253 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8254 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008255 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008256 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008257 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008258 vi_ci.pVertexAttributeDescriptions = nullptr;
8259
8260 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8261 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8262 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8263
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008264 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008265 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008266 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008267 rs_ci.pNext = nullptr;
8268
Mark Youngc89c6312016-03-31 16:03:20 -06008269 VkPipelineColorBlendAttachmentState att = {};
8270 att.blendEnable = VK_FALSE;
8271 att.colorWriteMask = 0xf;
8272
Cody Northropf6622dc2015-10-06 10:33:21 -06008273 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8274 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8275 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008276 cb_ci.attachmentCount = 1;
8277 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008278
Tobin Ehlise68360f2015-10-01 11:15:13 -06008279 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008280 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8281 gp_ci.stageCount = 2;
8282 gp_ci.pStages = shaderStages;
8283 gp_ci.pVertexInputState = &vi_ci;
8284 gp_ci.pInputAssemblyState = &ia_ci;
8285 gp_ci.pViewportState = &vp_state_ci;
8286 gp_ci.pRasterizationState = &rs_ci;
8287 gp_ci.pColorBlendState = &cb_ci;
8288 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008289 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008290 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8291 gp_ci.layout = pipeline_layout;
8292 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008293
8294 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008295 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008296
8297 VkPipeline pipeline;
8298 VkPipelineCache pipelineCache;
8299
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008300 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008301 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008302 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008303
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008304 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008305
Tobin Ehlisd332f282015-10-02 11:00:56 -06008306 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008307 // First need to successfully create the PSO from above by setting
8308 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008309 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 -07008310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008311 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008312 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008313 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008314 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008315 m_commandBuffer->BeginCommandBuffer();
8316 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008317 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008318 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008319 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008320 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008321 Draw(1, 0, 0, 0);
8322
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008323 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008324
8325 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8326 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8327 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8328 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008329 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008330}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008331
8332// 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 -07008333// viewportCount
8334TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8335 VkResult err;
8336
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008338
Tony Barbour1fa09702017-03-16 12:09:08 -06008339 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008340
8341 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008342 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008343 return;
8344 }
8345
Karl Schultz6addd812016-02-02 17:17:23 -07008346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8347
8348 VkDescriptorPoolSize ds_type_count = {};
8349 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8350 ds_type_count.descriptorCount = 1;
8351
8352 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8353 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8354 ds_pool_ci.maxSets = 1;
8355 ds_pool_ci.poolSizeCount = 1;
8356 ds_pool_ci.pPoolSizes = &ds_type_count;
8357
8358 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008359 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008360 ASSERT_VK_SUCCESS(err);
8361
8362 VkDescriptorSetLayoutBinding dsl_binding = {};
8363 dsl_binding.binding = 0;
8364 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8365 dsl_binding.descriptorCount = 1;
8366 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8367
8368 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8369 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8370 ds_layout_ci.bindingCount = 1;
8371 ds_layout_ci.pBindings = &dsl_binding;
8372
8373 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008374 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008375 ASSERT_VK_SUCCESS(err);
8376
8377 VkDescriptorSet descriptorSet;
8378 VkDescriptorSetAllocateInfo alloc_info = {};
8379 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8380 alloc_info.descriptorSetCount = 1;
8381 alloc_info.descriptorPool = ds_pool;
8382 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008383 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008384 ASSERT_VK_SUCCESS(err);
8385
8386 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8387 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8388 pipeline_layout_ci.setLayoutCount = 1;
8389 pipeline_layout_ci.pSetLayouts = &ds_layout;
8390
8391 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008392 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008393 ASSERT_VK_SUCCESS(err);
8394
8395 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8396 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8397 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008398 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008399 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008400 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008401
8402 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8403 // Set scissor as dynamic to avoid that error
8404 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8405 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8406 dyn_state_ci.dynamicStateCount = 1;
8407 dyn_state_ci.pDynamicStates = &vp_state;
8408
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008409 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8410 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8411 pipe_ms_state_ci.pNext = NULL;
8412 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8413 pipe_ms_state_ci.sampleShadingEnable = 0;
8414 pipe_ms_state_ci.minSampleShading = 1.0;
8415 pipe_ms_state_ci.pSampleMask = NULL;
8416
Karl Schultz6addd812016-02-02 17:17:23 -07008417 VkPipelineShaderStageCreateInfo shaderStages[2];
8418 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8419
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008420 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008421 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8422 // 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 -07008423 shaderStages[0] = vs.GetStageCreateInfo();
8424 shaderStages[1] = fs.GetStageCreateInfo();
8425
8426 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8427 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8428 vi_ci.pNext = nullptr;
8429 vi_ci.vertexBindingDescriptionCount = 0;
8430 vi_ci.pVertexBindingDescriptions = nullptr;
8431 vi_ci.vertexAttributeDescriptionCount = 0;
8432 vi_ci.pVertexAttributeDescriptions = nullptr;
8433
8434 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8435 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8436 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8437
8438 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8439 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008440 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008441 rs_ci.pNext = nullptr;
8442
Mark Youngc89c6312016-03-31 16:03:20 -06008443 VkPipelineColorBlendAttachmentState att = {};
8444 att.blendEnable = VK_FALSE;
8445 att.colorWriteMask = 0xf;
8446
Karl Schultz6addd812016-02-02 17:17:23 -07008447 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8448 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8449 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008450 cb_ci.attachmentCount = 1;
8451 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008452
8453 VkGraphicsPipelineCreateInfo gp_ci = {};
8454 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8455 gp_ci.stageCount = 2;
8456 gp_ci.pStages = shaderStages;
8457 gp_ci.pVertexInputState = &vi_ci;
8458 gp_ci.pInputAssemblyState = &ia_ci;
8459 gp_ci.pViewportState = &vp_state_ci;
8460 gp_ci.pRasterizationState = &rs_ci;
8461 gp_ci.pColorBlendState = &cb_ci;
8462 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008463 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008464 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8465 gp_ci.layout = pipeline_layout;
8466 gp_ci.renderPass = renderPass();
8467
8468 VkPipelineCacheCreateInfo pc_ci = {};
8469 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8470
8471 VkPipeline pipeline;
8472 VkPipelineCache pipelineCache;
8473
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008474 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008475 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008476 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008477
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008478 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008479
8480 // Now hit second fail case where we set scissor w/ different count than PSO
8481 // First need to successfully create the PSO from above by setting
8482 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8484 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008486 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008487 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008488 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008489 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008490 m_commandBuffer->BeginCommandBuffer();
8491 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008492 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008493 VkViewport viewports[1] = {};
8494 viewports[0].width = 8;
8495 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008496 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008497 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008498 Draw(1, 0, 0, 0);
8499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008500 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008501
Chia-I Wuf7458c52015-10-26 21:10:41 +08008502 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8503 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8504 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8505 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008506 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008507}
8508
Mark Young7394fdd2016-03-31 14:56:43 -06008509TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8510 VkResult err;
8511
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008513
Tony Barbour1fa09702017-03-16 12:09:08 -06008514 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8516
8517 VkDescriptorPoolSize ds_type_count = {};
8518 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8519 ds_type_count.descriptorCount = 1;
8520
8521 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8522 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8523 ds_pool_ci.maxSets = 1;
8524 ds_pool_ci.poolSizeCount = 1;
8525 ds_pool_ci.pPoolSizes = &ds_type_count;
8526
8527 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008528 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008529 ASSERT_VK_SUCCESS(err);
8530
8531 VkDescriptorSetLayoutBinding dsl_binding = {};
8532 dsl_binding.binding = 0;
8533 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8534 dsl_binding.descriptorCount = 1;
8535 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8536
8537 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8538 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8539 ds_layout_ci.bindingCount = 1;
8540 ds_layout_ci.pBindings = &dsl_binding;
8541
8542 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008543 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008544 ASSERT_VK_SUCCESS(err);
8545
8546 VkDescriptorSet descriptorSet;
8547 VkDescriptorSetAllocateInfo alloc_info = {};
8548 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8549 alloc_info.descriptorSetCount = 1;
8550 alloc_info.descriptorPool = ds_pool;
8551 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008552 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008553 ASSERT_VK_SUCCESS(err);
8554
8555 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8556 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8557 pipeline_layout_ci.setLayoutCount = 1;
8558 pipeline_layout_ci.pSetLayouts = &ds_layout;
8559
8560 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008561 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008562 ASSERT_VK_SUCCESS(err);
8563
8564 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8565 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8566 vp_state_ci.scissorCount = 1;
8567 vp_state_ci.pScissors = NULL;
8568 vp_state_ci.viewportCount = 1;
8569 vp_state_ci.pViewports = NULL;
8570
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008571 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008572 // Set scissor as dynamic to avoid that error
8573 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8574 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8575 dyn_state_ci.dynamicStateCount = 2;
8576 dyn_state_ci.pDynamicStates = dynamic_states;
8577
8578 VkPipelineShaderStageCreateInfo shaderStages[2];
8579 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008581 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8582 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008583 this); // TODO - We shouldn't need a fragment shader
8584 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008585 shaderStages[0] = vs.GetStageCreateInfo();
8586 shaderStages[1] = fs.GetStageCreateInfo();
8587
8588 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8589 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8590 vi_ci.pNext = nullptr;
8591 vi_ci.vertexBindingDescriptionCount = 0;
8592 vi_ci.pVertexBindingDescriptions = nullptr;
8593 vi_ci.vertexAttributeDescriptionCount = 0;
8594 vi_ci.pVertexAttributeDescriptions = nullptr;
8595
8596 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8597 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8598 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8599
8600 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8601 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8602 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008603 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008604
Mark Young47107952016-05-02 15:59:55 -06008605 // Check too low (line width of -1.0f).
8606 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008607
8608 VkPipelineColorBlendAttachmentState att = {};
8609 att.blendEnable = VK_FALSE;
8610 att.colorWriteMask = 0xf;
8611
8612 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8613 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8614 cb_ci.pNext = nullptr;
8615 cb_ci.attachmentCount = 1;
8616 cb_ci.pAttachments = &att;
8617
8618 VkGraphicsPipelineCreateInfo gp_ci = {};
8619 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8620 gp_ci.stageCount = 2;
8621 gp_ci.pStages = shaderStages;
8622 gp_ci.pVertexInputState = &vi_ci;
8623 gp_ci.pInputAssemblyState = &ia_ci;
8624 gp_ci.pViewportState = &vp_state_ci;
8625 gp_ci.pRasterizationState = &rs_ci;
8626 gp_ci.pColorBlendState = &cb_ci;
8627 gp_ci.pDynamicState = &dyn_state_ci;
8628 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8629 gp_ci.layout = pipeline_layout;
8630 gp_ci.renderPass = renderPass();
8631
8632 VkPipelineCacheCreateInfo pc_ci = {};
8633 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8634
8635 VkPipeline pipeline;
8636 VkPipelineCache pipelineCache;
8637
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008638 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008639 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008640 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008641
8642 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008643 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008644
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008646
8647 // Check too high (line width of 65536.0f).
8648 rs_ci.lineWidth = 65536.0f;
8649
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008650 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008651 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008652 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008653
8654 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008655 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008656
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008658
8659 dyn_state_ci.dynamicStateCount = 3;
8660
8661 rs_ci.lineWidth = 1.0f;
8662
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008663 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008664 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008665 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008666 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008667 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008668
8669 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008670 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008671 m_errorMonitor->VerifyFound();
8672
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008674
8675 // Check too high with dynamic setting.
8676 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8677 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008678 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008679
8680 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8681 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8682 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8683 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008684 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008685}
8686
Jeremy Hayes37f0cdd2017-05-04 18:08:49 -06008687TEST_F(VkLayerTest, VALIDATION_ERROR_01407) {
8688 TEST_DESCRIPTION("Test VALIDATION_ERROR_01407: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
8689
8690 ASSERT_NO_FATAL_FAILURE(Init());
8691 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8692
8693 VkPipelineCache pipeline_cache;
8694 {
8695 VkPipelineCacheCreateInfo create_info{};
8696 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8697
8698 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8699 ASSERT_VK_SUCCESS(err);
8700 }
8701
8702 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8703 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8704
8705 VkPipelineShaderStageCreateInfo stages[2]{{}};
8706 stages[0] = vs.GetStageCreateInfo();
8707 stages[1] = fs.GetStageCreateInfo();
8708
8709 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
8710 VkVertexInputBindingDescription vertex_input_binding_description{};
8711 vertex_input_binding_description.binding = m_device->props.limits.maxVertexInputBindings;
8712
8713 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8714 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8715 vertex_input_state.pNext = nullptr;
8716 vertex_input_state.vertexBindingDescriptionCount = 1;
8717 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8718 vertex_input_state.vertexAttributeDescriptionCount = 0;
8719 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8720
8721 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8722 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8723 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8724
8725 VkViewport viewport{};
8726 VkPipelineViewportStateCreateInfo viewport_state{};
8727 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8728 viewport_state.scissorCount = 1;
8729 viewport_state.viewportCount = 1;
8730 viewport_state.pViewports = &viewport;
8731
8732 VkPipelineMultisampleStateCreateInfo multisample_state{};
8733 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8734 multisample_state.pNext = nullptr;
8735 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8736 multisample_state.sampleShadingEnable = 0;
8737 multisample_state.minSampleShading = 1.0;
8738 multisample_state.pSampleMask = nullptr;
8739
8740 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8741 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8742 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8743 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8744 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8745 rasterization_state.depthClampEnable = VK_FALSE;
8746 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8747 rasterization_state.depthBiasEnable = VK_FALSE;
8748
8749 VkPipelineLayout pipeline_layout;
8750 {
8751 VkPipelineLayoutCreateInfo create_info{};
8752 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8753 create_info.setLayoutCount = 0;
8754 create_info.pSetLayouts = nullptr;
8755
8756 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8757 ASSERT_VK_SUCCESS(err);
8758 }
8759
8760 {
8761 VkGraphicsPipelineCreateInfo create_info{};
8762 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8763 create_info.stageCount = 2;
8764 create_info.pStages = stages;
8765 create_info.pVertexInputState = &vertex_input_state;
8766 create_info.pInputAssemblyState = &input_assembly_state;
8767 create_info.pViewportState = &viewport_state;
8768 create_info.pMultisampleState = &multisample_state;
8769 create_info.pRasterizationState = &rasterization_state;
8770 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8771 create_info.layout = pipeline_layout;
8772 create_info.renderPass = renderPass();
8773
8774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01407);
8775 VkPipeline pipeline;
8776 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8777 m_errorMonitor->VerifyFound();
8778 }
8779
8780 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8781 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8782}
8783
8784TEST_F(VkLayerTest, VALIDATION_ERROR_01408) {
8785 TEST_DESCRIPTION(
8786 "Test VALIDATION_ERROR_01408: stride must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride");
8787
8788 ASSERT_NO_FATAL_FAILURE(Init());
8789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8790
8791 VkPipelineCache pipeline_cache;
8792 {
8793 VkPipelineCacheCreateInfo create_info{};
8794 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8795
8796 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8797 ASSERT_VK_SUCCESS(err);
8798 }
8799
8800 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8801 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8802
8803 VkPipelineShaderStageCreateInfo stages[2]{{}};
8804 stages[0] = vs.GetStageCreateInfo();
8805 stages[1] = fs.GetStageCreateInfo();
8806
8807 // Test when stride is greater than VkPhysicalDeviceLimits::maxVertexInputBindingStride.
8808 VkVertexInputBindingDescription vertex_input_binding_description{};
8809 vertex_input_binding_description.stride = m_device->props.limits.maxVertexInputBindingStride + 1;
8810
8811 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8812 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8813 vertex_input_state.pNext = nullptr;
8814 vertex_input_state.vertexBindingDescriptionCount = 1;
8815 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8816 vertex_input_state.vertexAttributeDescriptionCount = 0;
8817 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8818
8819 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8820 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8821 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8822
8823 VkViewport viewport{};
8824 VkPipelineViewportStateCreateInfo viewport_state{};
8825 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8826 viewport_state.scissorCount = 1;
8827 viewport_state.viewportCount = 1;
8828 viewport_state.pViewports = &viewport;
8829
8830 VkPipelineMultisampleStateCreateInfo multisample_state{};
8831 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8832 multisample_state.pNext = nullptr;
8833 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8834 multisample_state.sampleShadingEnable = 0;
8835 multisample_state.minSampleShading = 1.0;
8836 multisample_state.pSampleMask = nullptr;
8837
8838 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8839 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8840 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8841 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8842 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8843 rasterization_state.depthClampEnable = VK_FALSE;
8844 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8845 rasterization_state.depthBiasEnable = VK_FALSE;
8846
8847 VkPipelineLayout pipeline_layout;
8848 {
8849 VkPipelineLayoutCreateInfo create_info{};
8850 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8851 create_info.setLayoutCount = 0;
8852 create_info.pSetLayouts = nullptr;
8853
8854 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8855 ASSERT_VK_SUCCESS(err);
8856 }
8857
8858 {
8859 VkGraphicsPipelineCreateInfo create_info{};
8860 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8861 create_info.stageCount = 2;
8862 create_info.pStages = stages;
8863 create_info.pVertexInputState = &vertex_input_state;
8864 create_info.pInputAssemblyState = &input_assembly_state;
8865 create_info.pViewportState = &viewport_state;
8866 create_info.pMultisampleState = &multisample_state;
8867 create_info.pRasterizationState = &rasterization_state;
8868 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8869 create_info.layout = pipeline_layout;
8870 create_info.renderPass = renderPass();
8871
8872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01408);
8873 VkPipeline pipeline;
8874 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8875 m_errorMonitor->VerifyFound();
8876 }
8877
8878 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8879 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8880}
8881
Jeremy Hayes091e1ab2017-05-04 18:10:28 -06008882TEST_F(VkLayerTest, VALIDATION_ERROR_01410) {
8883 TEST_DESCRIPTION("Test VALIDATION_ERROR_01410: location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes");
8884
8885 ASSERT_NO_FATAL_FAILURE(Init());
8886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8887
8888 VkPipelineCache pipeline_cache;
8889 {
8890 VkPipelineCacheCreateInfo create_info{};
8891 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8892
8893 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8894 ASSERT_VK_SUCCESS(err);
8895 }
8896
8897 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8898 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8899
8900 VkPipelineShaderStageCreateInfo stages[2]{{}};
8901 stages[0] = vs.GetStageCreateInfo();
8902 stages[1] = fs.GetStageCreateInfo();
8903
8904 // Test when location is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes.
8905 VkVertexInputAttributeDescription vertex_input_attribute_description{};
8906 vertex_input_attribute_description.location = m_device->props.limits.maxVertexInputAttributes;
8907
8908 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8909 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8910 vertex_input_state.pNext = nullptr;
8911 vertex_input_state.vertexBindingDescriptionCount = 0;
8912 vertex_input_state.pVertexBindingDescriptions = nullptr;
8913 vertex_input_state.vertexAttributeDescriptionCount = 1;
8914 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
8915
8916 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8917 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8918 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8919
8920 VkViewport viewport{};
8921 VkPipelineViewportStateCreateInfo viewport_state{};
8922 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8923 viewport_state.scissorCount = 1;
8924 viewport_state.viewportCount = 1;
8925 viewport_state.pViewports = &viewport;
8926
8927 VkPipelineMultisampleStateCreateInfo multisample_state{};
8928 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8929 multisample_state.pNext = nullptr;
8930 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8931 multisample_state.sampleShadingEnable = 0;
8932 multisample_state.minSampleShading = 1.0;
8933 multisample_state.pSampleMask = nullptr;
8934
8935 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8936 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8937 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8938 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8939 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8940 rasterization_state.depthClampEnable = VK_FALSE;
8941 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8942 rasterization_state.depthBiasEnable = VK_FALSE;
8943
8944 VkPipelineLayout pipeline_layout;
8945 {
8946 VkPipelineLayoutCreateInfo create_info{};
8947 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8948 create_info.setLayoutCount = 0;
8949 create_info.pSetLayouts = nullptr;
8950
8951 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8952 ASSERT_VK_SUCCESS(err);
8953 }
8954
8955 {
8956 VkGraphicsPipelineCreateInfo create_info{};
8957 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8958 create_info.stageCount = 2;
8959 create_info.pStages = stages;
8960 create_info.pVertexInputState = &vertex_input_state;
8961 create_info.pInputAssemblyState = &input_assembly_state;
8962 create_info.pViewportState = &viewport_state;
8963 create_info.pMultisampleState = &multisample_state;
8964 create_info.pRasterizationState = &rasterization_state;
8965 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8966 create_info.layout = pipeline_layout;
8967 create_info.renderPass = renderPass();
8968
8969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01410);
8970 VkPipeline pipeline;
8971 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8972 m_errorMonitor->VerifyFound();
8973 }
8974
8975 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8976 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8977}
8978
8979TEST_F(VkLayerTest, VALIDATION_ERROR_01411) {
8980 TEST_DESCRIPTION("Test VALIDATION_ERROR_01411: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
8981
8982 ASSERT_NO_FATAL_FAILURE(Init());
8983 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8984
8985 VkPipelineCache pipeline_cache;
8986 {
8987 VkPipelineCacheCreateInfo create_info{};
8988 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8989
8990 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8991 ASSERT_VK_SUCCESS(err);
8992 }
8993
8994 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8995 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8996
8997 VkPipelineShaderStageCreateInfo stages[2]{{}};
8998 stages[0] = vs.GetStageCreateInfo();
8999 stages[1] = fs.GetStageCreateInfo();
9000
9001 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
9002 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9003 vertex_input_attribute_description.binding = m_device->props.limits.maxVertexInputBindings;
9004
9005 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9006 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9007 vertex_input_state.pNext = nullptr;
9008 vertex_input_state.vertexBindingDescriptionCount = 0;
9009 vertex_input_state.pVertexBindingDescriptions = nullptr;
9010 vertex_input_state.vertexAttributeDescriptionCount = 1;
9011 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9012
9013 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9014 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9015 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9016
9017 VkViewport viewport{};
9018 VkPipelineViewportStateCreateInfo viewport_state{};
9019 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9020 viewport_state.scissorCount = 1;
9021 viewport_state.viewportCount = 1;
9022 viewport_state.pViewports = &viewport;
9023
9024 VkPipelineMultisampleStateCreateInfo multisample_state{};
9025 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9026 multisample_state.pNext = nullptr;
9027 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9028 multisample_state.sampleShadingEnable = 0;
9029 multisample_state.minSampleShading = 1.0;
9030 multisample_state.pSampleMask = nullptr;
9031
9032 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9033 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9034 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9035 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9036 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9037 rasterization_state.depthClampEnable = VK_FALSE;
9038 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9039 rasterization_state.depthBiasEnable = VK_FALSE;
9040
9041 VkPipelineLayout pipeline_layout;
9042 {
9043 VkPipelineLayoutCreateInfo create_info{};
9044 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9045 create_info.setLayoutCount = 0;
9046 create_info.pSetLayouts = nullptr;
9047
9048 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9049 ASSERT_VK_SUCCESS(err);
9050 }
9051
9052 {
9053 VkGraphicsPipelineCreateInfo create_info{};
9054 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9055 create_info.stageCount = 2;
9056 create_info.pStages = stages;
9057 create_info.pVertexInputState = &vertex_input_state;
9058 create_info.pInputAssemblyState = &input_assembly_state;
9059 create_info.pViewportState = &viewport_state;
9060 create_info.pMultisampleState = &multisample_state;
9061 create_info.pRasterizationState = &rasterization_state;
9062 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9063 create_info.layout = pipeline_layout;
9064 create_info.renderPass = renderPass();
9065
9066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01411);
9067 VkPipeline pipeline;
9068 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9069 m_errorMonitor->VerifyFound();
9070 }
9071
9072 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9073 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9074}
9075
9076TEST_F(VkLayerTest, VALIDATION_ERROR_01412) {
9077 TEST_DESCRIPTION(
9078 "Test VALIDATION_ERROR_01412: offset must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributeOffset");
9079
9080 ASSERT_NO_FATAL_FAILURE(Init());
9081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9082
9083 VkPipelineCache pipeline_cache;
9084 {
9085 VkPipelineCacheCreateInfo create_info{};
9086 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9087
9088 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
9089 ASSERT_VK_SUCCESS(err);
9090 }
9091
9092 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9093 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9094
9095 VkPipelineShaderStageCreateInfo stages[2]{{}};
9096 stages[0] = vs.GetStageCreateInfo();
9097 stages[1] = fs.GetStageCreateInfo();
9098
9099 // Test when offset is greater than maximum.
9100 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9101 vertex_input_attribute_description.offset = m_device->props.limits.maxVertexInputAttributeOffset + 1;
9102
9103 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9104 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9105 vertex_input_state.pNext = nullptr;
9106 vertex_input_state.vertexBindingDescriptionCount = 0;
9107 vertex_input_state.pVertexBindingDescriptions = nullptr;
9108 vertex_input_state.vertexAttributeDescriptionCount = 1;
9109 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9110
9111 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9112 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9113 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9114
9115 VkViewport viewport{};
9116 VkPipelineViewportStateCreateInfo viewport_state{};
9117 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9118 viewport_state.scissorCount = 1;
9119 viewport_state.viewportCount = 1;
9120 viewport_state.pViewports = &viewport;
9121
9122 VkPipelineMultisampleStateCreateInfo multisample_state{};
9123 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9124 multisample_state.pNext = nullptr;
9125 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9126 multisample_state.sampleShadingEnable = 0;
9127 multisample_state.minSampleShading = 1.0;
9128 multisample_state.pSampleMask = nullptr;
9129
9130 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9131 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9132 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9133 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9134 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9135 rasterization_state.depthClampEnable = VK_FALSE;
9136 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9137 rasterization_state.depthBiasEnable = VK_FALSE;
9138
9139 VkPipelineLayout pipeline_layout;
9140 {
9141 VkPipelineLayoutCreateInfo create_info{};
9142 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9143 create_info.setLayoutCount = 0;
9144 create_info.pSetLayouts = nullptr;
9145
9146 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9147 ASSERT_VK_SUCCESS(err);
9148 }
9149
9150 {
9151 VkGraphicsPipelineCreateInfo create_info{};
9152 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9153 create_info.stageCount = 2;
9154 create_info.pStages = stages;
9155 create_info.pVertexInputState = &vertex_input_state;
9156 create_info.pInputAssemblyState = &input_assembly_state;
9157 create_info.pViewportState = &viewport_state;
9158 create_info.pMultisampleState = &multisample_state;
9159 create_info.pRasterizationState = &rasterization_state;
9160 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9161 create_info.layout = pipeline_layout;
9162 create_info.renderPass = renderPass();
9163
9164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01412);
9165 VkPipeline pipeline;
9166 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9167 m_errorMonitor->VerifyFound();
9168 }
9169
9170 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9171 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9172}
9173
Karl Schultz6addd812016-02-02 17:17:23 -07009174TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009175 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07009177 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009178
Tony Barbour1fa09702017-03-16 12:09:08 -06009179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009181
Tony Barbour552f6c02016-12-21 14:34:07 -07009182 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009183 // Don't care about RenderPass handle b/c error should be flagged before
9184 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009185 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009186
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009187 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009188}
9189
Karl Schultz6addd812016-02-02 17:17:23 -07009190TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009191 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9193 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009194
Tony Barbour1fa09702017-03-16 12:09:08 -06009195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009197
Tony Barbour552f6c02016-12-21 14:34:07 -07009198 m_commandBuffer->BeginCommandBuffer();
9199 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07009200 // Just create a dummy Renderpass that's non-NULL so we can get to the
9201 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009202 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009203
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009204 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009205}
9206
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009207TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009208 TEST_DESCRIPTION(
9209 "Begin a renderPass where clearValueCount is less than"
9210 "the number of renderPass attachments that use loadOp"
9211 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009212
Tony Barbour1fa09702017-03-16 12:09:08 -06009213 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9215
9216 // Create a renderPass with a single attachment that uses loadOp CLEAR
9217 VkAttachmentReference attach = {};
9218 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9219 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009220 subpass.colorAttachmentCount = 1;
9221 subpass.pColorAttachments = &attach;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009222 VkRenderPassCreateInfo rpci = {};
9223 rpci.subpassCount = 1;
9224 rpci.pSubpasses = &subpass;
9225 rpci.attachmentCount = 1;
9226 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07009227 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009228 // Set loadOp to CLEAR
9229 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9230 rpci.pAttachments = &attach_desc;
9231 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9232 VkRenderPass rp;
9233 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9234
9235 VkCommandBufferInheritanceInfo hinfo = {};
9236 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9237 hinfo.renderPass = VK_NULL_HANDLE;
9238 hinfo.subpass = 0;
9239 hinfo.framebuffer = VK_NULL_HANDLE;
9240 hinfo.occlusionQueryEnable = VK_FALSE;
9241 hinfo.queryFlags = 0;
9242 hinfo.pipelineStatistics = 0;
9243 VkCommandBufferBeginInfo info = {};
9244 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9245 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9246 info.pInheritanceInfo = &hinfo;
9247
9248 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9249 VkRenderPassBeginInfo rp_begin = {};
9250 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9251 rp_begin.pNext = NULL;
9252 rp_begin.renderPass = renderPass();
9253 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009254 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009255
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009257
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009258 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009259
9260 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009261
9262 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009263}
9264
Slawomir Cygan0808f392016-11-28 17:53:23 +01009265TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009266 TEST_DESCRIPTION(
9267 "Begin a renderPass where clearValueCount is greater than"
9268 "the number of renderPass attachments that use loadOp"
9269 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009270
Tony Barbour1fa09702017-03-16 12:09:08 -06009271 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01009272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9273
9274 // Create a renderPass with a single attachment that uses loadOp CLEAR
9275 VkAttachmentReference attach = {};
9276 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9277 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009278 subpass.colorAttachmentCount = 1;
9279 subpass.pColorAttachments = &attach;
Slawomir Cygan0808f392016-11-28 17:53:23 +01009280 VkRenderPassCreateInfo rpci = {};
9281 rpci.subpassCount = 1;
9282 rpci.pSubpasses = &subpass;
9283 rpci.attachmentCount = 1;
9284 VkAttachmentDescription attach_desc = {};
9285 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
9286 // Set loadOp to CLEAR
9287 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9288 rpci.pAttachments = &attach_desc;
9289 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9290 VkRenderPass rp;
9291 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9292
9293 VkCommandBufferBeginInfo info = {};
9294 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9295 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9296
9297 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9298 VkRenderPassBeginInfo rp_begin = {};
9299 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9300 rp_begin.pNext = NULL;
9301 rp_begin.renderPass = renderPass();
9302 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009303 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01009304
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
9306 " has a clearValueCount of"
9307 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009308
9309 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
9310
9311 m_errorMonitor->VerifyFound();
9312
9313 vkDestroyRenderPass(m_device->device(), rp, NULL);
9314}
9315
Cody Northrop3bb4d962016-05-09 16:15:57 -06009316TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06009317 TEST_DESCRIPTION("End a command buffer with an active render pass");
9318
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9320 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06009321
Tony Barbour1fa09702017-03-16 12:09:08 -06009322 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009323 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9324
Tony Barbour552f6c02016-12-21 14:34:07 -07009325 m_commandBuffer->BeginCommandBuffer();
9326 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9327 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009328
9329 m_errorMonitor->VerifyFound();
9330
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009331 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9332 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06009333}
9334
Karl Schultz6addd812016-02-02 17:17:23 -07009335TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009336 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9338 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009339
Tony Barbour1fa09702017-03-16 12:09:08 -06009340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009342
Tony Barbour552f6c02016-12-21 14:34:07 -07009343 m_commandBuffer->BeginCommandBuffer();
9344 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009345
9346 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009347 vk_testing::Buffer dstBuffer;
9348 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009349
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009350 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009351
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009352 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009353}
9354
Karl Schultz6addd812016-02-02 17:17:23 -07009355TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009356 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9358 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009359
Tony Barbour1fa09702017-03-16 12:09:08 -06009360 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009362
Tony Barbour552f6c02016-12-21 14:34:07 -07009363 m_commandBuffer->BeginCommandBuffer();
9364 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009365
9366 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009367 vk_testing::Buffer dstBuffer;
9368 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009369
Karl Schultz6addd812016-02-02 17:17:23 -07009370 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07009371 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
9372 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
9373 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009375 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009376}
9377
Karl Schultz6addd812016-02-02 17:17:23 -07009378TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009379 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9381 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009382
Tony Barbour1fa09702017-03-16 12:09:08 -06009383 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009385
Tony Barbour552f6c02016-12-21 14:34:07 -07009386 m_commandBuffer->BeginCommandBuffer();
9387 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009388
Michael Lentine0a369f62016-02-03 16:51:46 -06009389 VkClearColorValue clear_color;
9390 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009391 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9392 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9393 const int32_t tex_width = 32;
9394 const int32_t tex_height = 32;
9395 VkImageCreateInfo image_create_info = {};
9396 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9397 image_create_info.pNext = NULL;
9398 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9399 image_create_info.format = tex_format;
9400 image_create_info.extent.width = tex_width;
9401 image_create_info.extent.height = tex_height;
9402 image_create_info.extent.depth = 1;
9403 image_create_info.mipLevels = 1;
9404 image_create_info.arrayLayers = 1;
9405 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9406 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07009407 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009408
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009409 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009410 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009411
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009412 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009413
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009414 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009415
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009416 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009417}
9418
Karl Schultz6addd812016-02-02 17:17:23 -07009419TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009420 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9422 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009423
Tony Barbour1fa09702017-03-16 12:09:08 -06009424 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009426
Dave Houlton1d2022c2017-03-29 11:43:58 -06009427 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009428 if (!depth_format) {
9429 printf(" No Depth + Stencil format found. Skipped.\n");
9430 return;
9431 }
9432
Tony Barbour552f6c02016-12-21 14:34:07 -07009433 m_commandBuffer->BeginCommandBuffer();
9434 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009435
9436 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009437 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009438 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9439 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07009440 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07009441 image_create_info.extent.width = 64;
9442 image_create_info.extent.height = 64;
9443 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9444 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009445
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009446 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009447 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009449 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009450
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009451 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9452 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009453
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009454 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009455}
9456
Karl Schultz6addd812016-02-02 17:17:23 -07009457TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009458 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009459 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009460
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9462 "vkCmdClearAttachments(): This call "
9463 "must be issued inside an active "
9464 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009465
Tony Barbour1fa09702017-03-16 12:09:08 -06009466 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009468
9469 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009470 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009471 ASSERT_VK_SUCCESS(err);
9472
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009473 VkClearAttachment color_attachment;
9474 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9475 color_attachment.clearValue.color.float32[0] = 0;
9476 color_attachment.clearValue.color.float32[1] = 0;
9477 color_attachment.clearValue.color.float32[2] = 0;
9478 color_attachment.clearValue.color.float32[3] = 0;
9479 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009480 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009481 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009482
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009483 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009484}
9485
Chris Forbes3b97e932016-09-07 11:29:24 +12009486TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009487 TEST_DESCRIPTION(
9488 "Test that an error is produced when CmdNextSubpass is "
9489 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009490
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9492 "vkCmdNextSubpass(): Attempted to advance "
9493 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009494
Tony Barbour1fa09702017-03-16 12:09:08 -06009495 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9497
Tony Barbour552f6c02016-12-21 14:34:07 -07009498 m_commandBuffer->BeginCommandBuffer();
9499 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009500
9501 // error here.
9502 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9503 m_errorMonitor->VerifyFound();
9504
Tony Barbour552f6c02016-12-21 14:34:07 -07009505 m_commandBuffer->EndRenderPass();
9506 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009507}
9508
Chris Forbes6d624702016-09-07 13:57:05 +12009509TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009510 TEST_DESCRIPTION(
9511 "Test that an error is produced when CmdEndRenderPass is "
9512 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009513
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9515 "vkCmdEndRenderPass(): Called before reaching "
9516 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009517
Tony Barbour1fa09702017-03-16 12:09:08 -06009518 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009519 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9520 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009521
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009522 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009523
9524 VkRenderPass rp;
9525 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9526 ASSERT_VK_SUCCESS(err);
9527
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009528 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009529
9530 VkFramebuffer fb;
9531 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9532 ASSERT_VK_SUCCESS(err);
9533
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009534 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009535
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009536 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 +12009537
9538 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9539
9540 // Error here.
9541 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9542 m_errorMonitor->VerifyFound();
9543
9544 // Clean up.
9545 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9546 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9547}
9548
Karl Schultz9e66a292016-04-21 15:57:51 -06009549TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9550 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9552 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009553
Tony Barbour1fa09702017-03-16 12:09:08 -06009554 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009555 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009556
9557 VkBufferMemoryBarrier buf_barrier = {};
9558 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9559 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9560 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9561 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9562 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9563 buf_barrier.buffer = VK_NULL_HANDLE;
9564 buf_barrier.offset = 0;
9565 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009566 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9567 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009568
9569 m_errorMonitor->VerifyFound();
9570}
9571
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009572TEST_F(VkLayerTest, InvalidBarriers) {
9573 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9574
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009576
Tony Barbour1fa09702017-03-16 12:09:08 -06009577 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009578 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009579 if (!depth_format) {
9580 printf(" No Depth + Stencil format found. Skipped.\n");
9581 return;
9582 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009583 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9584
9585 VkMemoryBarrier mem_barrier = {};
9586 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9587 mem_barrier.pNext = NULL;
9588 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9589 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009590 m_commandBuffer->BeginCommandBuffer();
9591 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009592 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009593 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009594 &mem_barrier, 0, nullptr, 0, nullptr);
9595 m_errorMonitor->VerifyFound();
9596
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009598 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009599 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 -06009600 ASSERT_TRUE(image.initialized());
9601 VkImageMemoryBarrier img_barrier = {};
9602 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9603 img_barrier.pNext = NULL;
9604 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9605 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009606 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009607 // New layout can't be UNDEFINED
9608 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9609 img_barrier.image = image.handle();
9610 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9611 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9612 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9613 img_barrier.subresourceRange.baseArrayLayer = 0;
9614 img_barrier.subresourceRange.baseMipLevel = 0;
9615 img_barrier.subresourceRange.layerCount = 1;
9616 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009617 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9618 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009619 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009620
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009621 // Transition image to color attachment optimal
9622 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9623 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9624 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9625 nullptr, 0, nullptr, 1, &img_barrier);
9626 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9627 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9628
9629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009630 // baseArrayLayer + layerCount must be <= image's arrayLayers
9631 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009632 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9633 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009634 m_errorMonitor->VerifyFound();
9635 img_barrier.subresourceRange.baseArrayLayer = 0;
9636
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009638 // baseMipLevel + levelCount must be <= image's mipLevels
9639 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009640 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9641 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009642 m_errorMonitor->VerifyFound();
9643 img_barrier.subresourceRange.baseMipLevel = 0;
9644
Mike Weiblen7053aa32017-01-25 15:21:10 -07009645 // levelCount must be non-zero.
9646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9647 img_barrier.subresourceRange.levelCount = 0;
9648 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9649 nullptr, 0, nullptr, 1, &img_barrier);
9650 m_errorMonitor->VerifyFound();
9651 img_barrier.subresourceRange.levelCount = 1;
9652
9653 // layerCount must be non-zero.
9654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9655 img_barrier.subresourceRange.layerCount = 0;
9656 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9657 nullptr, 0, nullptr, 1, &img_barrier);
9658 m_errorMonitor->VerifyFound();
9659 img_barrier.subresourceRange.layerCount = 1;
9660
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009661 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 -06009662 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009663 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9664 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009665 VkBufferMemoryBarrier buf_barrier = {};
9666 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9667 buf_barrier.pNext = NULL;
9668 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9669 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9670 buf_barrier.buffer = buffer.handle();
9671 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9672 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9673 buf_barrier.offset = 0;
9674 buf_barrier.size = VK_WHOLE_SIZE;
9675 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009676 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9677 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009678 m_errorMonitor->VerifyFound();
9679 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9680
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009682 buf_barrier.offset = 257;
9683 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009684 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9685 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009686 m_errorMonitor->VerifyFound();
9687 buf_barrier.offset = 0;
9688
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009690 buf_barrier.size = 257;
9691 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009692 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9693 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009694 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009695
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009696 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009699 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009700 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009701 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009702 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9703 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009704 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009705
9706 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009707 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009708 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9709 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009710 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009711
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009712 // Having only one of depth or stencil set for DS image is an error
9713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9714 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9715 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9716 nullptr, 0, nullptr, 1, &img_barrier);
9717 m_errorMonitor->VerifyFound();
9718
9719 // Having anything other than DEPTH and STENCIL is an error
9720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009721 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9722 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9723 nullptr, 0, nullptr, 1, &img_barrier);
9724 m_errorMonitor->VerifyFound();
9725
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009726 // Now test depth-only
9727 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009728 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9729 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009730 VkDepthStencilObj d_image(m_device);
9731 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9732 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009733 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009734 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009735 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009736
9737 // DEPTH bit must be set
9738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9739 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009740 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009741 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9742 0, nullptr, 0, nullptr, 1, &img_barrier);
9743 m_errorMonitor->VerifyFound();
9744
9745 // No bits other than DEPTH may be set
9746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9747 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9748 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009749 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9750 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009751 m_errorMonitor->VerifyFound();
9752 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009753
9754 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009755 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9756 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009757 VkDepthStencilObj s_image(m_device);
9758 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9759 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009760 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009761 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009762 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009763 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9765 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009766 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009767 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9768 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009769 m_errorMonitor->VerifyFound();
9770 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009771
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009772 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009773 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009774 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 -06009775 ASSERT_TRUE(c_image.initialized());
9776 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9777 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9778 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009779
9780 // COLOR bit must be set
9781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9782 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009783 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009784 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9785 nullptr, 0, nullptr, 1, &img_barrier);
9786 m_errorMonitor->VerifyFound();
9787
9788 // No bits other than COLOR may be set
9789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9790 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9791 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009792 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9793 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009794 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009795
Mike Weiblene6e01172017-03-07 22:18:40 -07009796 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9797 {
9798 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009799 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 -07009800 ASSERT_TRUE(img_color.initialized());
9801
9802 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009803 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 -07009804 ASSERT_TRUE(img_ds.initialized());
9805
9806 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009807 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 -07009808 ASSERT_TRUE(img_xfer_src.initialized());
9809
9810 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009811 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 -07009812 ASSERT_TRUE(img_xfer_dst.initialized());
9813
9814 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009815 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 -07009816 ASSERT_TRUE(img_sampled.initialized());
9817
9818 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009819 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 -07009820 ASSERT_TRUE(img_input.initialized());
9821
9822 const struct {
9823 VkImageObj &image_obj;
9824 VkImageLayout bad_layout;
9825 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9826 } bad_buffer_layouts[] = {
9827 // clang-format off
9828 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9829 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9830 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9831 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9832 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9833 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9834 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9835 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9836 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9837 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9838 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9839 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9840 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9841 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9842 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9843 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9844 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9845 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9846 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9847 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9848 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9849 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9850 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9851 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9852 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9853 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9854 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9855 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9856 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9857 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9858 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9859 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9860 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9861 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9862 // clang-format on
9863 };
9864 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9865
9866 for (uint32_t i = 0; i < layout_count; ++i) {
9867 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9868 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9869 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9870 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9871 : VK_IMAGE_ASPECT_COLOR_BIT;
9872
9873 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9874 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9876 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9877 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9878 m_errorMonitor->VerifyFound();
9879
9880 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9881 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9883 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9884 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9885 m_errorMonitor->VerifyFound();
9886 }
9887
9888 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9889 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9890 }
9891
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009892 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9893
9894 // Create command pool with incompatible queueflags
9895 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009896 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009897 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009898 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009899 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009900 }
9901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9902
9903 VkCommandPool command_pool;
9904 VkCommandPoolCreateInfo pool_create_info{};
9905 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9906 pool_create_info.queueFamilyIndex = queue_family_index;
9907 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9908 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9909
9910 // Allocate a command buffer
9911 VkCommandBuffer bad_command_buffer;
9912 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9913 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9914 command_buffer_allocate_info.commandPool = command_pool;
9915 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9916 command_buffer_allocate_info.commandBufferCount = 1;
9917 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9918
9919 VkCommandBufferBeginInfo cbbi = {};
9920 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9921 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9922 buf_barrier.offset = 0;
9923 buf_barrier.size = VK_WHOLE_SIZE;
9924 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9925 &buf_barrier, 0, nullptr);
9926 m_errorMonitor->VerifyFound();
9927
9928 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9929 vkEndCommandBuffer(bad_command_buffer);
9930 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009931 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009932 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009933 }
9934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9935 VkEvent event;
9936 VkEventCreateInfo event_create_info{};
9937 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9938 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9939 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9940 nullptr, 0, nullptr);
9941 m_errorMonitor->VerifyFound();
9942
9943 vkEndCommandBuffer(bad_command_buffer);
9944 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009945}
9946
Chris Forbes50223732017-05-01 09:43:35 -07009947TEST_F(VkPositiveLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9948 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ
9949 // in srcAccessMask.
Tony Barbour18ba25c2016-09-29 13:42:40 -06009950
Chris Forbes50223732017-05-01 09:43:35 -07009951 // The required behavior here was a bit unclear in earlier versions of the
9952 // spec, but there is no memory dependency required here, so this should
9953 // work without warnings.
9954
9955 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -06009956 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009957 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009958 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 -07009959 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009960 ASSERT_TRUE(image.initialized());
9961
9962 VkImageMemoryBarrier barrier = {};
9963 VkImageSubresourceRange range;
9964 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009965 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
Chris Forbes50223732017-05-01 09:43:35 -07009966 barrier.dstAccessMask = 0;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009967 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9968 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9969 barrier.image = image.handle();
9970 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9971 range.baseMipLevel = 0;
9972 range.levelCount = 1;
9973 range.baseArrayLayer = 0;
9974 range.layerCount = 1;
9975 barrier.subresourceRange = range;
9976 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9977 cmdbuf.BeginCommandBuffer();
9978 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9979 &barrier);
9980 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9981 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9982 barrier.srcAccessMask = 0;
9983 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9984 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9985 &barrier);
9986
Chris Forbes50223732017-05-01 09:43:35 -07009987 m_errorMonitor->VerifyNotFound();
Tony Barbour18ba25c2016-09-29 13:42:40 -06009988}
9989
Karl Schultz6addd812016-02-02 17:17:23 -07009990TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009991 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009992 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009993 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009994
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009995 uint32_t const indices[] = {0};
9996 VkBufferCreateInfo buf_info = {};
9997 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9998 buf_info.size = 1024;
9999 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10000 buf_info.queueFamilyIndexCount = 1;
10001 buf_info.pQueueFamilyIndices = indices;
10002
10003 VkBuffer buffer;
10004 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
10005 ASSERT_VK_SUCCESS(err);
10006
10007 VkMemoryRequirements requirements;
10008 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
10009
10010 VkMemoryAllocateInfo alloc_info{};
10011 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10012 alloc_info.pNext = NULL;
10013 alloc_info.memoryTypeIndex = 0;
10014 alloc_info.allocationSize = requirements.size;
10015 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
10016 ASSERT_TRUE(pass);
10017
10018 VkDeviceMemory memory;
10019 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
10020 ASSERT_VK_SUCCESS(err);
10021
10022 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010023 ASSERT_VK_SUCCESS(err);
10024
Tony Barbour552f6c02016-12-21 14:34:07 -070010025 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010026 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010027
Karl Schultz6addd812016-02-02 17:17:23 -070010028 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10029 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010030 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10032 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010033 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010034
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010035 vkFreeMemory(m_device->device(), memory, NULL);
10036 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010037}
10038
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010039TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10040 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -060010041 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010042 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10043 VkBufferCreateInfo buffCI = {};
10044 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10045 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010046 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010047 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010048 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010049 uint32_t qfi[2];
10050 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010051 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010052
10053 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010054 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010055
10056 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10058 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
10059 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010060 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010061 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010062
10063 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -070010064 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
10066
10067 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
10068 buffCI.queueFamilyIndexCount = 2;
10069 qfi[0] = 1;
10070 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -070010071 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010072 VkDeviceMemory mem;
10073 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -070010074 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010075
10076 VkMemoryAllocateInfo alloc_info = {};
10077 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10078 alloc_info.allocationSize = 1024;
10079 bool pass = false;
10080 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
10081 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -070010082 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010083 return;
10084 }
10085 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -070010086 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010087
10088 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -070010089 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010090 m_commandBuffer->end();
10091 QueueCommandBuffer(false);
10092 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -070010093 vkDestroyBuffer(m_device->device(), ib2, NULL);
10094 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010095 }
10096
Tony Barbourdf4c0042016-06-01 15:55:43 -060010097 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010098}
10099
Karl Schultz6addd812016-02-02 17:17:23 -070010100TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010101 TEST_DESCRIPTION(
10102 "Attempt vkCmdExecuteCommands with a primary command buffer"
10103 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010104
Tony Barbour1fa09702017-03-16 12:09:08 -060010105 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010106 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010107
Chris Forbesf29a84f2016-10-06 18:39:28 +130010108 // An empty primary command buffer
10109 VkCommandBufferObj cb(m_device, m_commandPool);
10110 cb.BeginCommandBuffer();
10111 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010112
Chris Forbesf29a84f2016-10-06 18:39:28 +130010113 m_commandBuffer->BeginCommandBuffer();
10114 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10115 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010116
Chris Forbesf29a84f2016-10-06 18:39:28 +130010117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
10118 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010119 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070010120
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060010121 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010122}
10123
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010124TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010125 TEST_DESCRIPTION(
10126 "Attempt to update descriptor sets for images and buffers "
10127 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010128 VkResult err;
10129
Tony Barbour1fa09702017-03-16 12:09:08 -060010130 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010131 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10132 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10133 ds_type_count[i].type = VkDescriptorType(i);
10134 ds_type_count[i].descriptorCount = 1;
10135 }
10136 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10137 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10138 ds_pool_ci.pNext = NULL;
10139 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10140 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10141 ds_pool_ci.pPoolSizes = ds_type_count;
10142
10143 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010144 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010145 ASSERT_VK_SUCCESS(err);
10146
10147 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010148 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010149 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10150 dsl_binding[i].binding = 0;
10151 dsl_binding[i].descriptorType = VkDescriptorType(i);
10152 dsl_binding[i].descriptorCount = 1;
10153 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10154 dsl_binding[i].pImmutableSamplers = NULL;
10155 }
10156
10157 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10158 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10159 ds_layout_ci.pNext = NULL;
10160 ds_layout_ci.bindingCount = 1;
10161 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10162 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10163 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010165 ASSERT_VK_SUCCESS(err);
10166 }
10167 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10168 VkDescriptorSetAllocateInfo alloc_info = {};
10169 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10170 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10171 alloc_info.descriptorPool = ds_pool;
10172 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010173 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010174 ASSERT_VK_SUCCESS(err);
10175
10176 // Create a buffer & bufferView to be used for invalid updates
10177 VkBufferCreateInfo buff_ci = {};
10178 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -070010179 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010180 buff_ci.size = 256;
10181 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -070010182 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010183 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10184 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -070010185
10186 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
10187 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
10188 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
10189 ASSERT_VK_SUCCESS(err);
10190
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010191 VkMemoryRequirements mem_reqs;
10192 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10193 VkMemoryAllocateInfo mem_alloc_info = {};
10194 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10195 mem_alloc_info.pNext = NULL;
10196 mem_alloc_info.memoryTypeIndex = 0;
10197 mem_alloc_info.allocationSize = mem_reqs.size;
10198 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10199 if (!pass) {
10200 vkDestroyBuffer(m_device->device(), buffer, NULL);
10201 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10202 return;
10203 }
10204 VkDeviceMemory mem;
10205 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
10206 ASSERT_VK_SUCCESS(err);
10207 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10208 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010209
10210 VkBufferViewCreateInfo buff_view_ci = {};
10211 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10212 buff_view_ci.buffer = buffer;
10213 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10214 buff_view_ci.range = VK_WHOLE_SIZE;
10215 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010216 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010217 ASSERT_VK_SUCCESS(err);
10218
Tony Barbour415497c2017-01-24 10:06:09 -070010219 // Now get resources / view for storage_texel_buffer
10220 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
10221 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10222 if (!pass) {
10223 vkDestroyBuffer(m_device->device(), buffer, NULL);
10224 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10225 vkFreeMemory(m_device->device(), mem, NULL);
10226 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
10227 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10228 return;
10229 }
10230 VkDeviceMemory storage_texel_buffer_mem;
10231 VkBufferView storage_texel_buffer_view;
10232 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
10233 ASSERT_VK_SUCCESS(err);
10234 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
10235 ASSERT_VK_SUCCESS(err);
10236 buff_view_ci.buffer = storage_texel_buffer;
10237 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
10238 ASSERT_VK_SUCCESS(err);
10239
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010240 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -070010241 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010242 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -070010243 image_ci.format = VK_FORMAT_UNDEFINED;
10244 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
10245 VkFormat format = static_cast<VkFormat>(f);
10246 VkFormatProperties fProps = m_device->format_properties(format);
10247 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10248 image_ci.format = format;
10249 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10250 break;
10251 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10252 image_ci.format = format;
10253 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
10254 break;
10255 }
10256 }
10257 if (image_ci.format == VK_FORMAT_UNDEFINED) {
10258 return;
10259 }
10260
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010261 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10262 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010263 image_ci.extent.width = 64;
10264 image_ci.extent.height = 64;
10265 image_ci.extent.depth = 1;
10266 image_ci.mipLevels = 1;
10267 image_ci.arrayLayers = 1;
10268 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010269 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010270 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010271 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10272 VkImage image;
10273 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10274 ASSERT_VK_SUCCESS(err);
10275 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010276 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010277
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010278 VkMemoryAllocateInfo mem_alloc = {};
10279 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10280 mem_alloc.pNext = NULL;
10281 mem_alloc.allocationSize = 0;
10282 mem_alloc.memoryTypeIndex = 0;
10283 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10284 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010285 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010286 ASSERT_TRUE(pass);
10287 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10288 ASSERT_VK_SUCCESS(err);
10289 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10290 ASSERT_VK_SUCCESS(err);
10291 // Now create view for image
10292 VkImageViewCreateInfo image_view_ci = {};
10293 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10294 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010295 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010296 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10297 image_view_ci.subresourceRange.layerCount = 1;
10298 image_view_ci.subresourceRange.baseArrayLayer = 0;
10299 image_view_ci.subresourceRange.levelCount = 1;
10300 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10301 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010302 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010303 ASSERT_VK_SUCCESS(err);
10304
10305 VkDescriptorBufferInfo buff_info = {};
10306 buff_info.buffer = buffer;
10307 VkDescriptorImageInfo img_info = {};
10308 img_info.imageView = image_view;
10309 VkWriteDescriptorSet descriptor_write = {};
10310 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10311 descriptor_write.dstBinding = 0;
10312 descriptor_write.descriptorCount = 1;
10313 descriptor_write.pTexelBufferView = &buff_view;
10314 descriptor_write.pBufferInfo = &buff_info;
10315 descriptor_write.pImageInfo = &img_info;
10316
10317 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010318 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010319 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
10320 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
10321 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
10322 VALIDATION_ERROR_00943, // STORAGE_IMAGE
10323 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
10324 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
10325 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
10326 VALIDATION_ERROR_00947, // STORAGE_BUFFER
10327 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
10328 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
10329 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010330 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010331 // Start loop at 1 as SAMPLER desc type has no usage bit error
10332 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -070010333 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10334 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
10335 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
10336 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010337 descriptor_write.descriptorType = VkDescriptorType(i);
10338 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010341 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010342
10343 m_errorMonitor->VerifyFound();
10344 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010345 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10346 descriptor_write.pTexelBufferView = &buff_view;
10347 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010348 }
Tony Barbour415497c2017-01-24 10:06:09 -070010349
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010350 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10351 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010352 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010353 vkDestroyImageView(m_device->device(), image_view, NULL);
10354 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010355 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010356 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010357 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010358 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010359 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10361}
10362
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010363TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010364 TEST_DESCRIPTION(
10365 "Attempt to update buffer descriptor set that has incorrect "
10366 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010367 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010368 "2. range value of 0\n"
10369 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010370 VkResult err;
10371
Tony Barbour1fa09702017-03-16 12:09:08 -060010372 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010373 VkDescriptorPoolSize ds_type_count = {};
10374 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10375 ds_type_count.descriptorCount = 1;
10376
10377 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10378 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10379 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010380 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010381 ds_pool_ci.maxSets = 1;
10382 ds_pool_ci.poolSizeCount = 1;
10383 ds_pool_ci.pPoolSizes = &ds_type_count;
10384
10385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010387 ASSERT_VK_SUCCESS(err);
10388
10389 // Create layout with single uniform buffer descriptor
10390 VkDescriptorSetLayoutBinding dsl_binding = {};
10391 dsl_binding.binding = 0;
10392 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10393 dsl_binding.descriptorCount = 1;
10394 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10395 dsl_binding.pImmutableSamplers = NULL;
10396
10397 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10398 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10399 ds_layout_ci.pNext = NULL;
10400 ds_layout_ci.bindingCount = 1;
10401 ds_layout_ci.pBindings = &dsl_binding;
10402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010404 ASSERT_VK_SUCCESS(err);
10405
10406 VkDescriptorSet descriptor_set = {};
10407 VkDescriptorSetAllocateInfo alloc_info = {};
10408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10409 alloc_info.descriptorSetCount = 1;
10410 alloc_info.descriptorPool = ds_pool;
10411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010413 ASSERT_VK_SUCCESS(err);
10414
10415 // Create a buffer to be used for invalid updates
10416 VkBufferCreateInfo buff_ci = {};
10417 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10418 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010419 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010420 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10421 VkBuffer buffer;
10422 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10423 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010424
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010425 // Have to bind memory to buffer before descriptor update
10426 VkMemoryAllocateInfo mem_alloc = {};
10427 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10428 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010429 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010430 mem_alloc.memoryTypeIndex = 0;
10431
10432 VkMemoryRequirements mem_reqs;
10433 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010434 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010435 if (!pass) {
10436 vkDestroyBuffer(m_device->device(), buffer, NULL);
10437 return;
10438 }
10439
10440 VkDeviceMemory mem;
10441 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10442 ASSERT_VK_SUCCESS(err);
10443 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10444 ASSERT_VK_SUCCESS(err);
10445
10446 VkDescriptorBufferInfo buff_info = {};
10447 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010448 // Cause error due to offset out of range
10449 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010450 buff_info.range = VK_WHOLE_SIZE;
10451 VkWriteDescriptorSet descriptor_write = {};
10452 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10453 descriptor_write.dstBinding = 0;
10454 descriptor_write.descriptorCount = 1;
10455 descriptor_write.pTexelBufferView = nullptr;
10456 descriptor_write.pBufferInfo = &buff_info;
10457 descriptor_write.pImageInfo = nullptr;
10458
10459 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10460 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010462
10463 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10464
10465 m_errorMonitor->VerifyFound();
10466 // Now cause error due to range of 0
10467 buff_info.offset = 0;
10468 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010470
10471 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10472
10473 m_errorMonitor->VerifyFound();
10474 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010475 buff_info.offset = 0;
10476 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010478
10479 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10480
10481 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010482 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010483 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10484 vkDestroyBuffer(m_device->device(), buffer, NULL);
10485 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10486 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10487}
10488
Tobin Ehlis845887e2017-02-02 19:01:44 -070010489TEST_F(VkLayerTest, DSBufferLimitErrors) {
10490 TEST_DESCRIPTION(
10491 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10492 "Test cases include:\n"
10493 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10494 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10495 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10496 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10497 VkResult err;
10498
Tony Barbour1fa09702017-03-16 12:09:08 -060010499 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010500 VkDescriptorPoolSize ds_type_count[2] = {};
10501 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10502 ds_type_count[0].descriptorCount = 1;
10503 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10504 ds_type_count[1].descriptorCount = 1;
10505
10506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10507 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 = 2;
10511 ds_pool_ci.pPoolSizes = ds_type_count;
10512
10513 VkDescriptorPool ds_pool;
10514 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10515 ASSERT_VK_SUCCESS(err);
10516
10517 // Create layout with single uniform buffer & single storage buffer descriptor
10518 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10519 dsl_binding[0].binding = 0;
10520 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10521 dsl_binding[0].descriptorCount = 1;
10522 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10523 dsl_binding[0].pImmutableSamplers = NULL;
10524 dsl_binding[1].binding = 1;
10525 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10526 dsl_binding[1].descriptorCount = 1;
10527 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10528 dsl_binding[1].pImmutableSamplers = NULL;
10529
10530 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10531 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10532 ds_layout_ci.pNext = NULL;
10533 ds_layout_ci.bindingCount = 2;
10534 ds_layout_ci.pBindings = dsl_binding;
10535 VkDescriptorSetLayout ds_layout;
10536 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10537 ASSERT_VK_SUCCESS(err);
10538
10539 VkDescriptorSet descriptor_set = {};
10540 VkDescriptorSetAllocateInfo alloc_info = {};
10541 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10542 alloc_info.descriptorSetCount = 1;
10543 alloc_info.descriptorPool = ds_pool;
10544 alloc_info.pSetLayouts = &ds_layout;
10545 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10546 ASSERT_VK_SUCCESS(err);
10547
10548 // Create a buffer to be used for invalid updates
10549 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10550 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10551 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10552 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10553 VkBufferCreateInfo ub_ci = {};
10554 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10555 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10556 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10557 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10558 VkBuffer uniform_buffer;
10559 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10560 ASSERT_VK_SUCCESS(err);
10561 VkBufferCreateInfo sb_ci = {};
10562 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10563 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10564 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10565 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10566 VkBuffer storage_buffer;
10567 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10568 ASSERT_VK_SUCCESS(err);
10569 // Have to bind memory to buffer before descriptor update
10570 VkMemoryAllocateInfo mem_alloc = {};
10571 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10572 mem_alloc.pNext = NULL;
10573 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10574 mem_alloc.memoryTypeIndex = 0;
10575
Cort Stratton77a0d592017-02-17 13:14:13 -080010576 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10577 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10578 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10579 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10580 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010581 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010582 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010583 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010584 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10585 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010586 return;
10587 }
10588
10589 VkDeviceMemory mem;
10590 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010591 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010592 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010593 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10594 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10595 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10596 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10597 return;
10598 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010599 ASSERT_VK_SUCCESS(err);
10600 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10601 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010602 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010603 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10604 ASSERT_VK_SUCCESS(err);
10605
10606 VkDescriptorBufferInfo buff_info = {};
10607 buff_info.buffer = uniform_buffer;
10608 buff_info.range = ub_ci.size; // This will exceed limit
10609 VkWriteDescriptorSet descriptor_write = {};
10610 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10611 descriptor_write.dstBinding = 0;
10612 descriptor_write.descriptorCount = 1;
10613 descriptor_write.pTexelBufferView = nullptr;
10614 descriptor_write.pBufferInfo = &buff_info;
10615 descriptor_write.pImageInfo = nullptr;
10616
10617 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10618 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010619 if (max_ub_range != UINT32_MAX) {
10620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10621 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10622 m_errorMonitor->VerifyFound();
10623 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010624 // Reduce size of range to acceptable limit & cause offset error
10625 buff_info.range = max_ub_range;
10626 buff_info.offset = min_ub_align - 1;
10627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10628 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10629 m_errorMonitor->VerifyFound();
10630
10631 // Now break storage updates
10632 buff_info.buffer = storage_buffer;
10633 buff_info.range = sb_ci.size; // This will exceed limit
10634 buff_info.offset = 0; // Reset offset for this update
10635
10636 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10637 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010638 if (max_ub_range != UINT32_MAX) {
10639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10640 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10641 m_errorMonitor->VerifyFound();
10642 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010643
10644 // Reduce size of range to acceptable limit & cause offset error
10645 buff_info.range = max_sb_range;
10646 buff_info.offset = min_sb_align - 1;
10647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10648 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10649 m_errorMonitor->VerifyFound();
10650
10651 vkFreeMemory(m_device->device(), mem, NULL);
10652 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10653 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10654 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10655 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10656}
10657
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010658TEST_F(VkLayerTest, DSAspectBitsErrors) {
10659 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10660 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010661 TEST_DESCRIPTION(
10662 "Attempt to update descriptor sets for images "
10663 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010664 VkResult err;
10665
Tony Barbour1fa09702017-03-16 12:09:08 -060010666 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010667 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010668 if (!depth_format) {
10669 printf(" No Depth + Stencil format found. Skipped.\n");
10670 return;
10671 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010672 VkDescriptorPoolSize ds_type_count = {};
10673 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10674 ds_type_count.descriptorCount = 1;
10675
10676 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10677 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10678 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010679 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010680 ds_pool_ci.maxSets = 5;
10681 ds_pool_ci.poolSizeCount = 1;
10682 ds_pool_ci.pPoolSizes = &ds_type_count;
10683
10684 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010685 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010686 ASSERT_VK_SUCCESS(err);
10687
10688 VkDescriptorSetLayoutBinding dsl_binding = {};
10689 dsl_binding.binding = 0;
10690 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10691 dsl_binding.descriptorCount = 1;
10692 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10693 dsl_binding.pImmutableSamplers = NULL;
10694
10695 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10696 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10697 ds_layout_ci.pNext = NULL;
10698 ds_layout_ci.bindingCount = 1;
10699 ds_layout_ci.pBindings = &dsl_binding;
10700 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010701 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010702 ASSERT_VK_SUCCESS(err);
10703
10704 VkDescriptorSet descriptor_set = {};
10705 VkDescriptorSetAllocateInfo alloc_info = {};
10706 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10707 alloc_info.descriptorSetCount = 1;
10708 alloc_info.descriptorPool = ds_pool;
10709 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010710 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010711 ASSERT_VK_SUCCESS(err);
10712
10713 // Create an image to be used for invalid updates
10714 VkImageCreateInfo image_ci = {};
10715 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10716 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010717 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010718 image_ci.extent.width = 64;
10719 image_ci.extent.height = 64;
10720 image_ci.extent.depth = 1;
10721 image_ci.mipLevels = 1;
10722 image_ci.arrayLayers = 1;
10723 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010724 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010725 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10726 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10727 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10728 VkImage image;
10729 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10730 ASSERT_VK_SUCCESS(err);
10731 // Bind memory to image
10732 VkMemoryRequirements mem_reqs;
10733 VkDeviceMemory image_mem;
10734 bool pass;
10735 VkMemoryAllocateInfo mem_alloc = {};
10736 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10737 mem_alloc.pNext = NULL;
10738 mem_alloc.allocationSize = 0;
10739 mem_alloc.memoryTypeIndex = 0;
10740 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10741 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010742 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010743 ASSERT_TRUE(pass);
10744 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10745 ASSERT_VK_SUCCESS(err);
10746 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10747 ASSERT_VK_SUCCESS(err);
10748 // Now create view for image
10749 VkImageViewCreateInfo image_view_ci = {};
10750 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10751 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010752 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010753 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10754 image_view_ci.subresourceRange.layerCount = 1;
10755 image_view_ci.subresourceRange.baseArrayLayer = 0;
10756 image_view_ci.subresourceRange.levelCount = 1;
10757 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010758 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010759
10760 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010761 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010762 ASSERT_VK_SUCCESS(err);
10763
10764 VkDescriptorImageInfo img_info = {};
10765 img_info.imageView = image_view;
10766 VkWriteDescriptorSet descriptor_write = {};
10767 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10768 descriptor_write.dstBinding = 0;
10769 descriptor_write.descriptorCount = 1;
10770 descriptor_write.pTexelBufferView = NULL;
10771 descriptor_write.pBufferInfo = NULL;
10772 descriptor_write.pImageInfo = &img_info;
10773 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10774 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010775 const char *error_msg =
10776 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10777 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010779
10780 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10781
10782 m_errorMonitor->VerifyFound();
10783 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10784 vkDestroyImage(m_device->device(), image, NULL);
10785 vkFreeMemory(m_device->device(), image_mem, NULL);
10786 vkDestroyImageView(m_device->device(), image_view, NULL);
10787 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10788 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10789}
10790
Karl Schultz6addd812016-02-02 17:17:23 -070010791TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010792 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010793 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010794
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10796 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10797 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010798
Tony Barbour1fa09702017-03-16 12:09:08 -060010799 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010800 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010801 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010802 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10803 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010804
10805 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010806 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10807 ds_pool_ci.pNext = NULL;
10808 ds_pool_ci.maxSets = 1;
10809 ds_pool_ci.poolSizeCount = 1;
10810 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010811
Tobin Ehlis3b780662015-05-28 12:11:26 -060010812 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010813 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010814 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010815 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010816 dsl_binding.binding = 0;
10817 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10818 dsl_binding.descriptorCount = 1;
10819 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10820 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010821
Tony Barboureb254902015-07-15 12:50:33 -060010822 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010823 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10824 ds_layout_ci.pNext = NULL;
10825 ds_layout_ci.bindingCount = 1;
10826 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010827
Tobin Ehlis3b780662015-05-28 12:11:26 -060010828 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010829 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010830 ASSERT_VK_SUCCESS(err);
10831
10832 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010833 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010834 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010835 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010836 alloc_info.descriptorPool = ds_pool;
10837 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010838 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010839 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010840
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010841 VkSamplerCreateInfo sampler_ci = {};
10842 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10843 sampler_ci.pNext = NULL;
10844 sampler_ci.magFilter = VK_FILTER_NEAREST;
10845 sampler_ci.minFilter = VK_FILTER_NEAREST;
10846 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10847 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10848 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10849 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10850 sampler_ci.mipLodBias = 1.0;
10851 sampler_ci.anisotropyEnable = VK_FALSE;
10852 sampler_ci.maxAnisotropy = 1;
10853 sampler_ci.compareEnable = VK_FALSE;
10854 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10855 sampler_ci.minLod = 1.0;
10856 sampler_ci.maxLod = 1.0;
10857 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10858 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10859 VkSampler sampler;
10860 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10861 ASSERT_VK_SUCCESS(err);
10862
10863 VkDescriptorImageInfo info = {};
10864 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010865
10866 VkWriteDescriptorSet descriptor_write;
10867 memset(&descriptor_write, 0, sizeof(descriptor_write));
10868 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010869 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010870 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010871 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010872 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010873 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010874
10875 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10876
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010877 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010878
Chia-I Wuf7458c52015-10-26 21:10:41 +080010879 vkDestroySampler(m_device->device(), sampler, NULL);
10880 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10881 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010882}
10883
Karl Schultz6addd812016-02-02 17:17:23 -070010884TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010885 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010886 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010887
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010889
Tony Barbour1fa09702017-03-16 12:09:08 -060010890 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010891 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010892 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010893 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10894 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010895
10896 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010897 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10898 ds_pool_ci.pNext = NULL;
10899 ds_pool_ci.maxSets = 1;
10900 ds_pool_ci.poolSizeCount = 1;
10901 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010902
Tobin Ehlis3b780662015-05-28 12:11:26 -060010903 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010904 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010905 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010906
Tony Barboureb254902015-07-15 12:50:33 -060010907 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010908 dsl_binding.binding = 0;
10909 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10910 dsl_binding.descriptorCount = 1;
10911 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10912 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010913
10914 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010915 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10916 ds_layout_ci.pNext = NULL;
10917 ds_layout_ci.bindingCount = 1;
10918 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010919
Tobin Ehlis3b780662015-05-28 12:11:26 -060010920 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010921 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010922 ASSERT_VK_SUCCESS(err);
10923
10924 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010925 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010926 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010927 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010928 alloc_info.descriptorPool = ds_pool;
10929 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010930 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010931 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010932
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010933 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10934
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010935 // Correctly update descriptor to avoid "NOT_UPDATED" error
10936 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010937 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010938 buff_info.offset = 0;
10939 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010940
10941 VkWriteDescriptorSet descriptor_write;
10942 memset(&descriptor_write, 0, sizeof(descriptor_write));
10943 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010944 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010945 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010946 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010947 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10948 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010949
10950 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10951
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010952 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010953
Chia-I Wuf7458c52015-10-26 21:10:41 +080010954 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10955 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010956}
10957
Karl Schultz6addd812016-02-02 17:17:23 -070010958TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010959 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010960 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010961
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010963
Tony Barbour1fa09702017-03-16 12:09:08 -060010964 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010965 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010966 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010967 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10968 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010969
10970 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010971 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10972 ds_pool_ci.pNext = NULL;
10973 ds_pool_ci.maxSets = 1;
10974 ds_pool_ci.poolSizeCount = 1;
10975 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010976
Tobin Ehlis3b780662015-05-28 12:11:26 -060010977 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010978 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010979 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010980
Tony Barboureb254902015-07-15 12:50:33 -060010981 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010982 dsl_binding.binding = 0;
10983 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10984 dsl_binding.descriptorCount = 1;
10985 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10986 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010987
10988 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010989 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10990 ds_layout_ci.pNext = NULL;
10991 ds_layout_ci.bindingCount = 1;
10992 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010993 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010994 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010995 ASSERT_VK_SUCCESS(err);
10996
10997 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010998 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010999 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011000 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011001 alloc_info.descriptorPool = ds_pool;
11002 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011003 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011004 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011005
Tony Barboureb254902015-07-15 12:50:33 -060011006 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011007 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11008 sampler_ci.pNext = NULL;
11009 sampler_ci.magFilter = VK_FILTER_NEAREST;
11010 sampler_ci.minFilter = VK_FILTER_NEAREST;
11011 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11012 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11013 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11014 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11015 sampler_ci.mipLodBias = 1.0;
11016 sampler_ci.anisotropyEnable = VK_FALSE;
11017 sampler_ci.maxAnisotropy = 1;
11018 sampler_ci.compareEnable = VK_FALSE;
11019 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11020 sampler_ci.minLod = 1.0;
11021 sampler_ci.maxLod = 1.0;
11022 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11023 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011024
Tobin Ehlis3b780662015-05-28 12:11:26 -060011025 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011026 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011027 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011028
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011029 VkDescriptorImageInfo info = {};
11030 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011031
11032 VkWriteDescriptorSet descriptor_write;
11033 memset(&descriptor_write, 0, sizeof(descriptor_write));
11034 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011035 descriptor_write.dstSet = descriptorSet;
11036 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011037 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011038 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011039 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011040 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011041
11042 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11043
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011044 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011045
Chia-I Wuf7458c52015-10-26 21:10:41 +080011046 vkDestroySampler(m_device->device(), sampler, NULL);
11047 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11048 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011049}
11050
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011051TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
11052 // Create layout w/ empty binding and attempt to update it
11053 VkResult err;
11054
Tony Barbour1fa09702017-03-16 12:09:08 -060011055 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011056
11057 VkDescriptorPoolSize ds_type_count = {};
11058 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11059 ds_type_count.descriptorCount = 1;
11060
11061 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11062 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11063 ds_pool_ci.pNext = NULL;
11064 ds_pool_ci.maxSets = 1;
11065 ds_pool_ci.poolSizeCount = 1;
11066 ds_pool_ci.pPoolSizes = &ds_type_count;
11067
11068 VkDescriptorPool ds_pool;
11069 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11070 ASSERT_VK_SUCCESS(err);
11071
11072 VkDescriptorSetLayoutBinding dsl_binding = {};
11073 dsl_binding.binding = 0;
11074 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11075 dsl_binding.descriptorCount = 0;
11076 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11077 dsl_binding.pImmutableSamplers = NULL;
11078
11079 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11080 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11081 ds_layout_ci.pNext = NULL;
11082 ds_layout_ci.bindingCount = 1;
11083 ds_layout_ci.pBindings = &dsl_binding;
11084 VkDescriptorSetLayout ds_layout;
11085 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11086 ASSERT_VK_SUCCESS(err);
11087
11088 VkDescriptorSet descriptor_set;
11089 VkDescriptorSetAllocateInfo alloc_info = {};
11090 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11091 alloc_info.descriptorSetCount = 1;
11092 alloc_info.descriptorPool = ds_pool;
11093 alloc_info.pSetLayouts = &ds_layout;
11094 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11095 ASSERT_VK_SUCCESS(err);
11096
11097 VkSamplerCreateInfo sampler_ci = {};
11098 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11099 sampler_ci.magFilter = VK_FILTER_NEAREST;
11100 sampler_ci.minFilter = VK_FILTER_NEAREST;
11101 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11102 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11103 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11104 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11105 sampler_ci.mipLodBias = 1.0;
11106 sampler_ci.maxAnisotropy = 1;
11107 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11108 sampler_ci.minLod = 1.0;
11109 sampler_ci.maxLod = 1.0;
11110 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11111
11112 VkSampler sampler;
11113 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11114 ASSERT_VK_SUCCESS(err);
11115
11116 VkDescriptorImageInfo info = {};
11117 info.sampler = sampler;
11118
11119 VkWriteDescriptorSet descriptor_write;
11120 memset(&descriptor_write, 0, sizeof(descriptor_write));
11121 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11122 descriptor_write.dstSet = descriptor_set;
11123 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011124 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011125 // This is the wrong type, but empty binding error will be flagged first
11126 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11127 descriptor_write.pImageInfo = &info;
11128
11129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
11130 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11131 m_errorMonitor->VerifyFound();
11132
11133 vkDestroySampler(m_device->device(), sampler, NULL);
11134 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11135 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11136}
11137
Karl Schultz6addd812016-02-02 17:17:23 -070011138TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11139 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11140 // types
11141 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011142
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011143 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 -060011144
Tony Barbour1fa09702017-03-16 12:09:08 -060011145 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011146
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011147 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011148 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11149 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011150
11151 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011152 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11153 ds_pool_ci.pNext = NULL;
11154 ds_pool_ci.maxSets = 1;
11155 ds_pool_ci.poolSizeCount = 1;
11156 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011157
Tobin Ehlis3b780662015-05-28 12:11:26 -060011158 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011159 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011160 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011161 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011162 dsl_binding.binding = 0;
11163 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11164 dsl_binding.descriptorCount = 1;
11165 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11166 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011167
Tony Barboureb254902015-07-15 12:50:33 -060011168 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011169 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11170 ds_layout_ci.pNext = NULL;
11171 ds_layout_ci.bindingCount = 1;
11172 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011173
Tobin Ehlis3b780662015-05-28 12:11:26 -060011174 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011175 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011176 ASSERT_VK_SUCCESS(err);
11177
11178 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011179 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011180 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011181 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011182 alloc_info.descriptorPool = ds_pool;
11183 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011184 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011185 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011186
Tony Barboureb254902015-07-15 12:50:33 -060011187 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011188 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11189 sampler_ci.pNext = NULL;
11190 sampler_ci.magFilter = VK_FILTER_NEAREST;
11191 sampler_ci.minFilter = VK_FILTER_NEAREST;
11192 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11193 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11194 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11195 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11196 sampler_ci.mipLodBias = 1.0;
11197 sampler_ci.anisotropyEnable = VK_FALSE;
11198 sampler_ci.maxAnisotropy = 1;
11199 sampler_ci.compareEnable = VK_FALSE;
11200 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11201 sampler_ci.minLod = 1.0;
11202 sampler_ci.maxLod = 1.0;
11203 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11204 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011205 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011206 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011207 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011208
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011209 VkDescriptorImageInfo info = {};
11210 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011211
11212 VkWriteDescriptorSet descriptor_write;
11213 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011214 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011215 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011216 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011217 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011218 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011219 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011220
11221 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11222
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011223 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011224
Chia-I Wuf7458c52015-10-26 21:10:41 +080011225 vkDestroySampler(m_device->device(), sampler, NULL);
11226 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11227 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011228}
11229
Karl Schultz6addd812016-02-02 17:17:23 -070011230TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011231 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011232 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011233
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011235
Tony Barbour1fa09702017-03-16 12:09:08 -060011236 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011237 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11238 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011239 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011240 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11241 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011242
11243 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011244 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11245 ds_pool_ci.pNext = NULL;
11246 ds_pool_ci.maxSets = 1;
11247 ds_pool_ci.poolSizeCount = 1;
11248 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011249
11250 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011251 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011252 ASSERT_VK_SUCCESS(err);
11253
11254 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011255 dsl_binding.binding = 0;
11256 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11257 dsl_binding.descriptorCount = 1;
11258 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11259 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011260
11261 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011262 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11263 ds_layout_ci.pNext = NULL;
11264 ds_layout_ci.bindingCount = 1;
11265 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011266 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011267 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011268 ASSERT_VK_SUCCESS(err);
11269
11270 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011271 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011272 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011273 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011274 alloc_info.descriptorPool = ds_pool;
11275 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011276 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011277 ASSERT_VK_SUCCESS(err);
11278
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011279 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011280
11281 VkDescriptorImageInfo descriptor_info;
11282 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11283 descriptor_info.sampler = sampler;
11284
11285 VkWriteDescriptorSet descriptor_write;
11286 memset(&descriptor_write, 0, sizeof(descriptor_write));
11287 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011288 descriptor_write.dstSet = descriptorSet;
11289 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011290 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011291 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11292 descriptor_write.pImageInfo = &descriptor_info;
11293
11294 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11295
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011296 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011297
Chia-I Wuf7458c52015-10-26 21:10:41 +080011298 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11299 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011300}
11301
Karl Schultz6addd812016-02-02 17:17:23 -070011302TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11303 // Create a single combined Image/Sampler descriptor and send it an invalid
11304 // imageView
11305 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011306
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011308
Tony Barbour1fa09702017-03-16 12:09:08 -060011309 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011310 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011311 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11312 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011313
11314 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011315 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11316 ds_pool_ci.pNext = NULL;
11317 ds_pool_ci.maxSets = 1;
11318 ds_pool_ci.poolSizeCount = 1;
11319 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011320
11321 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011322 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011323 ASSERT_VK_SUCCESS(err);
11324
11325 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011326 dsl_binding.binding = 0;
11327 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11328 dsl_binding.descriptorCount = 1;
11329 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11330 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011331
11332 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011333 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11334 ds_layout_ci.pNext = NULL;
11335 ds_layout_ci.bindingCount = 1;
11336 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011337 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011338 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011339 ASSERT_VK_SUCCESS(err);
11340
11341 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011342 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011343 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011344 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011345 alloc_info.descriptorPool = ds_pool;
11346 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011347 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011348 ASSERT_VK_SUCCESS(err);
11349
11350 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011351 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11352 sampler_ci.pNext = NULL;
11353 sampler_ci.magFilter = VK_FILTER_NEAREST;
11354 sampler_ci.minFilter = VK_FILTER_NEAREST;
11355 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11356 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11357 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11358 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11359 sampler_ci.mipLodBias = 1.0;
11360 sampler_ci.anisotropyEnable = VK_FALSE;
11361 sampler_ci.maxAnisotropy = 1;
11362 sampler_ci.compareEnable = VK_FALSE;
11363 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11364 sampler_ci.minLod = 1.0;
11365 sampler_ci.maxLod = 1.0;
11366 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11367 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011368
11369 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011370 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011371 ASSERT_VK_SUCCESS(err);
11372
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011373 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011374
11375 VkDescriptorImageInfo descriptor_info;
11376 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11377 descriptor_info.sampler = sampler;
11378 descriptor_info.imageView = view;
11379
11380 VkWriteDescriptorSet descriptor_write;
11381 memset(&descriptor_write, 0, sizeof(descriptor_write));
11382 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011383 descriptor_write.dstSet = descriptorSet;
11384 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011385 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011386 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11387 descriptor_write.pImageInfo = &descriptor_info;
11388
11389 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11390
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011391 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011392
Chia-I Wuf7458c52015-10-26 21:10:41 +080011393 vkDestroySampler(m_device->device(), sampler, NULL);
11394 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11395 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011396}
11397
Karl Schultz6addd812016-02-02 17:17:23 -070011398TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11399 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11400 // into the other
11401 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011402
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11404 " binding #1 with type "
11405 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11406 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011407
Tony Barbour1fa09702017-03-16 12:09:08 -060011408 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011409 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011410 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011411 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11412 ds_type_count[0].descriptorCount = 1;
11413 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11414 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011415
11416 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011417 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11418 ds_pool_ci.pNext = NULL;
11419 ds_pool_ci.maxSets = 1;
11420 ds_pool_ci.poolSizeCount = 2;
11421 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011422
11423 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011424 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011425 ASSERT_VK_SUCCESS(err);
11426 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011427 dsl_binding[0].binding = 0;
11428 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11429 dsl_binding[0].descriptorCount = 1;
11430 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11431 dsl_binding[0].pImmutableSamplers = NULL;
11432 dsl_binding[1].binding = 1;
11433 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11434 dsl_binding[1].descriptorCount = 1;
11435 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11436 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011437
11438 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011439 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11440 ds_layout_ci.pNext = NULL;
11441 ds_layout_ci.bindingCount = 2;
11442 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011443
11444 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011445 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011446 ASSERT_VK_SUCCESS(err);
11447
11448 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011449 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011450 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011451 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011452 alloc_info.descriptorPool = ds_pool;
11453 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011454 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011455 ASSERT_VK_SUCCESS(err);
11456
11457 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011458 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11459 sampler_ci.pNext = NULL;
11460 sampler_ci.magFilter = VK_FILTER_NEAREST;
11461 sampler_ci.minFilter = VK_FILTER_NEAREST;
11462 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11463 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11464 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11465 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11466 sampler_ci.mipLodBias = 1.0;
11467 sampler_ci.anisotropyEnable = VK_FALSE;
11468 sampler_ci.maxAnisotropy = 1;
11469 sampler_ci.compareEnable = VK_FALSE;
11470 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11471 sampler_ci.minLod = 1.0;
11472 sampler_ci.maxLod = 1.0;
11473 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11474 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011475
11476 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011477 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011478 ASSERT_VK_SUCCESS(err);
11479
11480 VkDescriptorImageInfo info = {};
11481 info.sampler = sampler;
11482
11483 VkWriteDescriptorSet descriptor_write;
11484 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11485 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011486 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011487 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011488 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011489 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11490 descriptor_write.pImageInfo = &info;
11491 // This write update should succeed
11492 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11493 // Now perform a copy update that fails due to type mismatch
11494 VkCopyDescriptorSet copy_ds_update;
11495 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11496 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11497 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011498 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011499 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011500 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11501 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011502 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11503
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011504 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011505 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011506 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 -060011507 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11508 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11509 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011510 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011511 copy_ds_update.dstSet = descriptorSet;
11512 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011513 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011514 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11515
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011516 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011517
Tobin Ehlis04356f92015-10-27 16:35:27 -060011518 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11520 " binding#1 with offset index of 1 plus "
11521 "update array offset of 0 and update of "
11522 "5 descriptors oversteps total number "
11523 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011524
Tobin Ehlis04356f92015-10-27 16:35:27 -060011525 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11526 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11527 copy_ds_update.srcSet = descriptorSet;
11528 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011529 copy_ds_update.dstSet = descriptorSet;
11530 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011531 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011532 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11533
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011534 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011535
Chia-I Wuf7458c52015-10-26 21:10:41 +080011536 vkDestroySampler(m_device->device(), sampler, NULL);
11537 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11538 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011539}
11540
Karl Schultz6addd812016-02-02 17:17:23 -070011541TEST_F(VkLayerTest, NumSamplesMismatch) {
11542 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11543 // sampleCount
11544 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011545
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011547
Tony Barbour1fa09702017-03-16 12:09:08 -060011548 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011550 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011551 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011552 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011553
11554 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011555 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11556 ds_pool_ci.pNext = NULL;
11557 ds_pool_ci.maxSets = 1;
11558 ds_pool_ci.poolSizeCount = 1;
11559 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011560
Tobin Ehlis3b780662015-05-28 12:11:26 -060011561 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011562 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011563 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011564
Tony Barboureb254902015-07-15 12:50:33 -060011565 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011566 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011567 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011568 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011569 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11570 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011571
Tony Barboureb254902015-07-15 12:50:33 -060011572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11574 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011575 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011576 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011577
Tobin Ehlis3b780662015-05-28 12:11:26 -060011578 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011579 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011580 ASSERT_VK_SUCCESS(err);
11581
11582 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011583 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011584 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011585 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011586 alloc_info.descriptorPool = ds_pool;
11587 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011588 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011589 ASSERT_VK_SUCCESS(err);
11590
Tony Barboureb254902015-07-15 12:50:33 -060011591 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011592 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011593 pipe_ms_state_ci.pNext = NULL;
11594 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11595 pipe_ms_state_ci.sampleShadingEnable = 0;
11596 pipe_ms_state_ci.minSampleShading = 1.0;
11597 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011598
Tony Barboureb254902015-07-15 12:50:33 -060011599 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011600 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11601 pipeline_layout_ci.pNext = NULL;
11602 pipeline_layout_ci.setLayoutCount = 1;
11603 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011604
11605 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011606 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011607 ASSERT_VK_SUCCESS(err);
11608
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011609 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011610 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 -060011611 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011612 VkPipelineObj pipe(m_device);
11613 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011614 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011615 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011616 pipe.SetMSAA(&pipe_ms_state_ci);
11617 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011618
Tony Barbour552f6c02016-12-21 14:34:07 -070011619 m_commandBuffer->BeginCommandBuffer();
11620 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011621 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011622
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011623 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11624 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11625 VkRect2D scissor = {{0, 0}, {16, 16}};
11626 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11627
Mark Young29927482016-05-04 14:38:51 -060011628 // Render triangle (the error should trigger on the attempt to draw).
11629 Draw(3, 1, 0, 0);
11630
11631 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011632 m_commandBuffer->EndRenderPass();
11633 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011634
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011635 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011636
Chia-I Wuf7458c52015-10-26 21:10:41 +080011637 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11638 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11639 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011640}
Mark Young29927482016-05-04 14:38:51 -060011641
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011642TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011643 TEST_DESCRIPTION(
11644 "Hit RenderPass incompatible cases. "
11645 "Initial case is drawing with an active renderpass that's "
11646 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011647 VkResult err;
11648
Tony Barbour1fa09702017-03-16 12:09:08 -060011649 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011650 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11651
11652 VkDescriptorSetLayoutBinding dsl_binding = {};
11653 dsl_binding.binding = 0;
11654 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11655 dsl_binding.descriptorCount = 1;
11656 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11657 dsl_binding.pImmutableSamplers = NULL;
11658
11659 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11660 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11661 ds_layout_ci.pNext = NULL;
11662 ds_layout_ci.bindingCount = 1;
11663 ds_layout_ci.pBindings = &dsl_binding;
11664
11665 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011666 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011667 ASSERT_VK_SUCCESS(err);
11668
11669 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11670 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11671 pipeline_layout_ci.pNext = NULL;
11672 pipeline_layout_ci.setLayoutCount = 1;
11673 pipeline_layout_ci.pSetLayouts = &ds_layout;
11674
11675 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011676 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011677 ASSERT_VK_SUCCESS(err);
11678
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011679 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011680 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 -060011681 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011682 // Create a renderpass that will be incompatible with default renderpass
11683 VkAttachmentReference attach = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011684 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011685 VkAttachmentReference color_att = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011686 color_att.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011687 VkSubpassDescription subpass = {};
11688 subpass.inputAttachmentCount = 1;
11689 subpass.pInputAttachments = &attach;
11690 subpass.colorAttachmentCount = 1;
11691 subpass.pColorAttachments = &color_att;
11692 VkRenderPassCreateInfo rpci = {};
11693 rpci.subpassCount = 1;
11694 rpci.pSubpasses = &subpass;
11695 rpci.attachmentCount = 1;
11696 VkAttachmentDescription attach_desc = {};
11697 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011698 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11699 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011700 rpci.pAttachments = &attach_desc;
11701 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11702 VkRenderPass rp;
11703 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11704 VkPipelineObj pipe(m_device);
11705 pipe.AddShader(&vs);
11706 pipe.AddShader(&fs);
11707 pipe.AddColorAttachment();
11708 VkViewport view_port = {};
11709 m_viewports.push_back(view_port);
11710 pipe.SetViewport(m_viewports);
11711 VkRect2D rect = {};
11712 m_scissors.push_back(rect);
11713 pipe.SetScissor(m_scissors);
11714 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11715
11716 VkCommandBufferInheritanceInfo cbii = {};
11717 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11718 cbii.renderPass = rp;
11719 cbii.subpass = 0;
11720 VkCommandBufferBeginInfo cbbi = {};
11721 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11722 cbbi.pInheritanceInfo = &cbii;
11723 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11724 VkRenderPassBeginInfo rpbi = {};
11725 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11726 rpbi.framebuffer = m_framebuffer;
11727 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011728 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11729 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011730
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011732 // Render triangle (the error should trigger on the attempt to draw).
11733 Draw(3, 1, 0, 0);
11734
11735 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011736 m_commandBuffer->EndRenderPass();
11737 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011738
11739 m_errorMonitor->VerifyFound();
11740
11741 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11742 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11743 vkDestroyRenderPass(m_device->device(), rp, NULL);
11744}
11745
Mark Youngc89c6312016-03-31 16:03:20 -060011746TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11747 // Create Pipeline where the number of blend attachments doesn't match the
11748 // number of color attachments. In this case, we don't add any color
11749 // blend attachments even though we have a color attachment.
11750 VkResult err;
11751
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011753
Tony Barbour1fa09702017-03-16 12:09:08 -060011754 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11756 VkDescriptorPoolSize ds_type_count = {};
11757 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11758 ds_type_count.descriptorCount = 1;
11759
11760 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11761 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11762 ds_pool_ci.pNext = NULL;
11763 ds_pool_ci.maxSets = 1;
11764 ds_pool_ci.poolSizeCount = 1;
11765 ds_pool_ci.pPoolSizes = &ds_type_count;
11766
11767 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011768 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011769 ASSERT_VK_SUCCESS(err);
11770
11771 VkDescriptorSetLayoutBinding dsl_binding = {};
11772 dsl_binding.binding = 0;
11773 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11774 dsl_binding.descriptorCount = 1;
11775 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11776 dsl_binding.pImmutableSamplers = NULL;
11777
11778 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11779 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11780 ds_layout_ci.pNext = NULL;
11781 ds_layout_ci.bindingCount = 1;
11782 ds_layout_ci.pBindings = &dsl_binding;
11783
11784 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011785 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011786 ASSERT_VK_SUCCESS(err);
11787
11788 VkDescriptorSet descriptorSet;
11789 VkDescriptorSetAllocateInfo alloc_info = {};
11790 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11791 alloc_info.descriptorSetCount = 1;
11792 alloc_info.descriptorPool = ds_pool;
11793 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011794 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011795 ASSERT_VK_SUCCESS(err);
11796
11797 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011798 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011799 pipe_ms_state_ci.pNext = NULL;
11800 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11801 pipe_ms_state_ci.sampleShadingEnable = 0;
11802 pipe_ms_state_ci.minSampleShading = 1.0;
11803 pipe_ms_state_ci.pSampleMask = NULL;
11804
11805 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11806 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11807 pipeline_layout_ci.pNext = NULL;
11808 pipeline_layout_ci.setLayoutCount = 1;
11809 pipeline_layout_ci.pSetLayouts = &ds_layout;
11810
11811 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011812 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -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);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011816 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 -060011817 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011818 VkPipelineObj pipe(m_device);
11819 pipe.AddShader(&vs);
11820 pipe.AddShader(&fs);
11821 pipe.SetMSAA(&pipe_ms_state_ci);
11822 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011823 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011824
11825 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11826 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11827 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11828}
Mark Young29927482016-05-04 14:38:51 -060011829
Mark Muellerd4914412016-06-13 17:52:06 -060011830TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011831 TEST_DESCRIPTION(
11832 "Points to a wrong colorAttachment index in a VkClearAttachment "
11833 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011834 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011836
11837 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11838 m_errorMonitor->VerifyFound();
11839}
11840
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011841TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011842 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11843 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011844
Tony Barbour1fa09702017-03-16 12:09:08 -060011845 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011846 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011847
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011848 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011849 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11850 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011851
11852 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011853 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11854 ds_pool_ci.pNext = NULL;
11855 ds_pool_ci.maxSets = 1;
11856 ds_pool_ci.poolSizeCount = 1;
11857 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011858
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011859 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011860 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011861 ASSERT_VK_SUCCESS(err);
11862
Tony Barboureb254902015-07-15 12:50:33 -060011863 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011864 dsl_binding.binding = 0;
11865 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11866 dsl_binding.descriptorCount = 1;
11867 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11868 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011869
Tony Barboureb254902015-07-15 12:50:33 -060011870 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011871 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11872 ds_layout_ci.pNext = NULL;
11873 ds_layout_ci.bindingCount = 1;
11874 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011875
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011876 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011877 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011878 ASSERT_VK_SUCCESS(err);
11879
11880 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011881 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011882 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011883 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011884 alloc_info.descriptorPool = ds_pool;
11885 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011886 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011887 ASSERT_VK_SUCCESS(err);
11888
Tony Barboureb254902015-07-15 12:50:33 -060011889 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011890 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011891 pipe_ms_state_ci.pNext = NULL;
11892 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11893 pipe_ms_state_ci.sampleShadingEnable = 0;
11894 pipe_ms_state_ci.minSampleShading = 1.0;
11895 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011896
Tony Barboureb254902015-07-15 12:50:33 -060011897 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011898 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11899 pipeline_layout_ci.pNext = NULL;
11900 pipeline_layout_ci.setLayoutCount = 1;
11901 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011902
11903 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011904 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011905 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011906
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011907 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011908 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011909 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011910 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011911
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011912 VkPipelineObj pipe(m_device);
11913 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011914 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011915 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011916 pipe.SetMSAA(&pipe_ms_state_ci);
11917 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011918
Tony Barbour552f6c02016-12-21 14:34:07 -070011919 m_commandBuffer->BeginCommandBuffer();
11920 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011921
Karl Schultz6addd812016-02-02 17:17:23 -070011922 // Main thing we care about for this test is that the VkImage obj we're
11923 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011924 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011925 VkClearAttachment color_attachment;
11926 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11927 color_attachment.clearValue.color.float32[0] = 1.0;
11928 color_attachment.clearValue.color.float32[1] = 1.0;
11929 color_attachment.clearValue.color.float32[2] = 1.0;
11930 color_attachment.clearValue.color.float32[3] = 1.0;
11931 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011932 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011933
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011934 // Call for full-sized FB Color attachment prior to issuing a Draw
11935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011936 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011937 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011938 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011939
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011940 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11941 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11943 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11944 m_errorMonitor->VerifyFound();
11945
11946 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11947 clear_rect.layerCount = 2;
11948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11949 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011950 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011951
Chia-I Wuf7458c52015-10-26 21:10:41 +080011952 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11953 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11954 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011955}
11956
Karl Schultz6addd812016-02-02 17:17:23 -070011957TEST_F(VkLayerTest, VtxBufferBadIndex) {
11958 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011959
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11961 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011962
Tony Barbour1fa09702017-03-16 12:09:08 -060011963 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011964 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011965 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011966
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011967 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011968 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11969 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011970
11971 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011972 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11973 ds_pool_ci.pNext = NULL;
11974 ds_pool_ci.maxSets = 1;
11975 ds_pool_ci.poolSizeCount = 1;
11976 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011977
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011978 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011979 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011980 ASSERT_VK_SUCCESS(err);
11981
Tony Barboureb254902015-07-15 12:50:33 -060011982 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011983 dsl_binding.binding = 0;
11984 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11985 dsl_binding.descriptorCount = 1;
11986 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11987 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011988
Tony Barboureb254902015-07-15 12:50:33 -060011989 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011990 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11991 ds_layout_ci.pNext = NULL;
11992 ds_layout_ci.bindingCount = 1;
11993 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011994
Tobin Ehlis502480b2015-06-24 15:53:07 -060011995 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011996 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011997 ASSERT_VK_SUCCESS(err);
11998
11999 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012000 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012001 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012002 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012003 alloc_info.descriptorPool = ds_pool;
12004 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012005 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012006 ASSERT_VK_SUCCESS(err);
12007
Tony Barboureb254902015-07-15 12:50:33 -060012008 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012009 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012010 pipe_ms_state_ci.pNext = NULL;
12011 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12012 pipe_ms_state_ci.sampleShadingEnable = 0;
12013 pipe_ms_state_ci.minSampleShading = 1.0;
12014 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012015
Tony Barboureb254902015-07-15 12:50:33 -060012016 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012017 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12018 pipeline_layout_ci.pNext = NULL;
12019 pipeline_layout_ci.setLayoutCount = 1;
12020 pipeline_layout_ci.pSetLayouts = &ds_layout;
12021 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012022
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012023 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012024 ASSERT_VK_SUCCESS(err);
12025
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012026 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012027 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 -060012028 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012029 VkPipelineObj pipe(m_device);
12030 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012031 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012032 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012033 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012034 pipe.SetViewport(m_viewports);
12035 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012036 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012037
Tony Barbour552f6c02016-12-21 14:34:07 -070012038 m_commandBuffer->BeginCommandBuffer();
12039 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012040 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012041 // Don't care about actual data, just need to get to draw to flag error
12042 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012043 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012044 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012045 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012046
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012047 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012048
Chia-I Wuf7458c52015-10-26 21:10:41 +080012049 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12050 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12051 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012052}
Mark Muellerdfe37552016-07-07 14:47:42 -060012053
Mark Mueller2ee294f2016-08-04 12:59:48 -060012054TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012055 TEST_DESCRIPTION(
12056 "Use an invalid count in a vkEnumeratePhysicalDevices call."
12057 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060012058 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012059
Mark Mueller880fce52016-08-17 15:23:23 -060012060 // The following test fails with recent NVidia drivers.
12061 // By the time core_validation is reached, the NVidia
12062 // driver has sanitized the invalid condition and core_validation
12063 // is not introduced to the failure condition. This is not the case
12064 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012065 // uint32_t count = static_cast<uint32_t>(~0);
12066 // VkPhysicalDevice physical_device;
12067 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12068 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012069
Mark Mueller2ee294f2016-08-04 12:59:48 -060012070 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012071 VkDeviceQueueCreateInfo queue_create_info = {};
12072 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12073 queue_create_info.queueCount = 1;
12074 queue_create_info.pQueuePriorities = &queue_priority;
12075 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12076
12077 VkPhysicalDeviceFeatures features = m_device->phy().features();
12078 VkDevice testDevice;
12079 VkDeviceCreateInfo device_create_info = {};
12080 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12081 device_create_info.queueCreateInfoCount = 1;
12082 device_create_info.pQueueCreateInfos = &queue_create_info;
12083 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012084
12085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12086 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012087 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
12088 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12089 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012090 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12091 m_errorMonitor->VerifyFound();
12092
12093 queue_create_info.queueFamilyIndex = 1;
12094
12095 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12096 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12097 for (unsigned i = 0; i < feature_count; i++) {
12098 if (VK_FALSE == feature_array[i]) {
12099 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012100 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12102 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012103 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
12104 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12105 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12107 "You requested features that are unavailable on this device. You should first "
12108 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012109 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12110 m_errorMonitor->VerifyFound();
12111 break;
12112 }
12113 }
12114}
12115
Tobin Ehlis16edf082016-11-21 12:33:49 -070012116TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
12117 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
12118
Tony Barbour1fa09702017-03-16 12:09:08 -060012119 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070012120
12121 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
12122 std::vector<VkDeviceQueueCreateInfo> queue_info;
12123 queue_info.reserve(queue_props.size());
12124 std::vector<std::vector<float>> queue_priorities;
12125 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
12126 VkDeviceQueueCreateInfo qi{};
12127 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12128 qi.queueFamilyIndex = i;
12129 qi.queueCount = queue_props[i].queueCount;
12130 queue_priorities.emplace_back(qi.queueCount, 0.0f);
12131 qi.pQueuePriorities = queue_priorities[i].data();
12132 queue_info.push_back(qi);
12133 }
12134
12135 std::vector<const char *> device_extension_names;
12136
12137 VkDevice local_device;
12138 VkDeviceCreateInfo device_create_info = {};
12139 auto features = m_device->phy().features();
12140 // Intentionally disable pipeline stats
12141 features.pipelineStatisticsQuery = VK_FALSE;
12142 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12143 device_create_info.pNext = NULL;
12144 device_create_info.queueCreateInfoCount = queue_info.size();
12145 device_create_info.pQueueCreateInfos = queue_info.data();
12146 device_create_info.enabledLayerCount = 0;
12147 device_create_info.ppEnabledLayerNames = NULL;
12148 device_create_info.pEnabledFeatures = &features;
12149 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
12150 ASSERT_VK_SUCCESS(err);
12151
12152 VkQueryPoolCreateInfo qpci{};
12153 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12154 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
12155 qpci.queryCount = 1;
12156 VkQueryPool query_pool;
12157
12158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
12159 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
12160 m_errorMonitor->VerifyFound();
12161
12162 vkDestroyDevice(local_device, nullptr);
12163}
12164
Mark Mueller2ee294f2016-08-04 12:59:48 -060012165TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012166 TEST_DESCRIPTION(
12167 "Use an invalid queue index in a vkCmdWaitEvents call."
12168 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012169
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012170 const char *invalid_queue_index =
12171 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12172 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12173 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012174
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012175 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012176
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012178
Tony Barbour1fa09702017-03-16 12:09:08 -060012179 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012180
12181 VkEvent event;
12182 VkEventCreateInfo event_create_info{};
12183 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12184 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12185
Mark Mueller2ee294f2016-08-04 12:59:48 -060012186 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012187 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012188
Tony Barbour552f6c02016-12-21 14:34:07 -070012189 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012190
12191 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012192 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 -060012193 ASSERT_TRUE(image.initialized());
12194 VkImageMemoryBarrier img_barrier = {};
12195 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12196 img_barrier.pNext = NULL;
12197 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12198 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12199 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12200 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12201 img_barrier.image = image.handle();
12202 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012203
12204 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12205 // that layer validation catches the case when it is not.
12206 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012207 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12208 img_barrier.subresourceRange.baseArrayLayer = 0;
12209 img_barrier.subresourceRange.baseMipLevel = 0;
12210 img_barrier.subresourceRange.layerCount = 1;
12211 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012212 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
12213 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012214 m_errorMonitor->VerifyFound();
12215
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012217
12218 VkQueryPool query_pool;
12219 VkQueryPoolCreateInfo query_pool_create_info = {};
12220 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12221 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12222 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012223 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012224
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012225 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012226 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12227
12228 vkEndCommandBuffer(m_commandBuffer->handle());
12229 m_errorMonitor->VerifyFound();
12230
12231 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12232 vkDestroyEvent(m_device->device(), event, nullptr);
12233}
12234
Mark Muellerdfe37552016-07-07 14:47:42 -060012235TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012236 TEST_DESCRIPTION(
12237 "Submit a command buffer using deleted vertex buffer, "
12238 "delete a buffer twice, use an invalid offset for each "
12239 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060012240
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012241 const char *deleted_buffer_in_command_buffer =
12242 "Cannot submit cmd buffer "
12243 "using deleted buffer ";
12244 const char *invalid_offset_message =
12245 "vkBindBufferMemory(): "
12246 "memoryOffset is 0x";
12247 const char *invalid_storage_buffer_offset_message =
12248 "vkBindBufferMemory(): "
12249 "storage memoryOffset "
12250 "is 0x";
12251 const char *invalid_texel_buffer_offset_message =
12252 "vkBindBufferMemory(): "
12253 "texel memoryOffset "
12254 "is 0x";
12255 const char *invalid_uniform_buffer_offset_message =
12256 "vkBindBufferMemory(): "
12257 "uniform memoryOffset "
12258 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060012259
Tony Barbour1fa09702017-03-16 12:09:08 -060012260 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060012261 ASSERT_NO_FATAL_FAILURE(InitViewport());
12262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12263
12264 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012265 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060012266 pipe_ms_state_ci.pNext = NULL;
12267 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12268 pipe_ms_state_ci.sampleShadingEnable = 0;
12269 pipe_ms_state_ci.minSampleShading = 1.0;
12270 pipe_ms_state_ci.pSampleMask = nullptr;
12271
12272 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12273 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12274 VkPipelineLayout pipeline_layout;
12275
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012276 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060012277 ASSERT_VK_SUCCESS(err);
12278
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012279 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12280 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060012281 VkPipelineObj pipe(m_device);
12282 pipe.AddShader(&vs);
12283 pipe.AddShader(&fs);
12284 pipe.AddColorAttachment();
12285 pipe.SetMSAA(&pipe_ms_state_ci);
12286 pipe.SetViewport(m_viewports);
12287 pipe.SetScissor(m_scissors);
12288 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12289
Tony Barbour552f6c02016-12-21 14:34:07 -070012290 m_commandBuffer->BeginCommandBuffer();
12291 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012292 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060012293
12294 {
12295 // Create and bind a vertex buffer in a reduced scope, which will cause
12296 // it to be deleted upon leaving this scope
12297 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012298 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060012299 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12300 draw_verticies.AddVertexInputToPipe(pipe);
12301 }
12302
12303 Draw(1, 0, 0, 0);
12304
Tony Barbour552f6c02016-12-21 14:34:07 -070012305 m_commandBuffer->EndRenderPass();
12306 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060012307
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060012309 QueueCommandBuffer(false);
12310 m_errorMonitor->VerifyFound();
12311
12312 {
12313 // Create and bind a vertex buffer in a reduced scope, and delete it
12314 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012315 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060012317 buffer_test.TestDoubleDestroy();
12318 }
12319 m_errorMonitor->VerifyFound();
12320
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012321 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012322 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012323 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012325 m_errorMonitor->SetUnexpectedError(
12326 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
12327 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012328 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
12329 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012330 m_errorMonitor->VerifyFound();
12331 }
12332
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012333 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
12334 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012335 // Create and bind a memory buffer with an invalid offset again,
12336 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012338 m_errorMonitor->SetUnexpectedError(
12339 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12340 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012341 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12342 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012343 m_errorMonitor->VerifyFound();
12344 }
12345
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012346 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012347 // Create and bind a memory buffer with an invalid offset again, but
12348 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012350 m_errorMonitor->SetUnexpectedError(
12351 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12352 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012353 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12354 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012355 m_errorMonitor->VerifyFound();
12356 }
12357
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012358 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012359 // Create and bind a memory buffer with an invalid offset again, but
12360 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012362 m_errorMonitor->SetUnexpectedError(
12363 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12364 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012365 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12366 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012367 m_errorMonitor->VerifyFound();
12368 }
12369
12370 {
12371 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012373 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
12374 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012375 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
12376 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012377 m_errorMonitor->VerifyFound();
12378 }
12379
12380 {
12381 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012383 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
12384 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012385 }
12386 m_errorMonitor->VerifyFound();
12387
12388 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12389}
12390
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012391// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12392TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012393 TEST_DESCRIPTION(
12394 "Hit all possible validation checks associated with the "
12395 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12396 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012397 // 3 in ValidateCmdBufImageLayouts
12398 // * -1 Attempt to submit cmd buf w/ deleted image
12399 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12400 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012401
Tony Barbour1fa09702017-03-16 12:09:08 -060012402 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060012403 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070012404 if (!depth_format) {
12405 printf(" No Depth + Stencil format found. Skipped.\n");
12406 return;
12407 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012408 // Create src & dst images to use for copy operations
12409 VkImage src_image;
12410 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080012411 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012412
12413 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12414 const int32_t tex_width = 32;
12415 const int32_t tex_height = 32;
12416
12417 VkImageCreateInfo image_create_info = {};
12418 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12419 image_create_info.pNext = NULL;
12420 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12421 image_create_info.format = tex_format;
12422 image_create_info.extent.width = tex_width;
12423 image_create_info.extent.height = tex_height;
12424 image_create_info.extent.depth = 1;
12425 image_create_info.mipLevels = 1;
12426 image_create_info.arrayLayers = 4;
12427 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12428 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12429 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080012430 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012431 image_create_info.flags = 0;
12432
12433 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12434 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012435 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012436 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12437 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012438 image_create_info.format = VK_FORMAT_D32_SFLOAT;
12439 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
12440 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
12441 ASSERT_VK_SUCCESS(err);
12442
12443 // Allocate memory
12444 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080012445 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080012446 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080012447 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12448 mem_alloc.pNext = NULL;
12449 mem_alloc.allocationSize = 0;
12450 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080012451
12452 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012453 mem_alloc.allocationSize = img_mem_reqs.size;
12454 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012455 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080012456 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080012457 ASSERT_VK_SUCCESS(err);
12458
12459 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012460 mem_alloc.allocationSize = img_mem_reqs.size;
12461 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012462 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012463 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012464 ASSERT_VK_SUCCESS(err);
12465
12466 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012467 mem_alloc.allocationSize = img_mem_reqs.size;
12468 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012469 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012470 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012471 ASSERT_VK_SUCCESS(err);
12472
12473 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12474 ASSERT_VK_SUCCESS(err);
12475 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12476 ASSERT_VK_SUCCESS(err);
12477 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12478 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012479
Tony Barbour552f6c02016-12-21 14:34:07 -070012480 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012481 VkImageCopy copy_region;
12482 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12483 copy_region.srcSubresource.mipLevel = 0;
12484 copy_region.srcSubresource.baseArrayLayer = 0;
12485 copy_region.srcSubresource.layerCount = 1;
12486 copy_region.srcOffset.x = 0;
12487 copy_region.srcOffset.y = 0;
12488 copy_region.srcOffset.z = 0;
12489 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12490 copy_region.dstSubresource.mipLevel = 0;
12491 copy_region.dstSubresource.baseArrayLayer = 0;
12492 copy_region.dstSubresource.layerCount = 1;
12493 copy_region.dstOffset.x = 0;
12494 copy_region.dstOffset.y = 0;
12495 copy_region.dstOffset.z = 0;
12496 copy_region.extent.width = 1;
12497 copy_region.extent.height = 1;
12498 copy_region.extent.depth = 1;
12499
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12501 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12502 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012503
Cort530cf382016-12-08 09:59:47 -080012504 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 -060012505 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012506 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12507 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012508 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12509 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012510 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 -060012511 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012513 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12514 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012515 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080012516 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 -060012517 m_errorMonitor->VerifyFound();
12518 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012520 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012521 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012522 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012523 "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 -080012524 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 -060012525 m_errorMonitor->VerifyFound();
12526 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12528 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12529 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012530 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 -060012531 m_errorMonitor->VerifyFound();
12532 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012534 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012535 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012536 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012537 "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 -080012538 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 -060012539 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012541 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12542 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012543 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012544 "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 -080012545 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 -060012546 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012547
Cort3b021012016-12-07 12:00:57 -080012548 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12549 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12550 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12551 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12552 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12553 transfer_dst_image_barrier[0].srcAccessMask = 0;
12554 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12555 transfer_dst_image_barrier[0].image = dst_image;
12556 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12557 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12558 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12559 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12560 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12561 transfer_dst_image_barrier[0].image = depth_image;
12562 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12563 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12564 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12565
12566 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012567 VkClearColorValue color_clear_value = {};
12568 VkImageSubresourceRange clear_range;
12569 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12570 clear_range.baseMipLevel = 0;
12571 clear_range.baseArrayLayer = 0;
12572 clear_range.layerCount = 1;
12573 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012574
Cort3b021012016-12-07 12:00:57 -080012575 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12576 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012579 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012580 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012581 // Fail due to provided layout not matching actual current layout for color clear.
12582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012583 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012584 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012585
Cort530cf382016-12-08 09:59:47 -080012586 VkClearDepthStencilValue depth_clear_value = {};
12587 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012588
12589 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12590 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012593 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012594 m_errorMonitor->VerifyFound();
12595 // Fail due to provided layout not matching actual current layout for depth clear.
12596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012597 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012598 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012599
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012600 // Now cause error due to bad image layout transition in PipelineBarrier
12601 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012602 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012603 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012604 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012605 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012606 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12607 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012608 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012610 "you cannot transition the layout of aspect 1 from "
12611 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12612 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012614 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12615 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012616 m_errorMonitor->VerifyFound();
12617
12618 // Finally some layout errors at RenderPass create time
12619 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12620 VkAttachmentReference attach = {};
12621 // perf warning for GENERAL layout w/ non-DS input attachment
12622 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12623 VkSubpassDescription subpass = {};
12624 subpass.inputAttachmentCount = 1;
12625 subpass.pInputAttachments = &attach;
12626 VkRenderPassCreateInfo rpci = {};
12627 rpci.subpassCount = 1;
12628 rpci.pSubpasses = &subpass;
12629 rpci.attachmentCount = 1;
12630 VkAttachmentDescription attach_desc = {};
12631 attach_desc.format = VK_FORMAT_UNDEFINED;
12632 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012633 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012634 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12636 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012637 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12638 m_errorMonitor->VerifyFound();
12639 // error w/ non-general layout
12640 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12641
12642 m_errorMonitor->SetDesiredFailureMsg(
12643 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12644 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12645 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12646 m_errorMonitor->VerifyFound();
12647 subpass.inputAttachmentCount = 0;
12648 subpass.colorAttachmentCount = 1;
12649 subpass.pColorAttachments = &attach;
12650 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12651 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12653 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012654 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12655 m_errorMonitor->VerifyFound();
12656 // error w/ non-color opt or GENERAL layout for color attachment
12657 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12658 m_errorMonitor->SetDesiredFailureMsg(
12659 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12660 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12661 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12662 m_errorMonitor->VerifyFound();
12663 subpass.colorAttachmentCount = 0;
12664 subpass.pDepthStencilAttachment = &attach;
12665 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12666 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12668 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012669 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12670 m_errorMonitor->VerifyFound();
12671 // error w/ non-ds opt or GENERAL layout for color attachment
12672 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12674 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12675 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012676 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12677 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012678 // For this error we need a valid renderpass so create default one
12679 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12680 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012681 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012682 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12683 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12684 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12685 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12686 // Can't do a CLEAR load on READ_ONLY initialLayout
12687 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12688 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12689 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012691 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012692 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12693 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012694
Cort3b021012016-12-07 12:00:57 -080012695 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12696 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12697 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012698 vkDestroyImage(m_device->device(), src_image, NULL);
12699 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012700 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012701}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012702
Tobin Ehlise0936662016-10-11 08:10:51 -060012703TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12704 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12705 VkResult err;
12706
Tony Barbour1fa09702017-03-16 12:09:08 -060012707 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012708
12709 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12710 VkImageTiling tiling;
12711 VkFormatProperties format_properties;
12712 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12713 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12714 tiling = VK_IMAGE_TILING_LINEAR;
12715 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12716 tiling = VK_IMAGE_TILING_OPTIMAL;
12717 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012718 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012719 return;
12720 }
12721
12722 VkDescriptorPoolSize ds_type = {};
12723 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12724 ds_type.descriptorCount = 1;
12725
12726 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12727 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12728 ds_pool_ci.maxSets = 1;
12729 ds_pool_ci.poolSizeCount = 1;
12730 ds_pool_ci.pPoolSizes = &ds_type;
12731 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12732
12733 VkDescriptorPool ds_pool;
12734 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12735 ASSERT_VK_SUCCESS(err);
12736
12737 VkDescriptorSetLayoutBinding dsl_binding = {};
12738 dsl_binding.binding = 0;
12739 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12740 dsl_binding.descriptorCount = 1;
12741 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12742 dsl_binding.pImmutableSamplers = NULL;
12743
12744 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12745 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12746 ds_layout_ci.pNext = NULL;
12747 ds_layout_ci.bindingCount = 1;
12748 ds_layout_ci.pBindings = &dsl_binding;
12749
12750 VkDescriptorSetLayout ds_layout;
12751 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12752 ASSERT_VK_SUCCESS(err);
12753
12754 VkDescriptorSetAllocateInfo alloc_info = {};
12755 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12756 alloc_info.descriptorSetCount = 1;
12757 alloc_info.descriptorPool = ds_pool;
12758 alloc_info.pSetLayouts = &ds_layout;
12759 VkDescriptorSet descriptor_set;
12760 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12761 ASSERT_VK_SUCCESS(err);
12762
12763 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12764 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12765 pipeline_layout_ci.pNext = NULL;
12766 pipeline_layout_ci.setLayoutCount = 1;
12767 pipeline_layout_ci.pSetLayouts = &ds_layout;
12768 VkPipelineLayout pipeline_layout;
12769 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12770 ASSERT_VK_SUCCESS(err);
12771
12772 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012773 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012774 ASSERT_TRUE(image.initialized());
12775 VkImageView view = image.targetView(tex_format);
12776
12777 VkDescriptorImageInfo image_info = {};
12778 image_info.imageView = view;
12779 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12780
12781 VkWriteDescriptorSet descriptor_write = {};
12782 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12783 descriptor_write.dstSet = descriptor_set;
12784 descriptor_write.dstBinding = 0;
12785 descriptor_write.descriptorCount = 1;
12786 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12787 descriptor_write.pImageInfo = &image_info;
12788
12789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12790 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12791 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12792 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12793 m_errorMonitor->VerifyFound();
12794
12795 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12796 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12797 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12798 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12799}
12800
Mark Mueller93b938f2016-08-18 10:27:40 -060012801TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012802 TEST_DESCRIPTION(
12803 "Use vkCmdExecuteCommands with invalid state "
12804 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012805
Tony Barbour1fa09702017-03-16 12:09:08 -060012806 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12808
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012809 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012810 const char *simultaneous_use_message2 =
12811 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12812 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012813
12814 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012815 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012816 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012817 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12818 command_buffer_allocate_info.commandBufferCount = 1;
12819
12820 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012821 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012822 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12823 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012824 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012825 command_buffer_inheritance_info.renderPass = m_renderPass;
12826 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012827
Mark Mueller93b938f2016-08-18 10:27:40 -060012828 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012829 command_buffer_begin_info.flags =
12830 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012831 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12832
12833 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12834 vkEndCommandBuffer(secondary_command_buffer);
12835
Mark Mueller93b938f2016-08-18 10:27:40 -060012836 VkSubmitInfo submit_info = {};
12837 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12838 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012839 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012840
Mark Mueller4042b652016-09-05 22:52:21 -060012841 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012842 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12844 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012845 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012846 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012847 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12848 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012849
Dave Houltonfbf52152017-01-06 12:55:29 -070012850 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012851 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012852 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012853
Mark Mueller4042b652016-09-05 22:52:21 -060012854 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012855 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012856 m_errorMonitor->SetUnexpectedError(
12857 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12858 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012859 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012860 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012861
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12863 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012864 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012865 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12866 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012867
12868 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012869
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012870 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012871}
12872
Tony Barbour626994c2017-02-08 15:29:37 -070012873TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12874 TEST_DESCRIPTION(
12875 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12876 "errors");
12877 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12878 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 -060012879 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012880
12881 VkCommandBuffer cmd_bufs[2];
12882 VkCommandBufferAllocateInfo alloc_info;
12883 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12884 alloc_info.pNext = NULL;
12885 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012886 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012887 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12888 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12889
12890 VkCommandBufferBeginInfo cb_binfo;
12891 cb_binfo.pNext = NULL;
12892 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12893 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12894 cb_binfo.flags = 0;
12895 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12896 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12897 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12898 vkEndCommandBuffer(cmd_bufs[0]);
12899 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12900
12901 VkSubmitInfo submit_info = {};
12902 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12903 submit_info.commandBufferCount = 2;
12904 submit_info.pCommandBuffers = duplicates;
12905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12906 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12907 m_errorMonitor->VerifyFound();
12908 vkQueueWaitIdle(m_device->m_queue);
12909
12910 // Set one time use and now look for one time submit
12911 duplicates[0] = duplicates[1] = cmd_bufs[1];
12912 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12913 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12914 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12915 vkEndCommandBuffer(cmd_bufs[1]);
12916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12917 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12918 m_errorMonitor->VerifyFound();
12919 vkQueueWaitIdle(m_device->m_queue);
12920}
12921
Tobin Ehlisb093da82017-01-19 12:05:27 -070012922TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012923 TEST_DESCRIPTION(
12924 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12925 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012926
Tony Barbour1fa09702017-03-16 12:09:08 -060012927 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12929
12930 std::vector<const char *> device_extension_names;
12931 auto features = m_device->phy().features();
12932 // Make sure gs & ts are disabled
12933 features.geometryShader = false;
12934 features.tessellationShader = false;
12935 // The sacrificial device object
12936 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12937
12938 VkCommandPoolCreateInfo pool_create_info{};
12939 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12940 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12941
12942 VkCommandPool command_pool;
12943 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12944
12945 VkCommandBufferAllocateInfo cmd = {};
12946 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12947 cmd.pNext = NULL;
12948 cmd.commandPool = command_pool;
12949 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12950 cmd.commandBufferCount = 1;
12951
12952 VkCommandBuffer cmd_buffer;
12953 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12954 ASSERT_VK_SUCCESS(err);
12955
12956 VkEvent event;
12957 VkEventCreateInfo evci = {};
12958 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12959 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12960 ASSERT_VK_SUCCESS(result);
12961
12962 VkCommandBufferBeginInfo cbbi = {};
12963 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12964 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12966 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12967 m_errorMonitor->VerifyFound();
12968
12969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12970 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12971 m_errorMonitor->VerifyFound();
12972
12973 vkDestroyEvent(test_device.handle(), event, NULL);
12974 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12975}
12976
Chris Forbesd70103a2017-04-13 11:34:09 -070012977TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012978 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012979 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12980
Tony Barbour552f6c02016-12-21 14:34:07 -070012981 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012982
12983 VkEvent event;
12984 VkEventCreateInfo event_create_info = {};
12985 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12986 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012987 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012988
Tony Barbour552f6c02016-12-21 14:34:07 -070012989 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012990 vkDestroyEvent(m_device->device(), event, nullptr);
12991
12992 VkSubmitInfo submit_info = {};
12993 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12994 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012995 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012997 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12998 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070012999}
Mark Muellerc8d441e2016-08-23 17:36:00 -060013000
Chris Forbesd70103a2017-04-13 11:34:09 -070013001TEST_F(VkLayerTest, InUseDestroyedSignaled) {
13002 TEST_DESCRIPTION(
13003 "Use vkCmdExecuteCommands with invalid state "
13004 "in primary and secondary command buffers. "
13005 "Delete objects that are inuse. Call VkQueueSubmit "
13006 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013007
Chris Forbesd70103a2017-04-13 11:34:09 -070013008 ASSERT_NO_FATAL_FAILURE(Init());
13009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13010
13011 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013012
Mark Mueller917f6bc2016-08-30 10:57:19 -060013013 VkSemaphoreCreateInfo semaphore_create_info = {};
13014 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13015 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013016 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013017 VkFenceCreateInfo fence_create_info = {};
13018 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13019 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013020 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013021
13022 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013023 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013024 descriptor_pool_type_count.descriptorCount = 1;
13025
13026 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13027 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13028 descriptor_pool_create_info.maxSets = 1;
13029 descriptor_pool_create_info.poolSizeCount = 1;
13030 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013031 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013032
13033 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013034 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013035
13036 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013037 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013038 descriptorset_layout_binding.descriptorCount = 1;
13039 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13040
13041 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013042 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013043 descriptorset_layout_create_info.bindingCount = 1;
13044 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13045
13046 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013047 ASSERT_VK_SUCCESS(
13048 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013049
13050 VkDescriptorSet descriptorset;
13051 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013052 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013053 descriptorset_allocate_info.descriptorSetCount = 1;
13054 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13055 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013056 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013057
Mark Mueller4042b652016-09-05 22:52:21 -060013058 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13059
13060 VkDescriptorBufferInfo buffer_info = {};
13061 buffer_info.buffer = buffer_test.GetBuffer();
13062 buffer_info.offset = 0;
13063 buffer_info.range = 1024;
13064
13065 VkWriteDescriptorSet write_descriptor_set = {};
13066 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13067 write_descriptor_set.dstSet = descriptorset;
13068 write_descriptor_set.descriptorCount = 1;
13069 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13070 write_descriptor_set.pBufferInfo = &buffer_info;
13071
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013072 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060013073
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013074 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13075 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013076
13077 VkPipelineObj pipe(m_device);
13078 pipe.AddColorAttachment();
13079 pipe.AddShader(&vs);
13080 pipe.AddShader(&fs);
13081
13082 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013083 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013084 pipeline_layout_create_info.setLayoutCount = 1;
13085 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13086
13087 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013088 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013089
13090 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
13091
Chris Forbesd70103a2017-04-13 11:34:09 -070013092 VkEvent event;
13093 VkEventCreateInfo event_create_info = {};
13094 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13095 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
13096
Tony Barbour552f6c02016-12-21 14:34:07 -070013097 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070013098
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013099 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013100
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013101 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13102 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13103 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013104
Tony Barbour552f6c02016-12-21 14:34:07 -070013105 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013106
Chris Forbesd70103a2017-04-13 11:34:09 -070013107 VkSubmitInfo submit_info = {};
13108 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13109 submit_info.commandBufferCount = 1;
13110 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013111 submit_info.signalSemaphoreCount = 1;
13112 submit_info.pSignalSemaphores = &semaphore;
13113 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013114 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060013115
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013117 vkDestroyEvent(m_device->device(), event, nullptr);
13118 m_errorMonitor->VerifyFound();
13119
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013121 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13122 m_errorMonitor->VerifyFound();
13123
Jeremy Hayes08369882017-02-02 10:31:06 -070013124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013125 vkDestroyFence(m_device->device(), fence, nullptr);
13126 m_errorMonitor->VerifyFound();
13127
Tobin Ehlis122207b2016-09-01 08:50:06 -070013128 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013129 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
13130 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013131 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013132 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
13133 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013134 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013135 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
13136 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013137 vkDestroyEvent(m_device->device(), event, nullptr);
13138 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013139 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013140 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13141}
13142
Tobin Ehlis2adda372016-09-01 08:51:06 -070013143TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
13144 TEST_DESCRIPTION("Delete in-use query pool.");
13145
Tony Barbour1fa09702017-03-16 12:09:08 -060013146 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070013147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13148
13149 VkQueryPool query_pool;
13150 VkQueryPoolCreateInfo query_pool_ci{};
13151 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
13152 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
13153 query_pool_ci.queryCount = 1;
13154 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070013155 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013156 // Reset query pool to create binding with cmd buffer
13157 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
13158
Tony Barbour552f6c02016-12-21 14:34:07 -070013159 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013160
13161 VkSubmitInfo submit_info = {};
13162 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13163 submit_info.commandBufferCount = 1;
13164 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13165 // Submit cmd buffer and then destroy query pool while in-flight
13166 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13167
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070013169 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13170 m_errorMonitor->VerifyFound();
13171
13172 vkQueueWaitIdle(m_device->m_queue);
13173 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013174 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013175 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070013176 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13177}
13178
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013179TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
13180 TEST_DESCRIPTION("Delete in-use pipeline.");
13181
Tony Barbour1fa09702017-03-16 12:09:08 -060013182 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13184
13185 // Empty pipeline layout used for binding PSO
13186 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13187 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13188 pipeline_layout_ci.setLayoutCount = 0;
13189 pipeline_layout_ci.pSetLayouts = NULL;
13190
13191 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013192 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013193 ASSERT_VK_SUCCESS(err);
13194
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013196 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013197 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13198 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013199 // Store pipeline handle so we can actually delete it before test finishes
13200 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013201 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013202 VkPipelineObj pipe(m_device);
13203 pipe.AddShader(&vs);
13204 pipe.AddShader(&fs);
13205 pipe.AddColorAttachment();
13206 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13207 delete_this_pipeline = pipe.handle();
13208
Tony Barbour552f6c02016-12-21 14:34:07 -070013209 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013210 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013211 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013212
Tony Barbour552f6c02016-12-21 14:34:07 -070013213 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013214
13215 VkSubmitInfo submit_info = {};
13216 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13217 submit_info.commandBufferCount = 1;
13218 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13219 // Submit cmd buffer and then pipeline destroyed while in-flight
13220 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013221 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013222 m_errorMonitor->VerifyFound();
13223 // Make sure queue finished and then actually delete pipeline
13224 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013225 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
13226 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013227 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
13228 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
13229}
13230
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013231TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
13232 TEST_DESCRIPTION("Delete in-use imageView.");
13233
Tony Barbour1fa09702017-03-16 12:09:08 -060013234 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13236
13237 VkDescriptorPoolSize ds_type_count;
13238 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13239 ds_type_count.descriptorCount = 1;
13240
13241 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13242 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13243 ds_pool_ci.maxSets = 1;
13244 ds_pool_ci.poolSizeCount = 1;
13245 ds_pool_ci.pPoolSizes = &ds_type_count;
13246
13247 VkDescriptorPool ds_pool;
13248 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13249 ASSERT_VK_SUCCESS(err);
13250
13251 VkSamplerCreateInfo sampler_ci = {};
13252 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13253 sampler_ci.pNext = NULL;
13254 sampler_ci.magFilter = VK_FILTER_NEAREST;
13255 sampler_ci.minFilter = VK_FILTER_NEAREST;
13256 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13257 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13258 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13259 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13260 sampler_ci.mipLodBias = 1.0;
13261 sampler_ci.anisotropyEnable = VK_FALSE;
13262 sampler_ci.maxAnisotropy = 1;
13263 sampler_ci.compareEnable = VK_FALSE;
13264 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13265 sampler_ci.minLod = 1.0;
13266 sampler_ci.maxLod = 1.0;
13267 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13268 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13269 VkSampler sampler;
13270
13271 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13272 ASSERT_VK_SUCCESS(err);
13273
13274 VkDescriptorSetLayoutBinding layout_binding;
13275 layout_binding.binding = 0;
13276 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13277 layout_binding.descriptorCount = 1;
13278 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13279 layout_binding.pImmutableSamplers = NULL;
13280
13281 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13282 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13283 ds_layout_ci.bindingCount = 1;
13284 ds_layout_ci.pBindings = &layout_binding;
13285 VkDescriptorSetLayout ds_layout;
13286 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13287 ASSERT_VK_SUCCESS(err);
13288
13289 VkDescriptorSetAllocateInfo alloc_info = {};
13290 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13291 alloc_info.descriptorSetCount = 1;
13292 alloc_info.descriptorPool = ds_pool;
13293 alloc_info.pSetLayouts = &ds_layout;
13294 VkDescriptorSet descriptor_set;
13295 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13296 ASSERT_VK_SUCCESS(err);
13297
13298 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13299 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13300 pipeline_layout_ci.pNext = NULL;
13301 pipeline_layout_ci.setLayoutCount = 1;
13302 pipeline_layout_ci.pSetLayouts = &ds_layout;
13303
13304 VkPipelineLayout pipeline_layout;
13305 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13306 ASSERT_VK_SUCCESS(err);
13307
13308 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013309 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 -060013310 ASSERT_TRUE(image.initialized());
13311
13312 VkImageView view;
13313 VkImageViewCreateInfo ivci = {};
13314 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13315 ivci.image = image.handle();
13316 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13317 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13318 ivci.subresourceRange.layerCount = 1;
13319 ivci.subresourceRange.baseMipLevel = 0;
13320 ivci.subresourceRange.levelCount = 1;
13321 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13322
13323 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13324 ASSERT_VK_SUCCESS(err);
13325
13326 VkDescriptorImageInfo image_info{};
13327 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13328 image_info.imageView = view;
13329 image_info.sampler = sampler;
13330
13331 VkWriteDescriptorSet descriptor_write = {};
13332 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13333 descriptor_write.dstSet = descriptor_set;
13334 descriptor_write.dstBinding = 0;
13335 descriptor_write.descriptorCount = 1;
13336 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13337 descriptor_write.pImageInfo = &image_info;
13338
13339 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13340
13341 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013342 char const *vsSource =
13343 "#version 450\n"
13344 "\n"
13345 "out gl_PerVertex { \n"
13346 " vec4 gl_Position;\n"
13347 "};\n"
13348 "void main(){\n"
13349 " gl_Position = vec4(1);\n"
13350 "}\n";
13351 char const *fsSource =
13352 "#version 450\n"
13353 "\n"
13354 "layout(set=0, binding=0) uniform sampler2D s;\n"
13355 "layout(location=0) out vec4 x;\n"
13356 "void main(){\n"
13357 " x = texture(s, vec2(1));\n"
13358 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013359 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13360 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13361 VkPipelineObj pipe(m_device);
13362 pipe.AddShader(&vs);
13363 pipe.AddShader(&fs);
13364 pipe.AddColorAttachment();
13365 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13366
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013368
Tony Barbour552f6c02016-12-21 14:34:07 -070013369 m_commandBuffer->BeginCommandBuffer();
13370 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013371 // Bind pipeline to cmd buffer
13372 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13373 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13374 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070013375
13376 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13377 VkRect2D scissor = {{0, 0}, {16, 16}};
13378 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13379 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13380
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013381 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013382 m_commandBuffer->EndRenderPass();
13383 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013384 // Submit cmd buffer then destroy sampler
13385 VkSubmitInfo submit_info = {};
13386 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13387 submit_info.commandBufferCount = 1;
13388 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13389 // Submit cmd buffer and then destroy imageView while in-flight
13390 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13391
13392 vkDestroyImageView(m_device->device(), view, nullptr);
13393 m_errorMonitor->VerifyFound();
13394 vkQueueWaitIdle(m_device->m_queue);
13395 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013396 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013397 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013398 vkDestroyImageView(m_device->device(), view, NULL);
13399 vkDestroySampler(m_device->device(), sampler, nullptr);
13400 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13401 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13402 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13403}
13404
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013405TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
13406 TEST_DESCRIPTION("Delete in-use bufferView.");
13407
Tony Barbour1fa09702017-03-16 12:09:08 -060013408 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013409 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13410
13411 VkDescriptorPoolSize ds_type_count;
13412 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13413 ds_type_count.descriptorCount = 1;
13414
13415 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13416 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13417 ds_pool_ci.maxSets = 1;
13418 ds_pool_ci.poolSizeCount = 1;
13419 ds_pool_ci.pPoolSizes = &ds_type_count;
13420
13421 VkDescriptorPool ds_pool;
13422 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13423 ASSERT_VK_SUCCESS(err);
13424
13425 VkDescriptorSetLayoutBinding layout_binding;
13426 layout_binding.binding = 0;
13427 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13428 layout_binding.descriptorCount = 1;
13429 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13430 layout_binding.pImmutableSamplers = NULL;
13431
13432 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13433 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13434 ds_layout_ci.bindingCount = 1;
13435 ds_layout_ci.pBindings = &layout_binding;
13436 VkDescriptorSetLayout ds_layout;
13437 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13438 ASSERT_VK_SUCCESS(err);
13439
13440 VkDescriptorSetAllocateInfo alloc_info = {};
13441 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13442 alloc_info.descriptorSetCount = 1;
13443 alloc_info.descriptorPool = ds_pool;
13444 alloc_info.pSetLayouts = &ds_layout;
13445 VkDescriptorSet descriptor_set;
13446 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13447 ASSERT_VK_SUCCESS(err);
13448
13449 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13450 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13451 pipeline_layout_ci.pNext = NULL;
13452 pipeline_layout_ci.setLayoutCount = 1;
13453 pipeline_layout_ci.pSetLayouts = &ds_layout;
13454
13455 VkPipelineLayout pipeline_layout;
13456 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13457 ASSERT_VK_SUCCESS(err);
13458
13459 VkBuffer buffer;
13460 uint32_t queue_family_index = 0;
13461 VkBufferCreateInfo buffer_create_info = {};
13462 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13463 buffer_create_info.size = 1024;
13464 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13465 buffer_create_info.queueFamilyIndexCount = 1;
13466 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13467
13468 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13469 ASSERT_VK_SUCCESS(err);
13470
13471 VkMemoryRequirements memory_reqs;
13472 VkDeviceMemory buffer_memory;
13473
13474 VkMemoryAllocateInfo memory_info = {};
13475 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13476 memory_info.allocationSize = 0;
13477 memory_info.memoryTypeIndex = 0;
13478
13479 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13480 memory_info.allocationSize = memory_reqs.size;
13481 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13482 ASSERT_TRUE(pass);
13483
13484 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13485 ASSERT_VK_SUCCESS(err);
13486 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13487 ASSERT_VK_SUCCESS(err);
13488
13489 VkBufferView view;
13490 VkBufferViewCreateInfo bvci = {};
13491 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13492 bvci.buffer = buffer;
13493 bvci.format = VK_FORMAT_R8_UNORM;
13494 bvci.range = VK_WHOLE_SIZE;
13495
13496 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13497 ASSERT_VK_SUCCESS(err);
13498
13499 VkWriteDescriptorSet descriptor_write = {};
13500 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13501 descriptor_write.dstSet = descriptor_set;
13502 descriptor_write.dstBinding = 0;
13503 descriptor_write.descriptorCount = 1;
13504 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13505 descriptor_write.pTexelBufferView = &view;
13506
13507 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13508
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013509 char const *vsSource =
13510 "#version 450\n"
13511 "\n"
13512 "out gl_PerVertex { \n"
13513 " vec4 gl_Position;\n"
13514 "};\n"
13515 "void main(){\n"
13516 " gl_Position = vec4(1);\n"
13517 "}\n";
13518 char const *fsSource =
13519 "#version 450\n"
13520 "\n"
13521 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13522 "layout(location=0) out vec4 x;\n"
13523 "void main(){\n"
13524 " x = imageLoad(s, 0);\n"
13525 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013526 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13527 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13528 VkPipelineObj pipe(m_device);
13529 pipe.AddShader(&vs);
13530 pipe.AddShader(&fs);
13531 pipe.AddColorAttachment();
13532 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13533
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013535
Tony Barbour552f6c02016-12-21 14:34:07 -070013536 m_commandBuffer->BeginCommandBuffer();
13537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013538 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13539 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13540 VkRect2D scissor = {{0, 0}, {16, 16}};
13541 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13542 // Bind pipeline to cmd buffer
13543 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13544 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13545 &descriptor_set, 0, nullptr);
13546 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013547 m_commandBuffer->EndRenderPass();
13548 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013549
13550 VkSubmitInfo submit_info = {};
13551 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13552 submit_info.commandBufferCount = 1;
13553 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13554 // Submit cmd buffer and then destroy bufferView while in-flight
13555 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13556
13557 vkDestroyBufferView(m_device->device(), view, nullptr);
13558 m_errorMonitor->VerifyFound();
13559 vkQueueWaitIdle(m_device->m_queue);
13560 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013561 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013562 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013563 vkDestroyBufferView(m_device->device(), view, NULL);
13564 vkDestroyBuffer(m_device->device(), buffer, NULL);
13565 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13566 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13567 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13568 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13569}
13570
Tobin Ehlis209532e2016-09-07 13:52:18 -060013571TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13572 TEST_DESCRIPTION("Delete in-use sampler.");
13573
Tony Barbour1fa09702017-03-16 12:09:08 -060013574 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013575 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13576
13577 VkDescriptorPoolSize ds_type_count;
13578 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13579 ds_type_count.descriptorCount = 1;
13580
13581 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13582 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13583 ds_pool_ci.maxSets = 1;
13584 ds_pool_ci.poolSizeCount = 1;
13585 ds_pool_ci.pPoolSizes = &ds_type_count;
13586
13587 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013588 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013589 ASSERT_VK_SUCCESS(err);
13590
13591 VkSamplerCreateInfo sampler_ci = {};
13592 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13593 sampler_ci.pNext = NULL;
13594 sampler_ci.magFilter = VK_FILTER_NEAREST;
13595 sampler_ci.minFilter = VK_FILTER_NEAREST;
13596 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13597 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13598 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13599 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13600 sampler_ci.mipLodBias = 1.0;
13601 sampler_ci.anisotropyEnable = VK_FALSE;
13602 sampler_ci.maxAnisotropy = 1;
13603 sampler_ci.compareEnable = VK_FALSE;
13604 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13605 sampler_ci.minLod = 1.0;
13606 sampler_ci.maxLod = 1.0;
13607 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13608 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13609 VkSampler sampler;
13610
13611 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13612 ASSERT_VK_SUCCESS(err);
13613
13614 VkDescriptorSetLayoutBinding layout_binding;
13615 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013616 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013617 layout_binding.descriptorCount = 1;
13618 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13619 layout_binding.pImmutableSamplers = NULL;
13620
13621 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13622 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13623 ds_layout_ci.bindingCount = 1;
13624 ds_layout_ci.pBindings = &layout_binding;
13625 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013626 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013627 ASSERT_VK_SUCCESS(err);
13628
13629 VkDescriptorSetAllocateInfo alloc_info = {};
13630 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13631 alloc_info.descriptorSetCount = 1;
13632 alloc_info.descriptorPool = ds_pool;
13633 alloc_info.pSetLayouts = &ds_layout;
13634 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013635 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013636 ASSERT_VK_SUCCESS(err);
13637
13638 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13639 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13640 pipeline_layout_ci.pNext = NULL;
13641 pipeline_layout_ci.setLayoutCount = 1;
13642 pipeline_layout_ci.pSetLayouts = &ds_layout;
13643
13644 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013645 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013646 ASSERT_VK_SUCCESS(err);
13647
13648 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013649 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 -060013650 ASSERT_TRUE(image.initialized());
13651
13652 VkImageView view;
13653 VkImageViewCreateInfo ivci = {};
13654 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13655 ivci.image = image.handle();
13656 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13657 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13658 ivci.subresourceRange.layerCount = 1;
13659 ivci.subresourceRange.baseMipLevel = 0;
13660 ivci.subresourceRange.levelCount = 1;
13661 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13662
13663 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13664 ASSERT_VK_SUCCESS(err);
13665
13666 VkDescriptorImageInfo image_info{};
13667 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13668 image_info.imageView = view;
13669 image_info.sampler = sampler;
13670
13671 VkWriteDescriptorSet descriptor_write = {};
13672 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13673 descriptor_write.dstSet = descriptor_set;
13674 descriptor_write.dstBinding = 0;
13675 descriptor_write.descriptorCount = 1;
13676 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13677 descriptor_write.pImageInfo = &image_info;
13678
13679 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13680
13681 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013682 char const *vsSource =
13683 "#version 450\n"
13684 "\n"
13685 "out gl_PerVertex { \n"
13686 " vec4 gl_Position;\n"
13687 "};\n"
13688 "void main(){\n"
13689 " gl_Position = vec4(1);\n"
13690 "}\n";
13691 char const *fsSource =
13692 "#version 450\n"
13693 "\n"
13694 "layout(set=0, binding=0) uniform sampler2D s;\n"
13695 "layout(location=0) out vec4 x;\n"
13696 "void main(){\n"
13697 " x = texture(s, vec2(1));\n"
13698 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013699 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13700 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13701 VkPipelineObj pipe(m_device);
13702 pipe.AddShader(&vs);
13703 pipe.AddShader(&fs);
13704 pipe.AddColorAttachment();
13705 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13706
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013708
Tony Barbour552f6c02016-12-21 14:34:07 -070013709 m_commandBuffer->BeginCommandBuffer();
13710 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013711 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013712 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13713 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13714 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013715
13716 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13717 VkRect2D scissor = {{0, 0}, {16, 16}};
13718 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13719 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13720
Tobin Ehlis209532e2016-09-07 13:52:18 -060013721 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013722 m_commandBuffer->EndRenderPass();
13723 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013724 // Submit cmd buffer then destroy sampler
13725 VkSubmitInfo submit_info = {};
13726 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13727 submit_info.commandBufferCount = 1;
13728 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13729 // Submit cmd buffer and then destroy sampler while in-flight
13730 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13731
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013732 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013733 m_errorMonitor->VerifyFound();
13734 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013735
Tobin Ehlis209532e2016-09-07 13:52:18 -060013736 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013737 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13738 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013739 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013740 vkDestroyImageView(m_device->device(), view, NULL);
13741 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13742 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13743 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13744}
13745
Mark Mueller1cd9f412016-08-25 13:23:52 -060013746TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013747 TEST_DESCRIPTION(
13748 "Call VkQueueSubmit with a semaphore that is already "
13749 "signaled but not waited on by the queue. Wait on a "
13750 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013751
Tony Barbour1fa09702017-03-16 12:09:08 -060013752 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13754
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013755 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 -070013756 const char *invalid_fence_wait_message =
13757 " which has not been submitted on a Queue or during "
13758 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013759
Tony Barbour552f6c02016-12-21 14:34:07 -070013760 m_commandBuffer->BeginCommandBuffer();
13761 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013762
13763 VkSemaphoreCreateInfo semaphore_create_info = {};
13764 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13765 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013766 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013767 VkSubmitInfo submit_info = {};
13768 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13769 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013770 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013771 submit_info.signalSemaphoreCount = 1;
13772 submit_info.pSignalSemaphores = &semaphore;
13773 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013774 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013775 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013776 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013777 m_commandBuffer->BeginCommandBuffer();
13778 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013780 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13781 m_errorMonitor->VerifyFound();
13782
Mark Mueller1cd9f412016-08-25 13:23:52 -060013783 VkFenceCreateInfo fence_create_info = {};
13784 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13785 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013786 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013787
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013789 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13790 m_errorMonitor->VerifyFound();
13791
Mark Mueller4042b652016-09-05 22:52:21 -060013792 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013793 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013794 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13795}
13796
Tobin Ehlis4af23302016-07-19 10:50:30 -060013797TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013798 TEST_DESCRIPTION(
13799 "Bind a secondary command buffer with with a framebuffer "
13800 "that does not match the framebuffer for the active "
13801 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013802 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013803 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13804
13805 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013806 VkAttachmentDescription attachment = {0,
13807 VK_FORMAT_B8G8R8A8_UNORM,
13808 VK_SAMPLE_COUNT_1_BIT,
13809 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13810 VK_ATTACHMENT_STORE_OP_STORE,
13811 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13812 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13813 VK_IMAGE_LAYOUT_UNDEFINED,
13814 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013815
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013816 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013817
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013818 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013819
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013820 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013821
13822 VkRenderPass rp;
13823 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13824 ASSERT_VK_SUCCESS(err);
13825
13826 // A compatible framebuffer.
13827 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013828 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 -060013829 ASSERT_TRUE(image.initialized());
13830
13831 VkImageViewCreateInfo ivci = {
13832 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13833 nullptr,
13834 0,
13835 image.handle(),
13836 VK_IMAGE_VIEW_TYPE_2D,
13837 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013838 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13839 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013840 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13841 };
13842 VkImageView view;
13843 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13844 ASSERT_VK_SUCCESS(err);
13845
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013846 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013847 VkFramebuffer fb;
13848 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13849 ASSERT_VK_SUCCESS(err);
13850
13851 VkCommandBufferAllocateInfo cbai = {};
13852 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013853 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013854 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13855 cbai.commandBufferCount = 1;
13856
13857 VkCommandBuffer sec_cb;
13858 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13859 ASSERT_VK_SUCCESS(err);
13860 VkCommandBufferBeginInfo cbbi = {};
13861 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013862 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013863 cbii.renderPass = renderPass();
13864 cbii.framebuffer = fb;
13865 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13866 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013867 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 -060013868 cbbi.pInheritanceInfo = &cbii;
13869 vkBeginCommandBuffer(sec_cb, &cbbi);
13870 vkEndCommandBuffer(sec_cb);
13871
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013872 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013873 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13874 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013875
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013877 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013878 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13879 m_errorMonitor->VerifyFound();
13880 // Cleanup
13881 vkDestroyImageView(m_device->device(), view, NULL);
13882 vkDestroyRenderPass(m_device->device(), rp, NULL);
13883 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13884}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013885
13886TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013887 TEST_DESCRIPTION(
13888 "If logicOp is available on the device, set it to an "
13889 "invalid value. If logicOp is not available, attempt to "
13890 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013891 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13893
13894 auto features = m_device->phy().features();
13895 // Set the expected error depending on whether or not logicOp available
13896 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13898 "If logic operations feature not "
13899 "enabled, logicOpEnable must be "
13900 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013901 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013903 }
13904 // Create a pipeline using logicOp
13905 VkResult err;
13906
13907 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13908 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13909
13910 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013911 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013912 ASSERT_VK_SUCCESS(err);
13913
13914 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13915 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13916 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013917 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013918 vp_state_ci.pViewports = &vp;
13919 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013920 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013921 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013922
13923 VkPipelineShaderStageCreateInfo shaderStages[2];
13924 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013926 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13927 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013928 shaderStages[0] = vs.GetStageCreateInfo();
13929 shaderStages[1] = fs.GetStageCreateInfo();
13930
13931 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13932 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13933
13934 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13935 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13936 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13937
13938 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13939 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013940 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013941
13942 VkPipelineColorBlendAttachmentState att = {};
13943 att.blendEnable = VK_FALSE;
13944 att.colorWriteMask = 0xf;
13945
13946 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13947 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13948 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13949 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013950 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013951 cb_ci.attachmentCount = 1;
13952 cb_ci.pAttachments = &att;
13953
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013954 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13955 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13956 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13957
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013958 VkGraphicsPipelineCreateInfo gp_ci = {};
13959 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13960 gp_ci.stageCount = 2;
13961 gp_ci.pStages = shaderStages;
13962 gp_ci.pVertexInputState = &vi_ci;
13963 gp_ci.pInputAssemblyState = &ia_ci;
13964 gp_ci.pViewportState = &vp_state_ci;
13965 gp_ci.pRasterizationState = &rs_ci;
13966 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013967 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013968 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13969 gp_ci.layout = pipeline_layout;
13970 gp_ci.renderPass = renderPass();
13971
13972 VkPipelineCacheCreateInfo pc_ci = {};
13973 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13974
13975 VkPipeline pipeline;
13976 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013977 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013978 ASSERT_VK_SUCCESS(err);
13979
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013980 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013981 m_errorMonitor->VerifyFound();
13982 if (VK_SUCCESS == err) {
13983 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13984 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013985 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13986 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13987}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013988
Mike Stroyanaccf7692015-05-12 16:00:45 -060013989#if GTEST_IS_THREADSAFE
13990struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013991 VkCommandBuffer commandBuffer;
Mike Stroyanca855662017-05-02 11:06:27 -060013992 VkDevice device;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013993 VkEvent event;
13994 bool bailout;
13995};
13996
Karl Schultz6addd812016-02-02 17:17:23 -070013997extern "C" void *AddToCommandBuffer(void *arg) {
13998 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013999
Mike Stroyana6d14942016-07-13 15:10:05 -060014000 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014001 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014002 if (data->bailout) {
14003 break;
14004 }
14005 }
14006 return NULL;
14007}
14008
Karl Schultz6addd812016-02-02 17:17:23 -070014009TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014010 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014011
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014013
Tony Barbour1fa09702017-03-16 12:09:08 -060014014 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060014015 ASSERT_NO_FATAL_FAILURE(InitViewport());
14016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14017
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014018 // Calls AllocateCommandBuffers
14019 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014020
14021 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014022 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014023
14024 VkEventCreateInfo event_info;
14025 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014026 VkResult err;
14027
14028 memset(&event_info, 0, sizeof(event_info));
14029 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
14030
Chia-I Wuf7458c52015-10-26 21:10:41 +080014031 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014032 ASSERT_VK_SUCCESS(err);
14033
Mike Stroyanaccf7692015-05-12 16:00:45 -060014034 err = vkResetEvent(device(), event);
14035 ASSERT_VK_SUCCESS(err);
14036
14037 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014038 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014039 data.event = event;
14040 data.bailout = false;
14041 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060014042
14043 // First do some correct operations using multiple threads.
14044 // Add many entries to command buffer from another thread.
14045 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
14046 // Make non-conflicting calls from this thread at the same time.
14047 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060014048 uint32_t count;
14049 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060014050 }
14051 test_platform_thread_join(thread, NULL);
14052
14053 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060014054 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014055 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014056 // Add many entries to command buffer from this thread at the same time.
14057 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014058
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014059 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014060 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014061
Mike Stroyan10b8cb72016-01-22 15:22:03 -070014062 m_errorMonitor->SetBailout(NULL);
14063
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014064 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014065
Chia-I Wuf7458c52015-10-26 21:10:41 +080014066 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014067}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014068#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014069
Karl Schultz6addd812016-02-02 17:17:23 -070014070TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014071 TEST_DESCRIPTION("Test that errors are produced for a spirv modules with invalid code sizes");
Chris Forbes1cc79542016-07-20 11:13:44 +120014072
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014074
Tony Barbour1fa09702017-03-16 12:09:08 -060014075 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14077
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014078 VkShaderModule module;
14079 VkShaderModuleCreateInfo moduleCreateInfo;
14080 struct icd_spv_header spv;
14081
14082 spv.magic = ICD_SPV_MAGIC;
14083 spv.version = ICD_SPV_VERSION;
14084 spv.gen_magic = 0;
14085
14086 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14087 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014088 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014089 moduleCreateInfo.codeSize = 4;
14090 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014091 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014092
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014093 m_errorMonitor->VerifyFound();
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014094
14095 char const *vsSource =
14096 "#version 450\n"
14097 "\n"
14098 "layout(location=0) out float x;\n"
14099 "out gl_PerVertex {\n"
14100 " vec4 gl_Position;\n"
14101 "};\n"
14102 "void main(){\n"
14103 " gl_Position = vec4(1);\n"
14104 " x = 0;\n"
14105 "}\n";
14106
14107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02816);
14108 std::vector<unsigned int> shader;
14109 VkShaderModuleCreateInfo module_create_info;
14110 VkShaderModule shader_module;
14111 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14112 module_create_info.pNext = NULL;
14113 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, shader);
14114 module_create_info.pCode = shader.data();
14115 // Introduce failure by making codeSize a non-multiple of 4
14116 module_create_info.codeSize = shader.size() * sizeof(unsigned int) - 1;
14117 module_create_info.flags = 0;
14118 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
14119
14120 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014121}
14122
Karl Schultz6addd812016-02-02 17:17:23 -070014123TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014124 TEST_DESCRIPTION(
14125 "Test that an error is produced for a spirv module "
14126 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120014127
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014129
Tony Barbour1fa09702017-03-16 12:09:08 -060014130 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014131 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14132
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014133 VkShaderModule module;
14134 VkShaderModuleCreateInfo moduleCreateInfo;
14135 struct icd_spv_header spv;
14136
14137 spv.magic = ~ICD_SPV_MAGIC;
14138 spv.version = ICD_SPV_VERSION;
14139 spv.gen_magic = 0;
14140
14141 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14142 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014143 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014144 moduleCreateInfo.codeSize = sizeof(spv) + 16;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014145 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014146 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014147
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014148 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014149}
14150
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014151#if 0
14152// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070014153TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014155 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014156
Tony Barbour1fa09702017-03-16 12:09:08 -060014157 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014158 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14159
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014160 VkShaderModule module;
14161 VkShaderModuleCreateInfo moduleCreateInfo;
14162 struct icd_spv_header spv;
14163
14164 spv.magic = ICD_SPV_MAGIC;
14165 spv.version = ~ICD_SPV_VERSION;
14166 spv.gen_magic = 0;
14167
14168 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14169 moduleCreateInfo.pNext = NULL;
14170
Karl Schultz6addd812016-02-02 17:17:23 -070014171 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014172 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14173 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014174 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014175
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014176 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014177}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014178#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014179
Karl Schultz6addd812016-02-02 17:17:23 -070014180TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014181 TEST_DESCRIPTION(
14182 "Test that a warning is produced for a vertex output that "
14183 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014185
Tony Barbour1fa09702017-03-16 12:09:08 -060014186 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014187 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014188
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014189 char const *vsSource =
14190 "#version 450\n"
14191 "\n"
14192 "layout(location=0) out float x;\n"
14193 "out gl_PerVertex {\n"
14194 " vec4 gl_Position;\n"
14195 "};\n"
14196 "void main(){\n"
14197 " gl_Position = vec4(1);\n"
14198 " x = 0;\n"
14199 "}\n";
14200 char const *fsSource =
14201 "#version 450\n"
14202 "\n"
14203 "layout(location=0) out vec4 color;\n"
14204 "void main(){\n"
14205 " color = vec4(1);\n"
14206 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120014207
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014208 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14209 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014210
14211 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014212 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014213 pipe.AddShader(&vs);
14214 pipe.AddShader(&fs);
14215
Chris Forbes9f7ff632015-05-25 11:13:08 +120014216 VkDescriptorSetObj descriptorSet(m_device);
14217 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014218 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014219
Tony Barbour5781e8f2015-08-04 16:23:11 -060014220 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014221
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014222 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014223}
Chris Forbes9f7ff632015-05-25 11:13:08 +120014224
Mark Mueller098c9cb2016-09-08 09:01:57 -060014225TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
14226 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14227
Tony Barbour1fa09702017-03-16 12:09:08 -060014228 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014229 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14230
14231 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014232 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014233
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014234 char const *vsSource =
14235 "#version 450\n"
14236 "\n"
14237 "out gl_PerVertex {\n"
14238 " vec4 gl_Position;\n"
14239 "};\n"
14240 "void main(){\n"
14241 " gl_Position = vec4(1);\n"
14242 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014243
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014244 char const *fsSource =
14245 "#version 450\n"
14246 "\n"
14247 "layout (constant_id = 0) const float r = 0.0f;\n"
14248 "layout(location = 0) out vec4 uFragColor;\n"
14249 "void main(){\n"
14250 " uFragColor = vec4(r,1,0,1);\n"
14251 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014252
14253 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14254 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14255
14256 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14257 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14258
14259 VkPipelineLayout pipeline_layout;
14260 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14261
14262 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
14263 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14264 vp_state_create_info.viewportCount = 1;
14265 VkViewport viewport = {};
14266 vp_state_create_info.pViewports = &viewport;
14267 vp_state_create_info.scissorCount = 1;
14268 VkRect2D scissors = {};
14269 vp_state_create_info.pScissors = &scissors;
14270
14271 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
14272
14273 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
14274 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
14275 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
14276 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
14277
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014278 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060014279
14280 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
14281 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14282
14283 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
14284 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14285 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14286
14287 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
14288 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
14289 rasterization_state_create_info.pNext = nullptr;
14290 rasterization_state_create_info.lineWidth = 1.0f;
14291 rasterization_state_create_info.rasterizerDiscardEnable = true;
14292
14293 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
14294 color_blend_attachment_state.blendEnable = VK_FALSE;
14295 color_blend_attachment_state.colorWriteMask = 0xf;
14296
14297 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
14298 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14299 color_blend_state_create_info.attachmentCount = 1;
14300 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
14301
14302 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
14303 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14304 graphicspipe_create_info.stageCount = 2;
14305 graphicspipe_create_info.pStages = shader_stage_create_info;
14306 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
14307 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
14308 graphicspipe_create_info.pViewportState = &vp_state_create_info;
14309 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
14310 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
14311 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
14312 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14313 graphicspipe_create_info.layout = pipeline_layout;
14314 graphicspipe_create_info.renderPass = renderPass();
14315
14316 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
14317 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14318
14319 VkPipelineCache pipelineCache;
14320 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
14321
14322 // This structure maps constant ids to data locations.
14323 const VkSpecializationMapEntry entry =
14324 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014325 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014326
14327 uint32_t data = 1;
14328
14329 // Set up the info describing spec map and data
14330 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014331 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060014332 };
14333 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
14334
14335 VkPipeline pipeline;
14336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
14337 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
14338 m_errorMonitor->VerifyFound();
14339
14340 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
14341 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14342}
14343
14344TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
14345 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14346
Tony Barbour1fa09702017-03-16 12:09:08 -060014347 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14349
14350 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
14351
14352 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
14353 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14354 descriptor_pool_type_count[0].descriptorCount = 1;
14355 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14356 descriptor_pool_type_count[1].descriptorCount = 1;
14357
14358 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14359 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14360 descriptor_pool_create_info.maxSets = 1;
14361 descriptor_pool_create_info.poolSizeCount = 2;
14362 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
14363 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14364
14365 VkDescriptorPool descriptorset_pool;
14366 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14367
14368 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14369 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14370 descriptorset_layout_binding.descriptorCount = 1;
14371 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070014372 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014373
14374 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14375 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14376 descriptorset_layout_create_info.bindingCount = 1;
14377 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14378
14379 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014380 ASSERT_VK_SUCCESS(
14381 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014382
14383 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14384 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14385 descriptorset_allocate_info.descriptorSetCount = 1;
14386 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14387 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14388 VkDescriptorSet descriptorset;
14389 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14390
14391 // Challenge core_validation with a non uniform buffer type.
14392 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
14393
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014394 char const *vsSource =
14395 "#version 450\n"
14396 "\n"
14397 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14398 " mat4 mvp;\n"
14399 "} ubuf;\n"
14400 "out gl_PerVertex {\n"
14401 " vec4 gl_Position;\n"
14402 "};\n"
14403 "void main(){\n"
14404 " gl_Position = ubuf.mvp * vec4(1);\n"
14405 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014406
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014407 char const *fsSource =
14408 "#version 450\n"
14409 "\n"
14410 "layout(location = 0) out vec4 uFragColor;\n"
14411 "void main(){\n"
14412 " uFragColor = vec4(0,1,0,1);\n"
14413 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014414
14415 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14416 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14417
14418 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14419 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14420 pipeline_layout_create_info.setLayoutCount = 1;
14421 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14422
14423 VkPipelineLayout pipeline_layout;
14424 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14425
14426 VkPipelineObj pipe(m_device);
14427 pipe.AddColorAttachment();
14428 pipe.AddShader(&vs);
14429 pipe.AddShader(&fs);
14430
14431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
14432 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14433 m_errorMonitor->VerifyFound();
14434
14435 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14436 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14437 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14438}
14439
14440TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
14441 TEST_DESCRIPTION(
14442 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
14443
Tony Barbour1fa09702017-03-16 12:09:08 -060014444 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14446
14447 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
14448
14449 VkDescriptorPoolSize descriptor_pool_type_count = {};
14450 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14451 descriptor_pool_type_count.descriptorCount = 1;
14452
14453 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14454 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14455 descriptor_pool_create_info.maxSets = 1;
14456 descriptor_pool_create_info.poolSizeCount = 1;
14457 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
14458 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14459
14460 VkDescriptorPool descriptorset_pool;
14461 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14462
14463 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14464 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14465 descriptorset_layout_binding.descriptorCount = 1;
14466 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
14467 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070014468 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014469
14470 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14471 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14472 descriptorset_layout_create_info.bindingCount = 1;
14473 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14474
14475 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014476 ASSERT_VK_SUCCESS(
14477 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014478
14479 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14480 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14481 descriptorset_allocate_info.descriptorSetCount = 1;
14482 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14483 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14484 VkDescriptorSet descriptorset;
14485 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14486
14487 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14488
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014489 char const *vsSource =
14490 "#version 450\n"
14491 "\n"
14492 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14493 " mat4 mvp;\n"
14494 "} ubuf;\n"
14495 "out gl_PerVertex {\n"
14496 " vec4 gl_Position;\n"
14497 "};\n"
14498 "void main(){\n"
14499 " gl_Position = ubuf.mvp * vec4(1);\n"
14500 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014501
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014502 char const *fsSource =
14503 "#version 450\n"
14504 "\n"
14505 "layout(location = 0) out vec4 uFragColor;\n"
14506 "void main(){\n"
14507 " uFragColor = vec4(0,1,0,1);\n"
14508 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014509
14510 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14511 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14512
14513 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14514 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14515 pipeline_layout_create_info.setLayoutCount = 1;
14516 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14517
14518 VkPipelineLayout pipeline_layout;
14519 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14520
14521 VkPipelineObj pipe(m_device);
14522 pipe.AddColorAttachment();
14523 pipe.AddShader(&vs);
14524 pipe.AddShader(&fs);
14525
14526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14527 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14528 m_errorMonitor->VerifyFound();
14529
14530 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14531 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14532 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14533}
14534
14535TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014536 TEST_DESCRIPTION(
14537 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14538 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014539
Tony Barbour1fa09702017-03-16 12:09:08 -060014540 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14542
14543 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014544 "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 -060014545
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014546 char const *vsSource =
14547 "#version 450\n"
14548 "\n"
14549 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14550 "out gl_PerVertex {\n"
14551 " vec4 gl_Position;\n"
14552 "};\n"
14553 "void main(){\n"
14554 " gl_Position = vec4(consts.x);\n"
14555 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014556
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014557 char const *fsSource =
14558 "#version 450\n"
14559 "\n"
14560 "layout(location = 0) out vec4 uFragColor;\n"
14561 "void main(){\n"
14562 " uFragColor = vec4(0,1,0,1);\n"
14563 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014564
14565 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14566 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14567
14568 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14569 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14570
14571 // Set up a push constant range
14572 VkPushConstantRange push_constant_ranges = {};
14573 // Set to the wrong stage to challenge core_validation
14574 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14575 push_constant_ranges.size = 4;
14576
14577 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14578 pipeline_layout_create_info.pushConstantRangeCount = 1;
14579
14580 VkPipelineLayout pipeline_layout;
14581 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14582
14583 VkPipelineObj pipe(m_device);
14584 pipe.AddColorAttachment();
14585 pipe.AddShader(&vs);
14586 pipe.AddShader(&fs);
14587
14588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14589 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14590 m_errorMonitor->VerifyFound();
14591
14592 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14593}
14594
14595TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14596 TEST_DESCRIPTION(
14597 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14598
Tony Barbour1fa09702017-03-16 12:09:08 -060014599 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014600 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14601
14602 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014603 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014604
14605 // Some awkward steps are required to test with custom device features.
14606 std::vector<const char *> device_extension_names;
14607 auto features = m_device->phy().features();
14608 // Disable support for 64 bit floats
14609 features.shaderFloat64 = false;
14610 // The sacrificial device object
14611 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14612
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014613 char const *vsSource =
14614 "#version 450\n"
14615 "\n"
14616 "out gl_PerVertex {\n"
14617 " vec4 gl_Position;\n"
14618 "};\n"
14619 "void main(){\n"
14620 " gl_Position = vec4(1);\n"
14621 "}\n";
14622 char const *fsSource =
14623 "#version 450\n"
14624 "\n"
14625 "layout(location=0) out vec4 color;\n"
14626 "void main(){\n"
14627 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14628 " color = vec4(green);\n"
14629 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014630
14631 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14632 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14633
14634 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014635
14636 VkPipelineObj pipe(&test_device);
14637 pipe.AddColorAttachment();
14638 pipe.AddShader(&vs);
14639 pipe.AddShader(&fs);
14640
14641 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14642 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14643 VkPipelineLayout pipeline_layout;
14644 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14645
14646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14647 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14648 m_errorMonitor->VerifyFound();
14649
14650 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14651}
14652
Mark Lobodzinski20832822017-03-24 14:49:45 -060014653TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14654 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14655 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014656
Tony Barbour1fa09702017-03-16 12:09:08 -060014657 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14659
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014660 char const *vsSource =
14661 "#version 450\n"
14662 "\n"
14663 "out gl_PerVertex {\n"
14664 " vec4 gl_Position;\n"
14665 "};\n"
14666 "layout(xfb_buffer = 1) out;"
14667 "void main(){\n"
14668 " gl_Position = vec4(1);\n"
14669 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014670
Mark Lobodzinski20832822017-03-24 14:49:45 -060014671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014672
Mark Lobodzinski20832822017-03-24 14:49:45 -060014673 std::vector<unsigned int> spv;
14674 VkShaderModuleCreateInfo module_create_info;
14675 VkShaderModule shader_module;
14676 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14677 module_create_info.pNext = NULL;
14678 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14679 module_create_info.pCode = spv.data();
14680 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14681 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014682
Mark Lobodzinski20832822017-03-24 14:49:45 -060014683 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014684
Mark Lobodzinski20832822017-03-24 14:49:45 -060014685 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014686}
14687
Karl Schultz6addd812016-02-02 17:17:23 -070014688TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014689 TEST_DESCRIPTION(
14690 "Test that an error is produced for a fragment shader input "
14691 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014692
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014694
Tony Barbour1fa09702017-03-16 12:09:08 -060014695 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014696 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014697
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014698 char const *vsSource =
14699 "#version 450\n"
14700 "\n"
14701 "out gl_PerVertex {\n"
14702 " vec4 gl_Position;\n"
14703 "};\n"
14704 "void main(){\n"
14705 " gl_Position = vec4(1);\n"
14706 "}\n";
14707 char const *fsSource =
14708 "#version 450\n"
14709 "\n"
14710 "layout(location=0) in float x;\n"
14711 "layout(location=0) out vec4 color;\n"
14712 "void main(){\n"
14713 " color = vec4(x);\n"
14714 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014715
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014716 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14717 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014718
14719 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014720 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014721 pipe.AddShader(&vs);
14722 pipe.AddShader(&fs);
14723
Chris Forbes59cb88d2015-05-25 11:13:13 +120014724 VkDescriptorSetObj descriptorSet(m_device);
14725 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014726 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014727
Tony Barbour5781e8f2015-08-04 16:23:11 -060014728 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014729
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014730 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014731}
14732
Karl Schultz6addd812016-02-02 17:17:23 -070014733TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014734 TEST_DESCRIPTION(
14735 "Test that an error is produced for a fragment shader input "
14736 "within an interace block, which is not present in the outputs "
14737 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014739
Tony Barbour1fa09702017-03-16 12:09:08 -060014740 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014741 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14742
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014743 char const *vsSource =
14744 "#version 450\n"
14745 "\n"
14746 "out gl_PerVertex {\n"
14747 " vec4 gl_Position;\n"
14748 "};\n"
14749 "void main(){\n"
14750 " gl_Position = vec4(1);\n"
14751 "}\n";
14752 char const *fsSource =
14753 "#version 450\n"
14754 "\n"
14755 "in block { layout(location=0) float x; } ins;\n"
14756 "layout(location=0) out vec4 color;\n"
14757 "void main(){\n"
14758 " color = vec4(ins.x);\n"
14759 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014760
14761 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14762 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14763
14764 VkPipelineObj pipe(m_device);
14765 pipe.AddColorAttachment();
14766 pipe.AddShader(&vs);
14767 pipe.AddShader(&fs);
14768
14769 VkDescriptorSetObj descriptorSet(m_device);
14770 descriptorSet.AppendDummy();
14771 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14772
14773 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14774
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014775 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014776}
14777
Karl Schultz6addd812016-02-02 17:17:23 -070014778TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014779 TEST_DESCRIPTION(
14780 "Test that an error is produced for mismatched array sizes "
14781 "across the vertex->fragment shader interface");
14782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14783 "Type mismatch on location 0.0: 'ptr to "
14784 "output arr[2] of float32' vs 'ptr to "
14785 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014786
Tony Barbour1fa09702017-03-16 12:09:08 -060014787 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14789
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014790 char const *vsSource =
14791 "#version 450\n"
14792 "\n"
14793 "layout(location=0) out float x[2];\n"
14794 "out gl_PerVertex {\n"
14795 " vec4 gl_Position;\n"
14796 "};\n"
14797 "void main(){\n"
14798 " x[0] = 0; x[1] = 0;\n"
14799 " gl_Position = vec4(1);\n"
14800 "}\n";
14801 char const *fsSource =
14802 "#version 450\n"
14803 "\n"
14804 "layout(location=0) in float x[1];\n"
14805 "layout(location=0) out vec4 color;\n"
14806 "void main(){\n"
14807 " color = vec4(x[0]);\n"
14808 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014809
14810 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14811 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14812
14813 VkPipelineObj pipe(m_device);
14814 pipe.AddColorAttachment();
14815 pipe.AddShader(&vs);
14816 pipe.AddShader(&fs);
14817
14818 VkDescriptorSetObj descriptorSet(m_device);
14819 descriptorSet.AppendDummy();
14820 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14821
14822 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14823
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014824 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014825}
14826
Karl Schultz6addd812016-02-02 17:17:23 -070014827TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014828 TEST_DESCRIPTION(
14829 "Test that an error is produced for mismatched types across "
14830 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014832
Tony Barbour1fa09702017-03-16 12:09:08 -060014833 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014835
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014836 char const *vsSource =
14837 "#version 450\n"
14838 "\n"
14839 "layout(location=0) out int x;\n"
14840 "out gl_PerVertex {\n"
14841 " vec4 gl_Position;\n"
14842 "};\n"
14843 "void main(){\n"
14844 " x = 0;\n"
14845 " gl_Position = vec4(1);\n"
14846 "}\n";
14847 char const *fsSource =
14848 "#version 450\n"
14849 "\n"
14850 "layout(location=0) in float x;\n" /* VS writes int */
14851 "layout(location=0) out vec4 color;\n"
14852 "void main(){\n"
14853 " color = vec4(x);\n"
14854 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014855
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014856 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14857 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014858
14859 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014860 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014861 pipe.AddShader(&vs);
14862 pipe.AddShader(&fs);
14863
Chris Forbesb56af562015-05-25 11:13:17 +120014864 VkDescriptorSetObj descriptorSet(m_device);
14865 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014866 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014867
Tony Barbour5781e8f2015-08-04 16:23:11 -060014868 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014869
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014870 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014871}
14872
Karl Schultz6addd812016-02-02 17:17:23 -070014873TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014874 TEST_DESCRIPTION(
14875 "Test that an error is produced for mismatched types across "
14876 "the vertex->fragment shader interface, when the variable is contained within "
14877 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014879
Tony Barbour1fa09702017-03-16 12:09:08 -060014880 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14882
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014883 char const *vsSource =
14884 "#version 450\n"
14885 "\n"
14886 "out block { layout(location=0) int x; } outs;\n"
14887 "out gl_PerVertex {\n"
14888 " vec4 gl_Position;\n"
14889 "};\n"
14890 "void main(){\n"
14891 " outs.x = 0;\n"
14892 " gl_Position = vec4(1);\n"
14893 "}\n";
14894 char const *fsSource =
14895 "#version 450\n"
14896 "\n"
14897 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14898 "layout(location=0) out vec4 color;\n"
14899 "void main(){\n"
14900 " color = vec4(ins.x);\n"
14901 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014902
14903 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14904 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14905
14906 VkPipelineObj pipe(m_device);
14907 pipe.AddColorAttachment();
14908 pipe.AddShader(&vs);
14909 pipe.AddShader(&fs);
14910
14911 VkDescriptorSetObj descriptorSet(m_device);
14912 descriptorSet.AppendDummy();
14913 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14914
14915 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14916
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014917 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014918}
14919
14920TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014921 TEST_DESCRIPTION(
14922 "Test that an error is produced for location mismatches across "
14923 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14924 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014925 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 +130014926
Tony Barbour1fa09702017-03-16 12:09:08 -060014927 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14929
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014930 char const *vsSource =
14931 "#version 450\n"
14932 "\n"
14933 "out block { layout(location=1) float x; } outs;\n"
14934 "out gl_PerVertex {\n"
14935 " vec4 gl_Position;\n"
14936 "};\n"
14937 "void main(){\n"
14938 " outs.x = 0;\n"
14939 " gl_Position = vec4(1);\n"
14940 "}\n";
14941 char const *fsSource =
14942 "#version 450\n"
14943 "\n"
14944 "in block { layout(location=0) float x; } ins;\n"
14945 "layout(location=0) out vec4 color;\n"
14946 "void main(){\n"
14947 " color = vec4(ins.x);\n"
14948 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014949
14950 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14951 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14952
14953 VkPipelineObj pipe(m_device);
14954 pipe.AddColorAttachment();
14955 pipe.AddShader(&vs);
14956 pipe.AddShader(&fs);
14957
14958 VkDescriptorSetObj descriptorSet(m_device);
14959 descriptorSet.AppendDummy();
14960 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14961
14962 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14963
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014964 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014965}
14966
14967TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014968 TEST_DESCRIPTION(
14969 "Test that an error is produced for component mismatches across the "
14970 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14971 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014972 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 +130014973
Tony Barbour1fa09702017-03-16 12:09:08 -060014974 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14976
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014977 char const *vsSource =
14978 "#version 450\n"
14979 "\n"
14980 "out block { layout(location=0, component=0) float x; } outs;\n"
14981 "out gl_PerVertex {\n"
14982 " vec4 gl_Position;\n"
14983 "};\n"
14984 "void main(){\n"
14985 " outs.x = 0;\n"
14986 " gl_Position = vec4(1);\n"
14987 "}\n";
14988 char const *fsSource =
14989 "#version 450\n"
14990 "\n"
14991 "in block { layout(location=0, component=1) float x; } ins;\n"
14992 "layout(location=0) out vec4 color;\n"
14993 "void main(){\n"
14994 " color = vec4(ins.x);\n"
14995 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014996
14997 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14998 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14999
15000 VkPipelineObj pipe(m_device);
15001 pipe.AddColorAttachment();
15002 pipe.AddShader(&vs);
15003 pipe.AddShader(&fs);
15004
15005 VkDescriptorSetObj descriptorSet(m_device);
15006 descriptorSet.AppendDummy();
15007 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15008
15009 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15010
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015011 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130015012}
15013
Chris Forbes1f3b0152016-11-30 12:48:40 +130015014TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
15015 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15016
Tony Barbour1fa09702017-03-16 12:09:08 -060015017 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130015018 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15019
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015020 char const *vsSource =
15021 "#version 450\n"
15022 "layout(location=0) out mediump float x;\n"
15023 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15024 char const *fsSource =
15025 "#version 450\n"
15026 "layout(location=0) in highp float x;\n"
15027 "layout(location=0) out vec4 color;\n"
15028 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130015029
15030 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15031 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15032
15033 VkPipelineObj pipe(m_device);
15034 pipe.AddColorAttachment();
15035 pipe.AddShader(&vs);
15036 pipe.AddShader(&fs);
15037
15038 VkDescriptorSetObj descriptorSet(m_device);
15039 descriptorSet.AppendDummy();
15040 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15041
15042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15043
15044 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15045
15046 m_errorMonitor->VerifyFound();
15047}
15048
Chris Forbes870a39e2016-11-30 12:55:56 +130015049TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
15050 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15051
Tony Barbour1fa09702017-03-16 12:09:08 -060015052 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130015053 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15054
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015055 char const *vsSource =
15056 "#version 450\n"
15057 "out block { layout(location=0) mediump float x; };\n"
15058 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15059 char const *fsSource =
15060 "#version 450\n"
15061 "in block { layout(location=0) highp float x; };\n"
15062 "layout(location=0) out vec4 color;\n"
15063 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130015064
15065 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15066 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15067
15068 VkPipelineObj pipe(m_device);
15069 pipe.AddColorAttachment();
15070 pipe.AddShader(&vs);
15071 pipe.AddShader(&fs);
15072
15073 VkDescriptorSetObj descriptorSet(m_device);
15074 descriptorSet.AppendDummy();
15075 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15076
15077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15078
15079 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15080
15081 m_errorMonitor->VerifyFound();
15082}
15083
Karl Schultz6addd812016-02-02 17:17:23 -070015084TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015085 TEST_DESCRIPTION(
15086 "Test that a warning is produced for a vertex attribute which is "
15087 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015089
Tony Barbour1fa09702017-03-16 12:09:08 -060015090 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120015092
15093 VkVertexInputBindingDescription input_binding;
15094 memset(&input_binding, 0, sizeof(input_binding));
15095
15096 VkVertexInputAttributeDescription input_attrib;
15097 memset(&input_attrib, 0, sizeof(input_attrib));
15098 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15099
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015100 char const *vsSource =
15101 "#version 450\n"
15102 "\n"
15103 "out gl_PerVertex {\n"
15104 " vec4 gl_Position;\n"
15105 "};\n"
15106 "void main(){\n"
15107 " gl_Position = vec4(1);\n"
15108 "}\n";
15109 char const *fsSource =
15110 "#version 450\n"
15111 "\n"
15112 "layout(location=0) out vec4 color;\n"
15113 "void main(){\n"
15114 " color = vec4(1);\n"
15115 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120015116
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015117 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15118 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120015119
15120 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015121 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120015122 pipe.AddShader(&vs);
15123 pipe.AddShader(&fs);
15124
15125 pipe.AddVertexInputBindings(&input_binding, 1);
15126 pipe.AddVertexInputAttribs(&input_attrib, 1);
15127
Chris Forbesde136e02015-05-25 11:13:28 +120015128 VkDescriptorSetObj descriptorSet(m_device);
15129 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015130 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120015131
Tony Barbour5781e8f2015-08-04 16:23:11 -060015132 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120015133
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015134 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120015135}
15136
Karl Schultz6addd812016-02-02 17:17:23 -070015137TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015138 TEST_DESCRIPTION(
15139 "Test that a warning is produced for a location mismatch on "
15140 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015142
Tony Barbour1fa09702017-03-16 12:09:08 -060015143 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130015144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15145
15146 VkVertexInputBindingDescription input_binding;
15147 memset(&input_binding, 0, sizeof(input_binding));
15148
15149 VkVertexInputAttributeDescription input_attrib;
15150 memset(&input_attrib, 0, sizeof(input_attrib));
15151 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15152
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015153 char const *vsSource =
15154 "#version 450\n"
15155 "\n"
15156 "layout(location=1) in float x;\n"
15157 "out gl_PerVertex {\n"
15158 " vec4 gl_Position;\n"
15159 "};\n"
15160 "void main(){\n"
15161 " gl_Position = vec4(x);\n"
15162 "}\n";
15163 char const *fsSource =
15164 "#version 450\n"
15165 "\n"
15166 "layout(location=0) out vec4 color;\n"
15167 "void main(){\n"
15168 " color = vec4(1);\n"
15169 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130015170
15171 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15172 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15173
15174 VkPipelineObj pipe(m_device);
15175 pipe.AddColorAttachment();
15176 pipe.AddShader(&vs);
15177 pipe.AddShader(&fs);
15178
15179 pipe.AddVertexInputBindings(&input_binding, 1);
15180 pipe.AddVertexInputAttribs(&input_attrib, 1);
15181
15182 VkDescriptorSetObj descriptorSet(m_device);
15183 descriptorSet.AppendDummy();
15184 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15185
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015186 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015187 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15188
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015189 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130015190}
15191
Karl Schultz6addd812016-02-02 17:17:23 -070015192TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015193 TEST_DESCRIPTION(
15194 "Test that an error is produced for a vertex shader input which is not "
15195 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15197 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015198
Tony Barbour1fa09702017-03-16 12:09:08 -060015199 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120015201
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015202 char const *vsSource =
15203 "#version 450\n"
15204 "\n"
15205 "layout(location=0) in vec4 x;\n" /* not provided */
15206 "out gl_PerVertex {\n"
15207 " vec4 gl_Position;\n"
15208 "};\n"
15209 "void main(){\n"
15210 " gl_Position = x;\n"
15211 "}\n";
15212 char const *fsSource =
15213 "#version 450\n"
15214 "\n"
15215 "layout(location=0) out vec4 color;\n"
15216 "void main(){\n"
15217 " color = vec4(1);\n"
15218 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120015219
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015220 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15221 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120015222
15223 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015224 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120015225 pipe.AddShader(&vs);
15226 pipe.AddShader(&fs);
15227
Chris Forbes62e8e502015-05-25 11:13:29 +120015228 VkDescriptorSetObj descriptorSet(m_device);
15229 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015230 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120015231
Tony Barbour5781e8f2015-08-04 16:23:11 -060015232 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120015233
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015234 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120015235}
15236
Karl Schultz6addd812016-02-02 17:17:23 -070015237TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015238 TEST_DESCRIPTION(
15239 "Test that an error is produced for a mismatch between the "
15240 "fundamental type (float/int/uint) of an attribute and the "
15241 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015242 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 -060015243
Tony Barbour1fa09702017-03-16 12:09:08 -060015244 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015245 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015246
15247 VkVertexInputBindingDescription input_binding;
15248 memset(&input_binding, 0, sizeof(input_binding));
15249
15250 VkVertexInputAttributeDescription input_attrib;
15251 memset(&input_attrib, 0, sizeof(input_attrib));
15252 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15253
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015254 char const *vsSource =
15255 "#version 450\n"
15256 "\n"
15257 "layout(location=0) in int x;\n" /* attrib provided float */
15258 "out gl_PerVertex {\n"
15259 " vec4 gl_Position;\n"
15260 "};\n"
15261 "void main(){\n"
15262 " gl_Position = vec4(x);\n"
15263 "}\n";
15264 char const *fsSource =
15265 "#version 450\n"
15266 "\n"
15267 "layout(location=0) out vec4 color;\n"
15268 "void main(){\n"
15269 " color = vec4(1);\n"
15270 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120015271
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015272 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15273 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015274
15275 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015276 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015277 pipe.AddShader(&vs);
15278 pipe.AddShader(&fs);
15279
15280 pipe.AddVertexInputBindings(&input_binding, 1);
15281 pipe.AddVertexInputAttribs(&input_attrib, 1);
15282
Chris Forbesc97d98e2015-05-25 11:13:31 +120015283 VkDescriptorSetObj descriptorSet(m_device);
15284 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015285 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015286
Tony Barbour5781e8f2015-08-04 16:23:11 -060015287 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015288
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015289 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015290}
15291
Chris Forbesc68b43c2016-04-06 11:18:47 +120015292TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015293 TEST_DESCRIPTION(
15294 "Test that an error is produced for a pipeline containing multiple "
15295 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15297 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120015298
Tony Barbour1fa09702017-03-16 12:09:08 -060015299 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120015300 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15301
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015302 char const *vsSource =
15303 "#version 450\n"
15304 "\n"
15305 "out gl_PerVertex {\n"
15306 " vec4 gl_Position;\n"
15307 "};\n"
15308 "void main(){\n"
15309 " gl_Position = vec4(1);\n"
15310 "}\n";
15311 char const *fsSource =
15312 "#version 450\n"
15313 "\n"
15314 "layout(location=0) out vec4 color;\n"
15315 "void main(){\n"
15316 " color = vec4(1);\n"
15317 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120015318
15319 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15320 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15321
15322 VkPipelineObj pipe(m_device);
15323 pipe.AddColorAttachment();
15324 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015325 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120015326 pipe.AddShader(&fs);
15327
15328 VkDescriptorSetObj descriptorSet(m_device);
15329 descriptorSet.AppendDummy();
15330 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15331
15332 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15333
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015334 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120015335}
15336
Chris Forbes82ff92a2016-09-09 10:50:24 +120015337TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120015339
Tony Barbour1fa09702017-03-16 12:09:08 -060015340 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120015341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15342
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015343 char const *vsSource =
15344 "#version 450\n"
15345 "out gl_PerVertex {\n"
15346 " vec4 gl_Position;\n"
15347 "};\n"
15348 "void main(){\n"
15349 " gl_Position = vec4(0);\n"
15350 "}\n";
15351 char const *fsSource =
15352 "#version 450\n"
15353 "\n"
15354 "layout(location=0) out vec4 color;\n"
15355 "void main(){\n"
15356 " color = vec4(1);\n"
15357 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120015358
15359 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15360 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
15361
15362 VkPipelineObj pipe(m_device);
15363 pipe.AddColorAttachment();
15364 pipe.AddShader(&vs);
15365 pipe.AddShader(&fs);
15366
15367 VkDescriptorSetObj descriptorSet(m_device);
15368 descriptorSet.AppendDummy();
15369 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15370
15371 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15372
15373 m_errorMonitor->VerifyFound();
15374}
15375
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015376TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15378 "pDepthStencilState is NULL when rasterization is enabled and subpass "
15379 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015380
Tony Barbour1fa09702017-03-16 12:09:08 -060015381 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15383
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015384 char const *vsSource =
15385 "#version 450\n"
15386 "void main(){ gl_Position = vec4(0); }\n";
15387 char const *fsSource =
15388 "#version 450\n"
15389 "\n"
15390 "layout(location=0) out vec4 color;\n"
15391 "void main(){\n"
15392 " color = vec4(1);\n"
15393 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015394
15395 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15396 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15397
15398 VkPipelineObj pipe(m_device);
15399 pipe.AddColorAttachment();
15400 pipe.AddShader(&vs);
15401 pipe.AddShader(&fs);
15402
15403 VkDescriptorSetObj descriptorSet(m_device);
15404 descriptorSet.AppendDummy();
15405 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15406
15407 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015408 {
15409 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15410 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15411 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015412 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015413 {
15414 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15415 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15416 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015417 },
15418 };
15419 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015420 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015421 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015422 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
15423 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015424 VkRenderPass rp;
15425 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15426 ASSERT_VK_SUCCESS(err);
15427
15428 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
15429
15430 m_errorMonitor->VerifyFound();
15431
15432 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15433}
15434
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015435TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015436 TEST_DESCRIPTION(
15437 "Test that an error is produced for a variable output from "
15438 "the TCS without the patch decoration, but consumed in the TES "
15439 "with the decoration.");
15440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15441 "is per-vertex in tessellation control shader stage "
15442 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120015443
Tony Barbour1fa09702017-03-16 12:09:08 -060015444 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120015445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15446
Chris Forbesc1e852d2016-04-04 19:26:42 +120015447 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070015448 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120015449 return;
15450 }
15451
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015452 char const *vsSource =
15453 "#version 450\n"
15454 "void main(){}\n";
15455 char const *tcsSource =
15456 "#version 450\n"
15457 "layout(location=0) out int x[];\n"
15458 "layout(vertices=3) out;\n"
15459 "void main(){\n"
15460 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15461 " gl_TessLevelInner[0] = 1;\n"
15462 " x[gl_InvocationID] = gl_InvocationID;\n"
15463 "}\n";
15464 char const *tesSource =
15465 "#version 450\n"
15466 "layout(triangles, equal_spacing, cw) in;\n"
15467 "layout(location=0) patch in int x;\n"
15468 "out gl_PerVertex { vec4 gl_Position; };\n"
15469 "void main(){\n"
15470 " gl_Position.xyz = gl_TessCoord;\n"
15471 " gl_Position.w = x;\n"
15472 "}\n";
15473 char const *fsSource =
15474 "#version 450\n"
15475 "layout(location=0) out vec4 color;\n"
15476 "void main(){\n"
15477 " color = vec4(1);\n"
15478 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015479
15480 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15481 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15482 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15484
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015485 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15486 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015487
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015488 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015489
15490 VkPipelineObj pipe(m_device);
15491 pipe.SetInputAssembly(&iasci);
15492 pipe.SetTessellation(&tsci);
15493 pipe.AddColorAttachment();
15494 pipe.AddShader(&vs);
15495 pipe.AddShader(&tcs);
15496 pipe.AddShader(&tes);
15497 pipe.AddShader(&fs);
15498
15499 VkDescriptorSetObj descriptorSet(m_device);
15500 descriptorSet.AppendDummy();
15501 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15502
15503 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15504
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015505 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015506}
15507
Cort Stratton2bcca1b2017-05-05 16:02:35 -070015508TEST_F(VkLayerTest, CreatePipelineTessErrors) {
15509 TEST_DESCRIPTION("Test various errors when creating a graphics pipeline with tessellation stages active.");
15510
15511 ASSERT_NO_FATAL_FAILURE(Init());
15512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15513
15514 if (!m_device->phy().features().tessellationShader) {
15515 printf(" Device does not support tessellation shaders; skipped.\n");
15516 return;
15517 }
15518
15519 char const *vsSource =
15520 "#version 450\n"
15521 "void main(){}\n";
15522 char const *tcsSource =
15523 "#version 450\n"
15524 "layout(vertices=3) out;\n"
15525 "void main(){\n"
15526 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15527 " gl_TessLevelInner[0] = 1;\n"
15528 "}\n";
15529 char const *tesSource =
15530 "#version 450\n"
15531 "layout(triangles, equal_spacing, cw) in;\n"
15532 "out gl_PerVertex { vec4 gl_Position; };\n"
15533 "void main(){\n"
15534 " gl_Position.xyz = gl_TessCoord;\n"
15535 " gl_Position.w = 0;\n"
15536 "}\n";
15537 char const *fsSource =
15538 "#version 450\n"
15539 "layout(location=0) out vec4 color;\n"
15540 "void main(){\n"
15541 " color = vec4(1);\n"
15542 "}\n";
15543
15544 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15545 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15546 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15547 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15548
15549 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15550 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
15551
15552 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
15553
15554 VkDescriptorSetObj descriptorSet(m_device);
15555 descriptorSet.AppendDummy();
15556 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15557
15558 {
15559 VkPipelineObj pipe(m_device);
15560 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15561 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15562 pipe.SetInputAssembly(&iasci_bad);
15563 pipe.AddColorAttachment();
15564 pipe.AddShader(&vs);
15565 pipe.AddShader(&fs);
15566
15567 // Pass a tess control shader without a tess eval shader
15568 pipe.AddShader(&tcs);
15569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00534);
15570 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15571 m_errorMonitor->VerifyFound();
15572 }
15573
15574 {
15575 VkPipelineObj pipe(m_device);
15576 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15577 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15578 pipe.SetInputAssembly(&iasci_bad);
15579 pipe.AddColorAttachment();
15580 pipe.AddShader(&vs);
15581 pipe.AddShader(&fs);
15582
15583 // Pass a tess eval shader without a tess control shader
15584 pipe.AddShader(&tes);
15585 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00535);
15586 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15587 m_errorMonitor->VerifyFound();
15588 }
15589
15590 {
15591 VkPipelineObj pipe(m_device);
15592 pipe.SetInputAssembly(&iasci);
15593 pipe.AddColorAttachment();
15594 pipe.AddShader(&vs);
15595 pipe.AddShader(&fs);
15596
15597 // Pass patch topology without tessellation shaders
15598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02100);
15599 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15600 m_errorMonitor->VerifyFound();
15601
15602 pipe.AddShader(&tcs);
15603 pipe.AddShader(&tes);
15604 // Pass a NULL pTessellationState (with active tessellation shader stages)
15605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00536);
15606 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15607 m_errorMonitor->VerifyFound();
15608
15609 // Pass an invalid pTessellationState (bad sType)
15610 VkPipelineTessellationStateCreateInfo tsci_bad = tsci;
15611 tsci_bad.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
15612 pipe.SetTessellation(&tsci_bad);
15613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01427);
15614 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15615 m_errorMonitor->VerifyFound();
15616 // Pass out-of-range patchControlPoints
15617 tsci_bad = tsci;
15618 tsci_bad.patchControlPoints = 0;
15619 pipe.SetTessellation(&tsci);
15620 pipe.SetTessellation(&tsci_bad);
15621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15622 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15623 m_errorMonitor->VerifyFound();
15624 tsci_bad.patchControlPoints = m_device->props.limits.maxTessellationPatchSize + 1;
15625 pipe.SetTessellation(&tsci_bad);
15626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15627 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15628 m_errorMonitor->VerifyFound();
15629 pipe.SetTessellation(&tsci);
15630
15631 // Pass an invalid primitive topology
15632 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15633 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
15634 pipe.SetInputAssembly(&iasci_bad);
15635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02099);
15636 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15637 m_errorMonitor->VerifyFound();
15638 pipe.SetInputAssembly(&iasci);
15639 }
15640}
15641
Karl Schultz6addd812016-02-02 17:17:23 -070015642TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015643 TEST_DESCRIPTION(
15644 "Test that an error is produced for a vertex attribute setup where multiple "
15645 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15647 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015648
Tony Barbour1fa09702017-03-16 12:09:08 -060015649 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015650 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015651
15652 /* Two binding descriptions for binding 0 */
15653 VkVertexInputBindingDescription input_bindings[2];
15654 memset(input_bindings, 0, sizeof(input_bindings));
15655
15656 VkVertexInputAttributeDescription input_attrib;
15657 memset(&input_attrib, 0, sizeof(input_attrib));
15658 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15659
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015660 char const *vsSource =
15661 "#version 450\n"
15662 "\n"
15663 "layout(location=0) in float x;\n" /* attrib provided float */
15664 "out gl_PerVertex {\n"
15665 " vec4 gl_Position;\n"
15666 "};\n"
15667 "void main(){\n"
15668 " gl_Position = vec4(x);\n"
15669 "}\n";
15670 char const *fsSource =
15671 "#version 450\n"
15672 "\n"
15673 "layout(location=0) out vec4 color;\n"
15674 "void main(){\n"
15675 " color = vec4(1);\n"
15676 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015677
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015678 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15679 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015680
15681 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015682 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015683 pipe.AddShader(&vs);
15684 pipe.AddShader(&fs);
15685
15686 pipe.AddVertexInputBindings(input_bindings, 2);
15687 pipe.AddVertexInputAttribs(&input_attrib, 1);
15688
Chris Forbes280ba2c2015-06-12 11:16:41 +120015689 VkDescriptorSetObj descriptorSet(m_device);
15690 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015691 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015692
Tony Barbour5781e8f2015-08-04 16:23:11 -060015693 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015694
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015695 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015696}
Chris Forbes8f68b562015-05-25 11:13:32 +120015697
Karl Schultz6addd812016-02-02 17:17:23 -070015698TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015699 TEST_DESCRIPTION(
15700 "Test that an error is produced for a fragment shader which does not "
15701 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015703
Tony Barbour1fa09702017-03-16 12:09:08 -060015704 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015706 char const *vsSource =
15707 "#version 450\n"
15708 "\n"
15709 "out gl_PerVertex {\n"
15710 " vec4 gl_Position;\n"
15711 "};\n"
15712 "void main(){\n"
15713 " gl_Position = vec4(1);\n"
15714 "}\n";
15715 char const *fsSource =
15716 "#version 450\n"
15717 "\n"
15718 "void main(){\n"
15719 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015720
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015721 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15722 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015723
15724 VkPipelineObj pipe(m_device);
15725 pipe.AddShader(&vs);
15726 pipe.AddShader(&fs);
15727
Chia-I Wu08accc62015-07-07 11:50:03 +080015728 /* set up CB 0, not written */
15729 pipe.AddColorAttachment();
15730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015731
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015732 VkDescriptorSetObj descriptorSet(m_device);
15733 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015734 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015735
Tony Barbour5781e8f2015-08-04 16:23:11 -060015736 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015737
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015738 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015739}
15740
Karl Schultz6addd812016-02-02 17:17:23 -070015741TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015742 TEST_DESCRIPTION(
15743 "Test that a warning is produced for a fragment shader which provides a spurious "
15744 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015746 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015747
Tony Barbour1fa09702017-03-16 12:09:08 -060015748 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015749
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015750 char const *vsSource =
15751 "#version 450\n"
15752 "\n"
15753 "out gl_PerVertex {\n"
15754 " vec4 gl_Position;\n"
15755 "};\n"
15756 "void main(){\n"
15757 " gl_Position = vec4(1);\n"
15758 "}\n";
15759 char const *fsSource =
15760 "#version 450\n"
15761 "\n"
15762 "layout(location=0) out vec4 x;\n"
15763 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15764 "void main(){\n"
15765 " x = vec4(1);\n"
15766 " y = vec4(1);\n"
15767 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015768
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015769 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15770 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015771
15772 VkPipelineObj pipe(m_device);
15773 pipe.AddShader(&vs);
15774 pipe.AddShader(&fs);
15775
Chia-I Wu08accc62015-07-07 11:50:03 +080015776 /* set up CB 0, not written */
15777 pipe.AddColorAttachment();
15778 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015779 /* FS writes CB 1, but we don't configure it */
15780
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015781 VkDescriptorSetObj descriptorSet(m_device);
15782 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015783 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015784
Tony Barbour5781e8f2015-08-04 16:23:11 -060015785 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015786
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015787 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015788}
15789
Karl Schultz6addd812016-02-02 17:17:23 -070015790TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015791 TEST_DESCRIPTION(
15792 "Test that an error is produced for a mismatch between the fundamental "
15793 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015795
Tony Barbour1fa09702017-03-16 12:09:08 -060015796 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015797
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015798 char const *vsSource =
15799 "#version 450\n"
15800 "\n"
15801 "out gl_PerVertex {\n"
15802 " vec4 gl_Position;\n"
15803 "};\n"
15804 "void main(){\n"
15805 " gl_Position = vec4(1);\n"
15806 "}\n";
15807 char const *fsSource =
15808 "#version 450\n"
15809 "\n"
15810 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15811 "void main(){\n"
15812 " x = ivec4(1);\n"
15813 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015814
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015815 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15816 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015817
15818 VkPipelineObj pipe(m_device);
15819 pipe.AddShader(&vs);
15820 pipe.AddShader(&fs);
15821
Chia-I Wu08accc62015-07-07 11:50:03 +080015822 /* set up CB 0; type is UNORM by default */
15823 pipe.AddColorAttachment();
15824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015825
Chris Forbesa36d69e2015-05-25 11:13:44 +120015826 VkDescriptorSetObj descriptorSet(m_device);
15827 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015828 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015829
Tony Barbour5781e8f2015-08-04 16:23:11 -060015830 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015831
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015832 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015833}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015834
Karl Schultz6addd812016-02-02 17:17:23 -070015835TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015836 TEST_DESCRIPTION(
15837 "Test that an error is produced for a shader consuming a uniform "
15838 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015840
Tony Barbour1fa09702017-03-16 12:09:08 -060015841 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015842
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015843 char const *vsSource =
15844 "#version 450\n"
15845 "\n"
15846 "out gl_PerVertex {\n"
15847 " vec4 gl_Position;\n"
15848 "};\n"
15849 "void main(){\n"
15850 " gl_Position = vec4(1);\n"
15851 "}\n";
15852 char const *fsSource =
15853 "#version 450\n"
15854 "\n"
15855 "layout(location=0) out vec4 x;\n"
15856 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15857 "void main(){\n"
15858 " x = vec4(bar.y);\n"
15859 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015860
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015861 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15862 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015863
Chris Forbes556c76c2015-08-14 12:04:59 +120015864 VkPipelineObj pipe(m_device);
15865 pipe.AddShader(&vs);
15866 pipe.AddShader(&fs);
15867
15868 /* set up CB 0; type is UNORM by default */
15869 pipe.AddColorAttachment();
15870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15871
15872 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015873 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015874
15875 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15876
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015877 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015878}
15879
Chris Forbes5c59e902016-02-26 16:56:09 +130015880TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015881 TEST_DESCRIPTION(
15882 "Test that an error is produced for a shader consuming push constants "
15883 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015885
Tony Barbour1fa09702017-03-16 12:09:08 -060015886 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015887
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015888 char const *vsSource =
15889 "#version 450\n"
15890 "\n"
15891 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15892 "out gl_PerVertex {\n"
15893 " vec4 gl_Position;\n"
15894 "};\n"
15895 "void main(){\n"
15896 " gl_Position = vec4(consts.x);\n"
15897 "}\n";
15898 char const *fsSource =
15899 "#version 450\n"
15900 "\n"
15901 "layout(location=0) out vec4 x;\n"
15902 "void main(){\n"
15903 " x = vec4(1);\n"
15904 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015905
15906 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15907 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15908
15909 VkPipelineObj pipe(m_device);
15910 pipe.AddShader(&vs);
15911 pipe.AddShader(&fs);
15912
15913 /* set up CB 0; type is UNORM by default */
15914 pipe.AddColorAttachment();
15915 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15916
15917 VkDescriptorSetObj descriptorSet(m_device);
15918 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15919
15920 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15921
15922 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015923 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015924}
15925
Chris Forbes3fb17902016-08-22 14:57:55 +120015926TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015927 TEST_DESCRIPTION(
15928 "Test that an error is produced for a shader consuming an input attachment "
15929 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15931 "consumes input attachment index 0 but not provided in subpass");
15932
Tony Barbour1fa09702017-03-16 12:09:08 -060015933 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015934
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015935 char const *vsSource =
15936 "#version 450\n"
15937 "\n"
15938 "out gl_PerVertex {\n"
15939 " vec4 gl_Position;\n"
15940 "};\n"
15941 "void main(){\n"
15942 " gl_Position = vec4(1);\n"
15943 "}\n";
15944 char const *fsSource =
15945 "#version 450\n"
15946 "\n"
15947 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15948 "layout(location=0) out vec4 color;\n"
15949 "void main() {\n"
15950 " color = subpassLoad(x);\n"
15951 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015952
15953 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15954 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15955
15956 VkPipelineObj pipe(m_device);
15957 pipe.AddShader(&vs);
15958 pipe.AddShader(&fs);
15959 pipe.AddColorAttachment();
15960 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15961
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015962 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15963 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015964 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015965 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015966 ASSERT_VK_SUCCESS(err);
15967
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015968 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015969 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015970 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015971 ASSERT_VK_SUCCESS(err);
15972
15973 // error here.
15974 pipe.CreateVKPipeline(pl, renderPass());
15975
15976 m_errorMonitor->VerifyFound();
15977
15978 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15979 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15980}
15981
Chris Forbes5a9a0472016-08-22 16:02:09 +120015982TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015983 TEST_DESCRIPTION(
15984 "Test that an error is produced for a shader consuming an input attachment "
15985 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15987 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15988
Tony Barbour1fa09702017-03-16 12:09:08 -060015989 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015990
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015991 char const *vsSource =
15992 "#version 450\n"
15993 "\n"
15994 "out gl_PerVertex {\n"
15995 " vec4 gl_Position;\n"
15996 "};\n"
15997 "void main(){\n"
15998 " gl_Position = vec4(1);\n"
15999 "}\n";
16000 char const *fsSource =
16001 "#version 450\n"
16002 "\n"
16003 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16004 "layout(location=0) out vec4 color;\n"
16005 "void main() {\n"
16006 " color = subpassLoad(x);\n"
16007 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120016008
16009 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16010 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16011
16012 VkPipelineObj pipe(m_device);
16013 pipe.AddShader(&vs);
16014 pipe.AddShader(&fs);
16015 pipe.AddColorAttachment();
16016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16017
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016018 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16019 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016020 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016021 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016022 ASSERT_VK_SUCCESS(err);
16023
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016024 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016025 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016026 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016027 ASSERT_VK_SUCCESS(err);
16028
16029 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016030 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16031 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16032 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
16033 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16034 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 +120016035 };
16036 VkAttachmentReference color = {
16037 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16038 };
16039 VkAttachmentReference input = {
16040 1, VK_IMAGE_LAYOUT_GENERAL,
16041 };
16042
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016043 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016044
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016045 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016046 VkRenderPass rp;
16047 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
16048 ASSERT_VK_SUCCESS(err);
16049
16050 // error here.
16051 pipe.CreateVKPipeline(pl, rp);
16052
16053 m_errorMonitor->VerifyFound();
16054
16055 vkDestroyRenderPass(m_device->device(), rp, nullptr);
16056 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16057 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16058}
16059
Chris Forbes541f7b02016-08-22 15:30:27 +120016060TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016061 TEST_DESCRIPTION(
16062 "Test that an error is produced for a shader consuming an input attachment "
16063 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120016064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070016065 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120016066
Tony Barbour1fa09702017-03-16 12:09:08 -060016067 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120016068
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016069 char const *vsSource =
16070 "#version 450\n"
16071 "\n"
16072 "out gl_PerVertex {\n"
16073 " vec4 gl_Position;\n"
16074 "};\n"
16075 "void main(){\n"
16076 " gl_Position = vec4(1);\n"
16077 "}\n";
16078 char const *fsSource =
16079 "#version 450\n"
16080 "\n"
16081 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
16082 "layout(location=0) out vec4 color;\n"
16083 "void main() {\n"
16084 " color = subpassLoad(xs[0]);\n"
16085 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120016086
16087 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16088 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16089
16090 VkPipelineObj pipe(m_device);
16091 pipe.AddShader(&vs);
16092 pipe.AddShader(&fs);
16093 pipe.AddColorAttachment();
16094 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16095
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016096 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16097 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120016098 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016099 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016100 ASSERT_VK_SUCCESS(err);
16101
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016102 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120016103 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016104 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016105 ASSERT_VK_SUCCESS(err);
16106
16107 // error here.
16108 pipe.CreateVKPipeline(pl, renderPass());
16109
16110 m_errorMonitor->VerifyFound();
16111
16112 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16113 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16114}
16115
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016116TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016117 TEST_DESCRIPTION(
16118 "Test that an error is produced for a compute pipeline consuming a "
16119 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016121
Tony Barbour1fa09702017-03-16 12:09:08 -060016122 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016123
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016124 char const *csSource =
16125 "#version 450\n"
16126 "\n"
16127 "layout(local_size_x=1) in;\n"
16128 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16129 "void main(){\n"
16130 " x = vec4(1);\n"
16131 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016132
16133 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16134
16135 VkDescriptorSetObj descriptorSet(m_device);
16136 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16137
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016138 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16139 nullptr,
16140 0,
16141 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16142 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16143 descriptorSet.GetPipelineLayout(),
16144 VK_NULL_HANDLE,
16145 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016146
16147 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016148 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016149
16150 m_errorMonitor->VerifyFound();
16151
16152 if (err == VK_SUCCESS) {
16153 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16154 }
16155}
16156
Chris Forbes22a9b092016-07-19 14:34:05 +120016157TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016158 TEST_DESCRIPTION(
16159 "Test that an error is produced for a pipeline consuming a "
16160 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16162 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120016163
Tony Barbour1fa09702017-03-16 12:09:08 -060016164 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120016165
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016166 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
16167 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120016168 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016169 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016170 ASSERT_VK_SUCCESS(err);
16171
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016172 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120016173 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016174 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016175 ASSERT_VK_SUCCESS(err);
16176
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016177 char const *csSource =
16178 "#version 450\n"
16179 "\n"
16180 "layout(local_size_x=1) in;\n"
16181 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16182 "void main() {\n"
16183 " x.x = 1.0f;\n"
16184 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120016185 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16186
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016187 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16188 nullptr,
16189 0,
16190 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16191 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16192 pl,
16193 VK_NULL_HANDLE,
16194 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120016195
16196 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016197 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120016198
16199 m_errorMonitor->VerifyFound();
16200
16201 if (err == VK_SUCCESS) {
16202 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16203 }
16204
16205 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16206 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16207}
16208
Chris Forbes50020592016-07-27 13:52:41 +120016209TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016210 TEST_DESCRIPTION(
16211 "Test that an error is produced when an image view type "
16212 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120016213
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016214 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 +120016215
Tony Barbour1fa09702017-03-16 12:09:08 -060016216 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120016217 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16218
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016219 char const *vsSource =
16220 "#version 450\n"
16221 "\n"
16222 "out gl_PerVertex { vec4 gl_Position; };\n"
16223 "void main() { gl_Position = vec4(0); }\n";
16224 char const *fsSource =
16225 "#version 450\n"
16226 "\n"
16227 "layout(set=0, binding=0) uniform sampler3D s;\n"
16228 "layout(location=0) out vec4 color;\n"
16229 "void main() {\n"
16230 " color = texture(s, vec3(0));\n"
16231 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120016232 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16233 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16234
16235 VkPipelineObj pipe(m_device);
16236 pipe.AddShader(&vs);
16237 pipe.AddShader(&fs);
16238 pipe.AddColorAttachment();
16239
16240 VkTextureObj texture(m_device, nullptr);
16241 VkSamplerObj sampler(m_device);
16242
16243 VkDescriptorSetObj descriptorSet(m_device);
16244 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16245 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16246
16247 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16248 ASSERT_VK_SUCCESS(err);
16249
Tony Barbour552f6c02016-12-21 14:34:07 -070016250 m_commandBuffer->BeginCommandBuffer();
16251 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120016252
16253 m_commandBuffer->BindPipeline(pipe);
16254 m_commandBuffer->BindDescriptorSet(descriptorSet);
16255
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016256 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120016257 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016258 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120016259 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16260
16261 // error produced here.
16262 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16263
16264 m_errorMonitor->VerifyFound();
16265
Tony Barbour552f6c02016-12-21 14:34:07 -070016266 m_commandBuffer->EndRenderPass();
16267 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120016268}
16269
Chris Forbes5533bfc2016-07-27 14:12:34 +120016270TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016271 TEST_DESCRIPTION(
16272 "Test that an error is produced when a multisampled images "
16273 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016274
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016276
Tony Barbour1fa09702017-03-16 12:09:08 -060016277 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120016278 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16279
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016280 char const *vsSource =
16281 "#version 450\n"
16282 "\n"
16283 "out gl_PerVertex { vec4 gl_Position; };\n"
16284 "void main() { gl_Position = vec4(0); }\n";
16285 char const *fsSource =
16286 "#version 450\n"
16287 "\n"
16288 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
16289 "layout(location=0) out vec4 color;\n"
16290 "void main() {\n"
16291 " color = texelFetch(s, ivec2(0), 0);\n"
16292 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120016293 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16294 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16295
16296 VkPipelineObj pipe(m_device);
16297 pipe.AddShader(&vs);
16298 pipe.AddShader(&fs);
16299 pipe.AddColorAttachment();
16300
16301 VkTextureObj texture(m_device, nullptr);
16302 VkSamplerObj sampler(m_device);
16303
16304 VkDescriptorSetObj descriptorSet(m_device);
16305 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16306 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16307
16308 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16309 ASSERT_VK_SUCCESS(err);
16310
Tony Barbour552f6c02016-12-21 14:34:07 -070016311 m_commandBuffer->BeginCommandBuffer();
16312 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120016313
16314 m_commandBuffer->BindPipeline(pipe);
16315 m_commandBuffer->BindDescriptorSet(descriptorSet);
16316
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016317 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016318 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016319 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016320 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16321
16322 // error produced here.
16323 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16324
16325 m_errorMonitor->VerifyFound();
16326
Tony Barbour552f6c02016-12-21 14:34:07 -070016327 m_commandBuffer->EndRenderPass();
16328 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120016329}
16330
Mark Youngc48c4c12016-04-11 14:26:49 -060016331TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016332 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016333
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016334 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16335 {
16336 VkFormatProperties properties;
16337 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16338 if (properties.optimalTilingFeatures == 0) {
16339 printf(" Image format not supported; skipped.\n");
16340 return;
16341 }
16342 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016343
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016344 VkImageCreateInfo info = {};
16345 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16346 info.pNext = NULL;
16347 info.imageType = VK_IMAGE_TYPE_2D;
16348 info.format = format;
16349 info.extent.height = 32;
16350 info.extent.depth = 1;
16351 info.mipLevels = 1;
16352 info.arrayLayers = 1;
16353 info.samples = VK_SAMPLE_COUNT_1_BIT;
16354 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16355 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16356 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016357
16358 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016359 {
16360 VkImageFormatProperties properties;
16361 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
16362 info.tiling, info.usage, info.flags, &properties);
16363 ASSERT_VK_SUCCESS(result);
16364 info.extent.width = properties.maxExtent.width + 1;
16365 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016366
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016367 VkImage image;
16368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
16369 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016370 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016371}
16372
Mark Youngc48c4c12016-04-11 14:26:49 -060016373TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016374 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060016375
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016376 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16377 {
16378 VkFormatProperties properties;
16379 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16380 if (properties.optimalTilingFeatures == 0) {
16381 printf(" Image format not supported; skipped.\n");
16382 return;
16383 }
16384 }
Mark Youngc48c4c12016-04-11 14:26:49 -060016385
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016386 VkImageCreateInfo info = {};
16387 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16388 info.pNext = NULL;
16389 info.imageType = VK_IMAGE_TYPE_2D;
16390 info.format = format;
16391 info.extent.height = 32;
16392 info.extent.depth = 1;
16393 info.mipLevels = 1;
16394 info.arrayLayers = 1;
16395 info.samples = VK_SAMPLE_COUNT_1_BIT;
16396 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16397 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16398 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016399
16400 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016401 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016402
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016403 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060016404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016405 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
16406 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060016407 m_errorMonitor->VerifyFound();
16408}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070016409
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016410TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016411 TEST_DESCRIPTION(
16412 "Create a render pass with an attachment description "
16413 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016414
Tony Barbour1fa09702017-03-16 12:09:08 -060016415 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16417
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070016418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016419
16420 VkAttachmentReference color_attach = {};
16421 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
16422 color_attach.attachment = 0;
16423 VkSubpassDescription subpass = {};
16424 subpass.colorAttachmentCount = 1;
16425 subpass.pColorAttachments = &color_attach;
16426
16427 VkRenderPassCreateInfo rpci = {};
16428 rpci.subpassCount = 1;
16429 rpci.pSubpasses = &subpass;
16430 rpci.attachmentCount = 1;
16431 VkAttachmentDescription attach_desc = {};
16432 attach_desc.format = VK_FORMAT_UNDEFINED;
16433 rpci.pAttachments = &attach_desc;
16434 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
16435 VkRenderPass rp;
16436 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
16437
16438 m_errorMonitor->VerifyFound();
16439
16440 if (result == VK_SUCCESS) {
16441 vkDestroyRenderPass(m_device->device(), rp, NULL);
16442 }
16443}
16444
Karl Schultz6addd812016-02-02 17:17:23 -070016445TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016446 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060016447
Mike Stroyana3082432015-09-25 13:39:21 -060016448 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070016449 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16450 const int32_t tex_width = 32;
16451 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060016452
16453 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016454 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16455 image_create_info.pNext = NULL;
16456 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16457 image_create_info.format = tex_format;
16458 image_create_info.extent.width = tex_width;
16459 image_create_info.extent.height = tex_height;
16460 image_create_info.extent.depth = 1;
16461 image_create_info.mipLevels = 1;
16462 image_create_info.arrayLayers = 1;
16463 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16464 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16465 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16466 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060016467
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016468 VkImage image;
16469 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060016470 ASSERT_VK_SUCCESS(err);
16471
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016472 VkMemoryRequirements requirements;
16473 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
16474
16475 VkMemoryAllocateInfo alloc_info{};
16476 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16477 alloc_info.pNext = NULL;
16478 alloc_info.memoryTypeIndex = 0;
16479 alloc_info.allocationSize = requirements.size;
16480 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16481 ASSERT_TRUE(pass);
16482
16483 VkDeviceMemory memory;
16484 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16485 ASSERT_VK_SUCCESS(err);
16486
16487 err = vkBindImageMemory(m_device->device(), image, memory, 0);
16488
Tobin Ehliscde08892015-09-22 10:11:37 -060016489 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016490 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070016491 image_view_create_info.image = image;
16492 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16493 image_view_create_info.format = tex_format;
16494 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016495 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070016496 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016497 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060016498
16499 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016501 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016502 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016503
16504 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060016505 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060016506}
Mike Stroyana3082432015-09-25 13:39:21 -060016507
Mark Youngd339ba32016-05-30 13:28:35 -060016508TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
16509 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060016510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060016511 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060016512
Tony Barbour1fa09702017-03-16 12:09:08 -060016513 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060016514
16515 // Create an image and try to create a view with no memory backing the image
16516 VkImage image;
16517
16518 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16519 const int32_t tex_width = 32;
16520 const int32_t tex_height = 32;
16521
16522 VkImageCreateInfo image_create_info = {};
16523 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16524 image_create_info.pNext = NULL;
16525 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16526 image_create_info.format = tex_format;
16527 image_create_info.extent.width = tex_width;
16528 image_create_info.extent.height = tex_height;
16529 image_create_info.extent.depth = 1;
16530 image_create_info.mipLevels = 1;
16531 image_create_info.arrayLayers = 1;
16532 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16533 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16534 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16535 image_create_info.flags = 0;
16536
16537 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16538 ASSERT_VK_SUCCESS(err);
16539
16540 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016541 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060016542 image_view_create_info.image = image;
16543 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16544 image_view_create_info.format = tex_format;
16545 image_view_create_info.subresourceRange.layerCount = 1;
16546 image_view_create_info.subresourceRange.baseMipLevel = 0;
16547 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016548 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060016549
16550 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016551 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060016552
16553 m_errorMonitor->VerifyFound();
16554 vkDestroyImage(m_device->device(), image, NULL);
16555 // If last error is success, it still created the view, so delete it.
16556 if (err == VK_SUCCESS) {
16557 vkDestroyImageView(m_device->device(), view, NULL);
16558 }
Mark Youngd339ba32016-05-30 13:28:35 -060016559}
16560
Karl Schultz6addd812016-02-02 17:17:23 -070016561TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016562 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016563 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016564
Tony Barbour1fa09702017-03-16 12:09:08 -060016565 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016566
Karl Schultz6addd812016-02-02 17:17:23 -070016567 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016568 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016569 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016570 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016571
16572 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016573 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016574 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070016575 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16576 image_view_create_info.format = tex_format;
16577 image_view_create_info.subresourceRange.baseMipLevel = 0;
16578 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016579 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016580 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016581 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016582
16583 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016584 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016585
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016586 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016587}
16588
Mike Weiblena1e13f42017-02-09 21:25:59 -070016589TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
16590 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
16591
Tony Barbour1fa09702017-03-16 12:09:08 -060016592 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070016593 VkSubresourceLayout subres_layout = {};
16594
16595 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
16596 {
16597 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
16598 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016599 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016600 ASSERT_TRUE(img.initialized());
16601
16602 VkImageSubresource subres = {};
16603 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16604 subres.mipLevel = 0;
16605 subres.arrayLayer = 0;
16606
16607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
16608 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16609 m_errorMonitor->VerifyFound();
16610 }
16611
16612 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
16613 {
16614 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016615 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016616 ASSERT_TRUE(img.initialized());
16617
16618 VkImageSubresource subres = {};
16619 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16620 subres.mipLevel = 0;
16621 subres.arrayLayer = 0;
16622
16623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16625 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16626 m_errorMonitor->VerifyFound();
16627 }
16628
16629 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16630 {
16631 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016632 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016633 ASSERT_TRUE(img.initialized());
16634
16635 VkImageSubresource subres = {};
16636 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16637 subres.mipLevel = 1; // ERROR: triggers VU 00739
16638 subres.arrayLayer = 0;
16639
16640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16641 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16642 m_errorMonitor->VerifyFound();
16643 }
16644
16645 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16646 {
16647 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016648 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016649 ASSERT_TRUE(img.initialized());
16650
16651 VkImageSubresource subres = {};
16652 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16653 subres.mipLevel = 0;
16654 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16655
16656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16657 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16658 m_errorMonitor->VerifyFound();
16659 }
16660}
16661
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016662TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016663 VkResult err;
16664 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016665
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016667
Tony Barbour1fa09702017-03-16 12:09:08 -060016668 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016669
16670 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016671 VkImage srcImage;
16672 VkImage dstImage;
16673 VkDeviceMemory srcMem;
16674 VkDeviceMemory destMem;
16675 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016676
16677 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016678 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16679 image_create_info.pNext = NULL;
16680 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16681 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16682 image_create_info.extent.width = 32;
16683 image_create_info.extent.height = 32;
16684 image_create_info.extent.depth = 1;
16685 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016686 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016687 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16688 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16689 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16690 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016691
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016692 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016693 ASSERT_VK_SUCCESS(err);
16694
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016695 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016696 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016697 ASSERT_VK_SUCCESS(err);
16698
16699 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016700 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016701 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16702 memAlloc.pNext = NULL;
16703 memAlloc.allocationSize = 0;
16704 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016705
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016706 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016707 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016708 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016709 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016710 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016711 ASSERT_VK_SUCCESS(err);
16712
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016713 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016714 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016715 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016716 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016717 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016718 ASSERT_VK_SUCCESS(err);
16719
16720 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16721 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016722 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016723 ASSERT_VK_SUCCESS(err);
16724
Tony Barbour552f6c02016-12-21 14:34:07 -070016725 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016726 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016727 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016728 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016729 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016730 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016731 copyRegion.srcOffset.x = 0;
16732 copyRegion.srcOffset.y = 0;
16733 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016734 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016735 copyRegion.dstSubresource.mipLevel = 0;
16736 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016737 // Introduce failure by forcing the dst layerCount to differ from src
16738 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016739 copyRegion.dstOffset.x = 0;
16740 copyRegion.dstOffset.y = 0;
16741 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016742 copyRegion.extent.width = 1;
16743 copyRegion.extent.height = 1;
16744 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016745 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016746 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016747
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016748 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016749
Chia-I Wuf7458c52015-10-26 21:10:41 +080016750 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016751 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016752 vkFreeMemory(m_device->device(), srcMem, NULL);
16753 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016754}
16755
Tony Barbourd6673642016-05-05 14:46:39 -060016756TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016757 TEST_DESCRIPTION("Creating images with unsuported formats ");
16758
Tony Barbour1fa09702017-03-16 12:09:08 -060016759 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016761
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016762 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016763 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016764 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016765 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16766 image_create_info.format = VK_FORMAT_UNDEFINED;
16767 image_create_info.extent.width = 32;
16768 image_create_info.extent.height = 32;
16769 image_create_info.extent.depth = 1;
16770 image_create_info.mipLevels = 1;
16771 image_create_info.arrayLayers = 1;
16772 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16773 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16774 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016775
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16777 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016778
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016779 VkImage image;
16780 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016781 m_errorMonitor->VerifyFound();
16782
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016783 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016784 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016785 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16786 VkFormat format = static_cast<VkFormat>(f);
16787 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016788 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016789 unsupported = format;
16790 break;
16791 }
16792 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016793
Tony Barbourd6673642016-05-05 14:46:39 -060016794 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016795 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016797
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016798 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016799 m_errorMonitor->VerifyFound();
16800 }
16801}
16802
16803TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016804 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16805
Tony Barbour1fa09702017-03-16 12:09:08 -060016806 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016807 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016808 if (!depth_format) {
16809 return;
16810 }
Tony Barbourd6673642016-05-05 14:46:39 -060016811
16812 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016813 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 -060016814 VK_IMAGE_TILING_OPTIMAL, 0);
16815 ASSERT_TRUE(image.initialized());
16816
16817 VkImageView imgView;
16818 VkImageViewCreateInfo imgViewInfo = {};
16819 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16820 imgViewInfo.image = image.handle();
16821 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16822 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16823 imgViewInfo.subresourceRange.layerCount = 1;
16824 imgViewInfo.subresourceRange.baseMipLevel = 0;
16825 imgViewInfo.subresourceRange.levelCount = 1;
16826 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16827
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016828 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016829 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016831 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16832 m_errorMonitor->VerifyFound();
16833 imgViewInfo.subresourceRange.baseMipLevel = 0;
16834
Tony Barbourd6673642016-05-05 14:46:39 -060016835 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16836 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016838 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16839 m_errorMonitor->VerifyFound();
16840 imgViewInfo.subresourceRange.levelCount = 1;
16841
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016842 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16843 imgViewInfo.subresourceRange.levelCount = 2;
16844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16845 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16846 m_errorMonitor->VerifyFound();
16847 imgViewInfo.subresourceRange.levelCount = 1;
16848
16849 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16850 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16852 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16853 m_errorMonitor->VerifyFound();
16854 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16855
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016856 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16857 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016858 m_errorMonitor->SetDesiredFailureMsg(
16859 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16860 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016861 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16862 m_errorMonitor->VerifyFound();
16863 imgViewInfo.subresourceRange.layerCount = 1;
16864
Tony Barbourd6673642016-05-05 14:46:39 -060016865 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016866 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016867 m_errorMonitor->SetDesiredFailureMsg(
16868 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16869 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016870 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16871 m_errorMonitor->VerifyFound();
16872 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16873
Tony Barbourd6673642016-05-05 14:46:39 -060016874 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16875 // VIEW_CREATE_ERROR
16876 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016878 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16879 m_errorMonitor->VerifyFound();
16880 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16881
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016882 // TODO: Update framework to easily passing mutable flag into ImageObj init
16883 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016884 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16885 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16886 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016887 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16888 // VIEW_CREATE_ERROR
16889 VkImageCreateInfo mutImgInfo = image.create_info();
16890 VkImage mutImage;
16891 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016892 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016893 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16894 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016895 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016896 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016897
16898 VkMemoryRequirements requirements;
16899 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16900
16901 VkMemoryAllocateInfo alloc_info{};
16902 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16903 alloc_info.pNext = NULL;
16904 alloc_info.memoryTypeIndex = 0;
16905 alloc_info.allocationSize = requirements.size;
16906 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16907 ASSERT_TRUE(pass);
16908
16909 VkDeviceMemory memory;
16910 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16911 ASSERT_VK_SUCCESS(ret);
16912
16913 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16914 ASSERT_VK_SUCCESS(ret);
16915
Tony Barbourd6673642016-05-05 14:46:39 -060016916 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016918 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16919 m_errorMonitor->VerifyFound();
16920 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016921
16922 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016923 vkDestroyImage(m_device->handle(), mutImage, NULL);
16924}
16925
Dave Houlton75967fc2017-03-06 17:21:16 -070016926TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16927 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16928
Tony Barbour1fa09702017-03-16 12:09:08 -060016929 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016930
Jamie Madill35127872017-03-15 16:17:46 -040016931 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016932 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16933 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16934 if (device_features.textureCompressionBC) {
16935 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16936 } else if (device_features.textureCompressionETC2) {
16937 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16938 } else if (device_features.textureCompressionASTC_LDR) {
16939 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16940 } else {
16941 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16942 return;
16943 }
16944
16945 VkImageCreateInfo ci;
16946 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16947 ci.pNext = NULL;
16948 ci.flags = 0;
16949 ci.imageType = VK_IMAGE_TYPE_2D;
16950 ci.format = compressed_format;
16951 ci.extent = {32, 32, 1};
16952 ci.mipLevels = 6;
16953 ci.arrayLayers = 1;
16954 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16955 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16956 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16957 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16958 ci.queueFamilyIndexCount = 0;
16959 ci.pQueueFamilyIndices = NULL;
16960 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16961
16962 VkImageObj image(m_device);
16963 image.init(&ci);
16964 ASSERT_TRUE(image.initialized());
16965
16966 VkImageObj odd_image(m_device);
16967 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16968 odd_image.init(&ci);
16969 ASSERT_TRUE(odd_image.initialized());
16970
16971 // Allocate buffers
16972 VkMemoryPropertyFlags reqs = 0;
16973 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16974 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16975 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16976 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16977 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16978
16979 VkBufferImageCopy region = {};
16980 region.bufferRowLength = 0;
16981 region.bufferImageHeight = 0;
16982 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16983 region.imageSubresource.layerCount = 1;
16984 region.imageOffset = {0, 0, 0};
16985 region.bufferOffset = 0;
16986
16987 // start recording
16988 m_commandBuffer->BeginCommandBuffer();
16989
16990 // Mip level copies that work - 5 levels
16991 m_errorMonitor->ExpectSuccess();
16992
16993 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16994 region.imageExtent = {32, 32, 1};
16995 region.imageSubresource.mipLevel = 0;
16996 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16997 &region);
16998 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16999 &region);
17000
17001 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
17002 region.imageExtent = {8, 8, 1};
17003 region.imageSubresource.mipLevel = 2;
17004 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
17005 &region);
17006 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17007 &region);
17008
17009 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
17010 region.imageExtent = {4, 4, 1};
17011 region.imageSubresource.mipLevel = 3;
17012 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17013 &region);
17014 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17015 &region);
17016
17017 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
17018 region.imageExtent = {2, 2, 1};
17019 region.imageSubresource.mipLevel = 4;
17020 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17021 &region);
17022 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17023 &region);
17024
17025 region.imageExtent = {1, 1, 1};
17026 region.imageSubresource.mipLevel = 5;
17027 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17028 &region);
17029 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17030 &region);
17031 m_errorMonitor->VerifyNotFound();
17032
17033 // Buffer must accomodate a full compressed block, regardless of texel count
17034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17035 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
17036 &region);
17037 m_errorMonitor->VerifyFound();
17038 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
17039 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17040 &region);
17041 m_errorMonitor->VerifyFound();
17042
17043 // Copy width < compressed block size, but not the full mip width
17044 region.imageExtent = {1, 2, 1};
17045 region.imageSubresource.mipLevel = 4;
17046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17047 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17048 &region);
17049 m_errorMonitor->VerifyFound();
17050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17051 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17052 &region);
17053 m_errorMonitor->VerifyFound();
17054
17055 // Copy height < compressed block size but not the full mip height
17056 region.imageExtent = {2, 1, 1};
17057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17058 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17059 &region);
17060 m_errorMonitor->VerifyFound();
17061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17062 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17063 &region);
17064 m_errorMonitor->VerifyFound();
17065
17066 // Offsets must be multiple of compressed block size
17067 region.imageOffset = {1, 1, 0};
17068 region.imageExtent = {1, 1, 1};
17069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17070 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17071 &region);
17072 m_errorMonitor->VerifyFound();
17073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17074 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17075 &region);
17076 m_errorMonitor->VerifyFound();
17077
17078 // Offset + extent width = mip width - should succeed
17079 region.imageOffset = {4, 4, 0};
17080 region.imageExtent = {3, 4, 1};
17081 region.imageSubresource.mipLevel = 2;
17082 m_errorMonitor->ExpectSuccess();
17083 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17084 &region);
17085 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17086 &region);
17087 m_errorMonitor->VerifyNotFound();
17088
17089 // Offset + extent width > mip width, but still within the final compressed block - should succeed
17090 region.imageExtent = {4, 4, 1};
17091 m_errorMonitor->ExpectSuccess();
17092 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17093 &region);
17094 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17095 &region);
17096 m_errorMonitor->VerifyNotFound();
17097
17098 // Offset + extent width < mip width and not a multiple of block width - should fail
17099 region.imageExtent = {3, 3, 1};
17100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17101 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17102 &region);
17103 m_errorMonitor->VerifyFound();
17104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17105 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17106 &region);
17107 m_errorMonitor->VerifyFound();
17108}
17109
Dave Houlton59a20702017-02-02 17:26:23 -070017110TEST_F(VkLayerTest, ImageBufferCopyTests) {
17111 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
17112
Tony Barbour1fa09702017-03-16 12:09:08 -060017113 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017114 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
17115 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
17116 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
17117 return;
17118 }
Dave Houlton584d51e2017-02-16 12:52:54 -070017119
17120 // Bail if any dimension of transfer granularity is 0.
17121 auto index = m_device->graphics_queue_node_index_;
17122 auto queue_family_properties = m_device->phy().queue_properties();
17123 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
17124 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
17125 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
17126 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
17127 return;
17128 }
17129
Dave Houlton59a20702017-02-02 17:26:23 -070017130 VkImageObj image_64k(m_device); // 128^2 texels, 64k
17131 VkImageObj image_16k(m_device); // 64^2 texels, 16k
17132 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070017133 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
17134 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
17135 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
17136 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
17137
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017138 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017139 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17140 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017141 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017142 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17143 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017144 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 -070017145 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070017146 ASSERT_TRUE(image_64k.initialized());
17147 ASSERT_TRUE(image_16k.initialized());
17148 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017149
Dave Houltonf3229d52017-02-21 15:59:08 -070017150 // Verify all needed Depth/Stencil formats are supported
17151 bool missing_ds_support = false;
17152 VkFormatProperties props = {0, 0, 0};
17153 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
17154 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17155 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
17156 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17157 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
17158 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17159 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
17160 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17161
17162 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017163 ds_image_4D_1S.Init(
17164 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017165 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17166 VK_IMAGE_TILING_OPTIMAL, 0);
17167 ASSERT_TRUE(ds_image_4D_1S.initialized());
17168
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017169 ds_image_3D_1S.Init(
17170 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017171 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17172 VK_IMAGE_TILING_OPTIMAL, 0);
17173 ASSERT_TRUE(ds_image_3D_1S.initialized());
17174
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017175 ds_image_2D.Init(
17176 256, 256, 1, VK_FORMAT_D16_UNORM,
17177 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17178 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017179 ASSERT_TRUE(ds_image_2D.initialized());
17180
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017181 ds_image_1S.Init(
17182 256, 256, 1, VK_FORMAT_S8_UINT,
17183 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17184 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017185 ASSERT_TRUE(ds_image_1S.initialized());
17186 }
17187
17188 // Allocate buffers
17189 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070017190 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070017191 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
17192 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
17193 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
17194 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070017195
17196 VkBufferImageCopy region = {};
17197 region.bufferRowLength = 0;
17198 region.bufferImageHeight = 0;
17199 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17200 region.imageSubresource.layerCount = 1;
17201 region.imageOffset = {0, 0, 0};
17202 region.imageExtent = {64, 64, 1};
17203 region.bufferOffset = 0;
17204
17205 // attempt copies before putting command buffer in recording state
17206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
17207 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17208 &region);
17209 m_errorMonitor->VerifyFound();
17210
17211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
17212 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17213 &region);
17214 m_errorMonitor->VerifyFound();
17215
17216 // start recording
17217 m_commandBuffer->BeginCommandBuffer();
17218
17219 // successful copies
17220 m_errorMonitor->ExpectSuccess();
17221 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17222 &region);
17223 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17224 &region);
17225 region.imageOffset.x = 16; // 16k copy, offset requires larger image
17226 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17227 &region);
17228 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
17229 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17230 &region);
17231 region.imageOffset.x = 0;
17232 region.imageExtent.height = 64;
17233 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
17234 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17235 &region);
17236 m_errorMonitor->VerifyNotFound();
17237
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017238 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070017239 region.imageExtent = {65, 64, 1};
17240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17241 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17242 &region);
17243 m_errorMonitor->VerifyFound();
17244
17245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17246 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17247 &region);
17248 m_errorMonitor->VerifyFound();
17249
17250 // image/buffer too small (offset) on copy to image
17251 region.imageExtent = {64, 64, 1};
17252 region.imageOffset = {0, 4, 0};
17253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17254 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17255 &region);
17256 m_errorMonitor->VerifyFound();
17257
17258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17259 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17260 &region);
17261 m_errorMonitor->VerifyFound();
17262
17263 // image/buffer too small on copy to buffer
17264 region.imageExtent = {64, 64, 1};
17265 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070017266 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
17268 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17269 &region);
17270 m_errorMonitor->VerifyFound();
17271
17272 region.imageExtent = {64, 65, 1};
17273 region.bufferOffset = 0;
17274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
17275 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17276 &region);
17277 m_errorMonitor->VerifyFound();
17278
17279 // buffer size ok but rowlength causes loose packing
17280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17281 region.imageExtent = {64, 64, 1};
17282 region.bufferRowLength = 68;
17283 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17284 &region);
17285 m_errorMonitor->VerifyFound();
17286
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017287 // An extent with zero area should produce a warning, but no error
17288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
17289 region.imageExtent.width = 0;
17290 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17291 &region);
17292 m_errorMonitor->VerifyFound();
17293
Dave Houlton59a20702017-02-02 17:26:23 -070017294 // aspect bits
17295 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
17296 region.imageExtent = {64, 64, 1};
17297 region.bufferRowLength = 0;
17298 region.bufferImageHeight = 0;
17299 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17300 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17301 buffer_16k.handle(), 1, &region);
17302 m_errorMonitor->VerifyFound();
17303
17304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
17305 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17306 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17307 &region);
17308 m_errorMonitor->VerifyFound();
17309
17310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
17311 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17312 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17313 buffer_16k.handle(), 1, &region);
17314 m_errorMonitor->VerifyFound();
17315
Dave Houltonf3229d52017-02-21 15:59:08 -070017316 // Test Depth/Stencil copies
17317 if (missing_ds_support) {
17318 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
17319 } else {
17320 VkBufferImageCopy ds_region = {};
17321 ds_region.bufferOffset = 0;
17322 ds_region.bufferRowLength = 0;
17323 ds_region.bufferImageHeight = 0;
17324 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17325 ds_region.imageSubresource.mipLevel = 0;
17326 ds_region.imageSubresource.baseArrayLayer = 0;
17327 ds_region.imageSubresource.layerCount = 1;
17328 ds_region.imageOffset = {0, 0, 0};
17329 ds_region.imageExtent = {256, 256, 1};
17330
17331 // Depth copies that should succeed
17332 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
17333 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17334 buffer_256k.handle(), 1, &ds_region);
17335 m_errorMonitor->VerifyNotFound();
17336
17337 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
17338 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17339 buffer_256k.handle(), 1, &ds_region);
17340 m_errorMonitor->VerifyNotFound();
17341
17342 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
17343 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17344 buffer_128k.handle(), 1, &ds_region);
17345 m_errorMonitor->VerifyNotFound();
17346
17347 // Depth copies that should fail
17348 ds_region.bufferOffset = 4;
17349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17350 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
17351 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17352 buffer_256k.handle(), 1, &ds_region);
17353 m_errorMonitor->VerifyFound();
17354
17355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17356 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
17357 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17358 buffer_256k.handle(), 1, &ds_region);
17359 m_errorMonitor->VerifyFound();
17360
17361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17362 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
17363 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17364 buffer_128k.handle(), 1, &ds_region);
17365 m_errorMonitor->VerifyFound();
17366
17367 // Stencil copies that should succeed
17368 ds_region.bufferOffset = 0;
17369 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17370 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17371 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17372 buffer_64k.handle(), 1, &ds_region);
17373 m_errorMonitor->VerifyNotFound();
17374
17375 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17376 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17377 buffer_64k.handle(), 1, &ds_region);
17378 m_errorMonitor->VerifyNotFound();
17379
17380 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
17381 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17382 buffer_64k.handle(), 1, &ds_region);
17383 m_errorMonitor->VerifyNotFound();
17384
17385 // Stencil copies that should fail
17386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17387 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17389 buffer_16k.handle(), 1, &ds_region);
17390 m_errorMonitor->VerifyFound();
17391
17392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17393 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17394 ds_region.bufferRowLength = 260;
17395 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17396 buffer_64k.handle(), 1, &ds_region);
17397 m_errorMonitor->VerifyFound();
17398
17399 ds_region.bufferRowLength = 0;
17400 ds_region.bufferOffset = 4;
17401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17402 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
17403 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17404 buffer_64k.handle(), 1, &ds_region);
17405 m_errorMonitor->VerifyFound();
17406 }
17407
Dave Houlton584d51e2017-02-16 12:52:54 -070017408 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040017409 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070017410 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070017411 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
17412 device_features.textureCompressionASTC_LDR)) {
17413 printf(" No compressed formats supported - block compression tests skipped.\n");
17414 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070017415 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
17416 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070017417 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017418 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
17419 0);
17420 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 -070017421 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017422 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017423 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 -070017424 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017425 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 -070017426 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017427 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017428 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 -070017429 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017430 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 -070017431 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017432 }
17433 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017434
Dave Houlton584d51e2017-02-16 12:52:54 -070017435 // Just fits
17436 m_errorMonitor->ExpectSuccess();
17437 region.imageExtent = {128, 128, 1};
17438 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17439 buffer_16k.handle(), 1, &region);
17440 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017441
Dave Houlton584d51e2017-02-16 12:52:54 -070017442 // with offset, too big for buffer
17443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17444 region.bufferOffset = 16;
17445 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17446 buffer_16k.handle(), 1, &region);
17447 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017448 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017449
Dave Houlton67e9b532017-03-02 17:00:10 -070017450 // extents that are not a multiple of compressed block size
17451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17452 region.imageExtent.width = 66;
17453 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17454 buffer_16k.handle(), 1, &region);
17455 m_errorMonitor->VerifyFound();
17456 region.imageExtent.width = 128;
17457
17458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017459 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070017460 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17461 buffer_16k.handle(), 1, &region);
17462 m_errorMonitor->VerifyFound();
17463 region.imageExtent.height = 128;
17464
17465 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
17466
17467 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
17468 m_errorMonitor->ExpectSuccess();
17469 region.imageExtent.width = 66;
17470 region.imageOffset.x = 64;
17471 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17472 buffer_16k.handle(), 1, &region);
17473 region.imageExtent.width = 16;
17474 region.imageOffset.x = 0;
17475 region.imageExtent.height = 2;
17476 region.imageOffset.y = 128;
17477 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017478 buffer_16k.handle(), 1, &region);
17479 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017480 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017481
Dave Houlton584d51e2017-02-16 12:52:54 -070017482 // buffer offset must be a multiple of texel block size (16)
17483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
17484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
17485 region.imageExtent = {64, 64, 1};
17486 region.bufferOffset = 24;
17487 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17488 buffer_16k.handle(), 1, &region);
17489 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017490
Dave Houlton584d51e2017-02-16 12:52:54 -070017491 // rowlength not a multiple of block width (4)
17492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
17493 region.bufferOffset = 0;
17494 region.bufferRowLength = 130;
17495 region.bufferImageHeight = 0;
17496 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17497 buffer_64k.handle(), 1, &region);
17498 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017499
Dave Houlton584d51e2017-02-16 12:52:54 -070017500 // imageheight not a multiple of block height (4)
17501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
17502 region.bufferRowLength = 0;
17503 region.bufferImageHeight = 130;
17504 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17505 buffer_64k.handle(), 1, &region);
17506 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070017507 }
Dave Houlton59a20702017-02-02 17:26:23 -070017508}
17509
Tony Barbourd6673642016-05-05 14:46:39 -060017510TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070017511 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060017512
Tony Barbour1fa09702017-03-16 12:09:08 -060017513 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060017514
Rene Lindsay135204f2016-12-22 17:11:09 -070017515 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060017516 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017517 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 -070017518 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060017519 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060017520 vk_testing::Buffer buffer;
17521 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070017522 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060017523 VkBufferImageCopy region = {};
17524 region.bufferRowLength = 128;
17525 region.bufferImageHeight = 128;
17526 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17527 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070017528 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017529 region.imageExtent.height = 4;
17530 region.imageExtent.width = 4;
17531 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070017532
17533 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017534 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 -070017535 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070017536 ASSERT_TRUE(image2.initialized());
17537 vk_testing::Buffer buffer2;
17538 VkMemoryPropertyFlags reqs2 = 0;
17539 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
17540 VkBufferImageCopy region2 = {};
17541 region2.bufferRowLength = 128;
17542 region2.bufferImageHeight = 128;
17543 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17544 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
17545 region2.imageSubresource.layerCount = 1;
17546 region2.imageExtent.height = 4;
17547 region2.imageExtent.width = 4;
17548 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017549 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060017550
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017551 // Image must have offset.z of 0 and extent.depth of 1
17552 // Introduce failure by setting imageExtent.depth to 0
17553 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017555 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017556 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017557 m_errorMonitor->VerifyFound();
17558
17559 region.imageExtent.depth = 1;
17560
17561 // Image must have offset.z of 0 and extent.depth of 1
17562 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017563 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017564 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017567 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017568 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017569 m_errorMonitor->VerifyFound();
17570
17571 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017572 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
17573 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070017574 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017576 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17577 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017578 m_errorMonitor->VerifyFound();
17579
17580 // BufferOffset must be a multiple of 4
17581 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070017582 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070017584 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
17585 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017586 m_errorMonitor->VerifyFound();
17587
17588 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
17589 region.bufferOffset = 0;
17590 region.imageExtent.height = 128;
17591 region.imageExtent.width = 128;
17592 // Introduce failure by setting bufferRowLength > 0 but less than width
17593 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017595 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17596 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017597 m_errorMonitor->VerifyFound();
17598
17599 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
17600 region.bufferRowLength = 128;
17601 // Introduce failure by setting bufferRowHeight > 0 but less than height
17602 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017604 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17605 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017606 m_errorMonitor->VerifyFound();
17607
17608 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060017609 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017610 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 -070017611 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017612 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017613 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 -070017614 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017615 VkImageBlit blitRegion = {};
17616 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17617 blitRegion.srcSubresource.baseArrayLayer = 0;
17618 blitRegion.srcSubresource.layerCount = 1;
17619 blitRegion.srcSubresource.mipLevel = 0;
17620 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17621 blitRegion.dstSubresource.baseArrayLayer = 0;
17622 blitRegion.dstSubresource.layerCount = 1;
17623 blitRegion.dstSubresource.mipLevel = 0;
17624
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017625 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17627 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17629 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017630 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17631 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017632 m_errorMonitor->VerifyFound();
17633
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017635 VkImageMemoryBarrier img_barrier;
17636 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17637 img_barrier.pNext = NULL;
17638 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17639 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17640 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17641 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17642 img_barrier.image = image.handle();
17643 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17644 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17645 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17646 img_barrier.subresourceRange.baseArrayLayer = 0;
17647 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017648 img_barrier.subresourceRange.layerCount = 0;
17649 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017650 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17651 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017652 m_errorMonitor->VerifyFound();
17653 img_barrier.subresourceRange.layerCount = 1;
17654}
17655
17656TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017657 TEST_DESCRIPTION("Exceed the limits of image format ");
17658
Tony Barbour1fa09702017-03-16 12:09:08 -060017659 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017660
17661 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17662 {
17663 VkFormatProperties properties;
17664 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17665 if (properties.linearTilingFeatures == 0) {
17666 printf(" Image format not supported; skipped.\n");
17667 return;
17668 }
17669 }
17670
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017672 VkImageCreateInfo image_create_info = {};
17673 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17674 image_create_info.pNext = NULL;
17675 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017676 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017677 image_create_info.extent.width = 32;
17678 image_create_info.extent.height = 32;
17679 image_create_info.extent.depth = 1;
17680 image_create_info.mipLevels = 1;
17681 image_create_info.arrayLayers = 1;
17682 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17683 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17684 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17685 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17686 image_create_info.flags = 0;
17687
17688 VkImage nullImg;
17689 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017690 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17691 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017692 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017693 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17694 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17695 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017696 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017697
Tony Barbour0907e362017-03-09 15:05:30 -070017698 uint32_t maxDim =
17699 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17700 // If max mip levels exceeds image extents, skip the max mip levels test
17701 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17703 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17704 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17705 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17706 m_errorMonitor->VerifyFound();
17707 image_create_info.mipLevels = 1;
17708 }
Tony Barbourd6673642016-05-05 14:46:39 -060017709
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017711 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17712 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17713 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17714 m_errorMonitor->VerifyFound();
17715 image_create_info.arrayLayers = 1;
17716
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017718 int samples = imgFmtProps.sampleCounts >> 1;
17719 image_create_info.samples = (VkSampleCountFlagBits)samples;
17720 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17721 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17722 m_errorMonitor->VerifyFound();
17723 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17724
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17726 "pCreateInfo->initialLayout, must be "
17727 "VK_IMAGE_LAYOUT_UNDEFINED or "
17728 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017729 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17730 // Expect INVALID_LAYOUT
17731 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17732 m_errorMonitor->VerifyFound();
17733 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17734}
17735
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017736TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017737 // Image copy with source region specified greater than src image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017738 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017739
Dave Houltonfc1a4052017-04-27 14:32:45 -060017740 // Create images with full mip chain
17741 VkImageCreateInfo ci;
17742 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17743 ci.pNext = NULL;
17744 ci.flags = 0;
17745 ci.imageType = VK_IMAGE_TYPE_3D;
17746 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17747 ci.extent = {32, 32, 8};
17748 ci.mipLevels = 6;
17749 ci.arrayLayers = 1;
17750 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17751 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17752 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17753 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17754 ci.queueFamilyIndexCount = 0;
17755 ci.pQueueFamilyIndices = NULL;
17756 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17757
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017758 VkImageObj src_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017759 src_image.init(&ci);
17760 ASSERT_TRUE(src_image.initialized());
17761
17762 // Dest image with one more mip level
17763 ci.extent = {64, 64, 16};
17764 ci.mipLevels = 7;
17765 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017766 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017767 dst_image.init(&ci);
17768 ASSERT_TRUE(dst_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017769
Tony Barbour552f6c02016-12-21 14:34:07 -070017770 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017771
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017772 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017773 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017774 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017775 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017776 copy_region.srcSubresource.mipLevel = 0;
17777 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017778 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017779 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017780 copy_region.srcSubresource.layerCount = 1;
17781 copy_region.dstSubresource.layerCount = 1;
17782 copy_region.srcOffset = {0, 0, 0};
17783 copy_region.dstOffset = {0, 0, 0};
17784
17785 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017786 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17787 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017788 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017789
Dave Houltonfc1a4052017-04-27 14:32:45 -060017790 // Source exceeded in x-dim, VU 01202
17791 copy_region.srcOffset.x = 4;
17792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175); // General "contained within" VU
17793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01202);
17794 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17795 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017796 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017797
17798 // Source exceeded in y-dim, VU 01203
17799 copy_region.srcOffset.x = 0;
17800 copy_region.extent.height = 48;
17801 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01203);
17803 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17804 &copy_region);
17805 m_errorMonitor->VerifyFound();
17806
17807 // Source exceeded in z-dim, VU 01204
17808 copy_region.extent = {4, 4, 4};
17809 copy_region.srcSubresource.mipLevel = 2;
17810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01204);
17812 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17813 &copy_region);
17814 m_errorMonitor->VerifyFound();
17815
17816 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017817}
17818
17819TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017820 // Image copy with dest region specified greater than dest image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017821 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017822
Dave Houltonfc1a4052017-04-27 14:32:45 -060017823 // Create images with full mip chain
17824 VkImageCreateInfo ci;
17825 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17826 ci.pNext = NULL;
17827 ci.flags = 0;
17828 ci.imageType = VK_IMAGE_TYPE_3D;
17829 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17830 ci.extent = {32, 32, 8};
17831 ci.mipLevels = 6;
17832 ci.arrayLayers = 1;
17833 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17834 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17835 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17836 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17837 ci.queueFamilyIndexCount = 0;
17838 ci.pQueueFamilyIndices = NULL;
17839 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17840
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017841 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017842 dst_image.init(&ci);
17843 ASSERT_TRUE(dst_image.initialized());
17844
17845 // Src image with one more mip level
17846 ci.extent = {64, 64, 16};
17847 ci.mipLevels = 7;
17848 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17849 VkImageObj src_image(m_device);
17850 src_image.init(&ci);
17851 ASSERT_TRUE(src_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017852
Tony Barbour552f6c02016-12-21 14:34:07 -070017853 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017854
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017855 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017856 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017857 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017858 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017859 copy_region.srcSubresource.mipLevel = 0;
17860 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017861 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017862 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017863 copy_region.srcSubresource.layerCount = 1;
17864 copy_region.dstSubresource.layerCount = 1;
17865 copy_region.srcOffset = {0, 0, 0};
17866 copy_region.dstOffset = {0, 0, 0};
17867
17868 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017869 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17870 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017871 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017872
Dave Houltonfc1a4052017-04-27 14:32:45 -060017873 // Dest exceeded in x-dim, VU 01205
17874 copy_region.dstOffset.x = 4;
17875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176); // General "contained within" VU
17876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01205);
17877 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17878 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017879 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017880
17881 // Dest exceeded in y-dim, VU 01206
17882 copy_region.dstOffset.x = 0;
17883 copy_region.extent.height = 48;
17884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01206);
17886 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17887 &copy_region);
17888 m_errorMonitor->VerifyFound();
17889
17890 // Dest exceeded in z-dim, VU 01207
17891 copy_region.extent = {4, 4, 4};
17892 copy_region.dstSubresource.mipLevel = 2;
17893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01207);
17895 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17896 &copy_region);
17897 m_errorMonitor->VerifyFound();
17898
17899 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017900}
17901
Karl Schultz6addd812016-02-02 17:17:23 -070017902TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017903 VkResult err;
17904 bool pass;
17905
17906 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017908
Tony Barbour1fa09702017-03-16 12:09:08 -060017909 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017910
17911 // Create two images of different types and try to copy between them
17912 VkImage srcImage;
17913 VkImage dstImage;
17914 VkDeviceMemory srcMem;
17915 VkDeviceMemory destMem;
17916 VkMemoryRequirements memReqs;
17917
17918 VkImageCreateInfo image_create_info = {};
17919 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17920 image_create_info.pNext = NULL;
17921 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17922 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17923 image_create_info.extent.width = 32;
17924 image_create_info.extent.height = 32;
17925 image_create_info.extent.depth = 1;
17926 image_create_info.mipLevels = 1;
17927 image_create_info.arrayLayers = 1;
17928 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17929 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17930 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17931 image_create_info.flags = 0;
17932
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017933 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017934 ASSERT_VK_SUCCESS(err);
17935
17936 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17937 // Introduce failure by creating second image with a different-sized format.
17938 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017939 VkFormatProperties properties;
17940 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17941 if (properties.optimalTilingFeatures == 0) {
17942 printf(" Image format not supported; skipped.\n");
17943 return;
17944 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017945
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017946 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017947 ASSERT_VK_SUCCESS(err);
17948
17949 // Allocate memory
17950 VkMemoryAllocateInfo memAlloc = {};
17951 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17952 memAlloc.pNext = NULL;
17953 memAlloc.allocationSize = 0;
17954 memAlloc.memoryTypeIndex = 0;
17955
17956 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17957 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017958 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017959 ASSERT_TRUE(pass);
17960 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17961 ASSERT_VK_SUCCESS(err);
17962
17963 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17964 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017965 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017966 ASSERT_TRUE(pass);
17967 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17968 ASSERT_VK_SUCCESS(err);
17969
17970 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17971 ASSERT_VK_SUCCESS(err);
17972 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17973 ASSERT_VK_SUCCESS(err);
17974
Tony Barbour552f6c02016-12-21 14:34:07 -070017975 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017976 VkImageCopy copyRegion;
17977 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17978 copyRegion.srcSubresource.mipLevel = 0;
17979 copyRegion.srcSubresource.baseArrayLayer = 0;
17980 copyRegion.srcSubresource.layerCount = 0;
17981 copyRegion.srcOffset.x = 0;
17982 copyRegion.srcOffset.y = 0;
17983 copyRegion.srcOffset.z = 0;
17984 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17985 copyRegion.dstSubresource.mipLevel = 0;
17986 copyRegion.dstSubresource.baseArrayLayer = 0;
17987 copyRegion.dstSubresource.layerCount = 0;
17988 copyRegion.dstOffset.x = 0;
17989 copyRegion.dstOffset.y = 0;
17990 copyRegion.dstOffset.z = 0;
17991 copyRegion.extent.width = 1;
17992 copyRegion.extent.height = 1;
17993 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017994 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017995 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017996
17997 m_errorMonitor->VerifyFound();
17998
17999 vkDestroyImage(m_device->device(), srcImage, NULL);
18000 vkDestroyImage(m_device->device(), dstImage, NULL);
18001 vkFreeMemory(m_device->device(), srcMem, NULL);
18002 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018003}
18004
Karl Schultz6addd812016-02-02 17:17:23 -070018005TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
18006 VkResult err;
18007 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018008
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018009 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18011 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018012
Tony Barbour1fa09702017-03-16 12:09:08 -060018013 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018014 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018015 if (!depth_format) {
18016 return;
18017 }
Mike Stroyana3082432015-09-25 13:39:21 -060018018
18019 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018020 VkImage srcImage;
18021 VkImage dstImage;
18022 VkDeviceMemory srcMem;
18023 VkDeviceMemory destMem;
18024 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018025
18026 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018027 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18028 image_create_info.pNext = NULL;
18029 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018030 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070018031 image_create_info.extent.width = 32;
18032 image_create_info.extent.height = 32;
18033 image_create_info.extent.depth = 1;
18034 image_create_info.mipLevels = 1;
18035 image_create_info.arrayLayers = 1;
18036 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060018037 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070018038 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18039 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018040 VkFormatProperties properties;
18041 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
18042 if (properties.optimalTilingFeatures == 0) {
18043 printf(" Image format not supported; skipped.\n");
18044 return;
18045 }
Mike Stroyana3082432015-09-25 13:39:21 -060018046
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018047 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018048 ASSERT_VK_SUCCESS(err);
18049
Karl Schultzbdb75952016-04-19 11:36:49 -060018050 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18051
Mark Lobodzinskidb117632016-03-31 10:45:56 -060018052 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070018053 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070018054 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060018055 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018056
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018057 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018058 ASSERT_VK_SUCCESS(err);
18059
18060 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018061 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018062 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18063 memAlloc.pNext = NULL;
18064 memAlloc.allocationSize = 0;
18065 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018066
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018067 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018068 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018069 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018070 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018071 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018072 ASSERT_VK_SUCCESS(err);
18073
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018074 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018075 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018076 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018077 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018078 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018079 ASSERT_VK_SUCCESS(err);
18080
18081 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18082 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018083 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018084 ASSERT_VK_SUCCESS(err);
18085
Tony Barbour552f6c02016-12-21 14:34:07 -070018086 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018087 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018088 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018089 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018090 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018091 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018092 copyRegion.srcOffset.x = 0;
18093 copyRegion.srcOffset.y = 0;
18094 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018095 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018096 copyRegion.dstSubresource.mipLevel = 0;
18097 copyRegion.dstSubresource.baseArrayLayer = 0;
18098 copyRegion.dstSubresource.layerCount = 0;
18099 copyRegion.dstOffset.x = 0;
18100 copyRegion.dstOffset.y = 0;
18101 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018102 copyRegion.extent.width = 1;
18103 copyRegion.extent.height = 1;
18104 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018105 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018106 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018107
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018108 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018109
Chia-I Wuf7458c52015-10-26 21:10:41 +080018110 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018111 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018112 vkFreeMemory(m_device->device(), srcMem, NULL);
18113 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018114}
18115
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018116TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
18117 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070018118
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018119 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070018120
18121 VkImageFormatProperties image_format_properties;
18122 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
18123 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
18124 &image_format_properties);
18125
18126 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
18127 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
18128 printf(" Image multi-sample support not found; skipped.\n");
18129 return;
18130 }
18131
18132 VkImageCreateInfo ci;
18133 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18134 ci.pNext = NULL;
18135 ci.flags = 0;
18136 ci.imageType = VK_IMAGE_TYPE_2D;
18137 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
18138 ci.extent = {128, 128, 1};
18139 ci.mipLevels = 1;
18140 ci.arrayLayers = 1;
18141 ci.samples = VK_SAMPLE_COUNT_1_BIT;
18142 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
18143 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18144 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18145 ci.queueFamilyIndexCount = 0;
18146 ci.pQueueFamilyIndices = NULL;
18147 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18148
18149 VkImageObj image1(m_device);
18150 image1.init(&ci);
18151 ASSERT_TRUE(image1.initialized());
18152
18153 ci.samples = VK_SAMPLE_COUNT_2_BIT;
18154 VkImageObj image2(m_device);
18155 image2.init(&ci);
18156 ASSERT_TRUE(image2.initialized());
18157
18158 ci.samples = VK_SAMPLE_COUNT_4_BIT;
18159 VkImageObj image4(m_device);
18160 image4.init(&ci);
18161 ASSERT_TRUE(image4.initialized());
18162
18163 m_commandBuffer->BeginCommandBuffer();
18164
18165 VkImageCopy copyRegion;
18166 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18167 copyRegion.srcSubresource.mipLevel = 0;
18168 copyRegion.srcSubresource.baseArrayLayer = 0;
18169 copyRegion.srcSubresource.layerCount = 1;
18170 copyRegion.srcOffset = {0, 0, 0};
18171 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18172 copyRegion.dstSubresource.mipLevel = 0;
18173 copyRegion.dstSubresource.baseArrayLayer = 0;
18174 copyRegion.dstSubresource.layerCount = 1;
18175 copyRegion.dstOffset = {0, 0, 0};
18176 copyRegion.extent = {128, 128, 1};
18177
18178 // Copy a single sample image to/from a multi-sample image
18179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18180 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18181 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18182 m_errorMonitor->VerifyFound();
18183
18184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18185 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
18186 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18187 m_errorMonitor->VerifyFound();
18188
18189 // Copy between multi-sample images with different sample counts
18190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18191 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18192 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18193 m_errorMonitor->VerifyFound();
18194
18195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18196 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
18197 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18198 m_errorMonitor->VerifyFound();
18199
18200 m_commandBuffer->EndCommandBuffer();
18201}
18202
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018203TEST_F(VkLayerTest, CopyImageAspectMismatch) {
18204 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018205 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018206 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060018207 if (!ds_format) {
18208 return;
18209 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018210
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018211 VkFormatProperties properties;
18212 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
18213 if (properties.optimalTilingFeatures == 0) {
18214 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
18215 return;
18216 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018217 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018218 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 -060018219 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Dave Houlton11dcd5e2017-04-25 16:00:10 -060018220 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018221 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
18222 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018223 ASSERT_TRUE(color_image.initialized());
18224 ASSERT_TRUE(depth_image.initialized());
18225 ASSERT_TRUE(ds_image.initialized());
18226
18227 VkImageCopy copyRegion;
18228 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18229 copyRegion.srcSubresource.mipLevel = 0;
18230 copyRegion.srcSubresource.baseArrayLayer = 0;
18231 copyRegion.srcSubresource.layerCount = 1;
18232 copyRegion.srcOffset = {0, 0, 0};
18233 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18234 copyRegion.dstSubresource.mipLevel = 0;
18235 copyRegion.dstSubresource.baseArrayLayer = 0;
18236 copyRegion.dstSubresource.layerCount = 1;
18237 copyRegion.dstOffset = {64, 0, 0};
18238 copyRegion.extent = {64, 128, 1};
18239
18240 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060018241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18242 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
18243 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18244 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018245 m_errorMonitor->VerifyFound();
18246
18247 m_commandBuffer->BeginCommandBuffer();
18248
18249 // Src and dest aspect masks don't match
18250 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
18251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018252 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
18253 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018254 m_errorMonitor->VerifyFound();
18255 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18256
18257 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060018258 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018259 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
18260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
18261 // These aspect/format mismatches are redundant but unavoidable here
18262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018264 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18265 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018266 m_errorMonitor->VerifyFound();
18267 // Metadata aspect is illegal - VU 01222
18268 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18269 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
18271 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060018272 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18273 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018274 m_errorMonitor->VerifyFound();
18275
18276 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18277 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18278
18279 // Aspect mask doesn't match source image format - VU 01200
18280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18281 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
18282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18283 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18284 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18285 m_errorMonitor->VerifyFound();
18286
18287 // Aspect mask doesn't match dest image format - VU 01201
18288 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18289 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
18291 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
18292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18293 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18294 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18295 m_errorMonitor->VerifyFound();
18296
18297 m_commandBuffer->EndCommandBuffer();
18298}
18299
Karl Schultz6addd812016-02-02 17:17:23 -070018300TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
18301 VkResult err;
18302 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018303
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18305 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018306
Tony Barbour1fa09702017-03-16 12:09:08 -060018307 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018308
18309 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018310 VkImage srcImage;
18311 VkImage dstImage;
18312 VkDeviceMemory srcMem;
18313 VkDeviceMemory destMem;
18314 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018315
18316 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018317 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18318 image_create_info.pNext = NULL;
18319 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18320 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18321 image_create_info.extent.width = 32;
18322 image_create_info.extent.height = 1;
18323 image_create_info.extent.depth = 1;
18324 image_create_info.mipLevels = 1;
18325 image_create_info.arrayLayers = 1;
18326 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18327 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18328 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18329 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018330
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018331 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018332 ASSERT_VK_SUCCESS(err);
18333
Karl Schultz6addd812016-02-02 17:17:23 -070018334 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018335
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018336 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018337 ASSERT_VK_SUCCESS(err);
18338
18339 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018340 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018341 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18342 memAlloc.pNext = NULL;
18343 memAlloc.allocationSize = 0;
18344 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018345
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018346 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018347 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018348 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018349 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018350 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018351 ASSERT_VK_SUCCESS(err);
18352
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018353 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018354 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018355 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018356 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018357 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018358 ASSERT_VK_SUCCESS(err);
18359
18360 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18361 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018362 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018363 ASSERT_VK_SUCCESS(err);
18364
Tony Barbour552f6c02016-12-21 14:34:07 -070018365 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018366 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018367 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18368 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018369 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018370 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018371 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018372 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018373 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018374 resolveRegion.srcOffset.x = 0;
18375 resolveRegion.srcOffset.y = 0;
18376 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018377 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018378 resolveRegion.dstSubresource.mipLevel = 0;
18379 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018380 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018381 resolveRegion.dstOffset.x = 0;
18382 resolveRegion.dstOffset.y = 0;
18383 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018384 resolveRegion.extent.width = 1;
18385 resolveRegion.extent.height = 1;
18386 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018387 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018388 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018389
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018390 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018391
Chia-I Wuf7458c52015-10-26 21:10:41 +080018392 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018393 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018394 vkFreeMemory(m_device->device(), srcMem, NULL);
18395 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018396}
18397
Karl Schultz6addd812016-02-02 17:17:23 -070018398TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
18399 VkResult err;
18400 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018401
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18403 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018404
Tony Barbour1fa09702017-03-16 12:09:08 -060018405 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018406
Chris Forbesa7530692016-05-08 12:35:39 +120018407 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018408 VkImage srcImage;
18409 VkImage dstImage;
18410 VkDeviceMemory srcMem;
18411 VkDeviceMemory destMem;
18412 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018413
18414 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018415 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18416 image_create_info.pNext = NULL;
18417 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18418 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18419 image_create_info.extent.width = 32;
18420 image_create_info.extent.height = 1;
18421 image_create_info.extent.depth = 1;
18422 image_create_info.mipLevels = 1;
18423 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120018424 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018425 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18426 // Note: Some implementations expect color attachment usage for any
18427 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018428 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018429 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018430
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018431 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018432 ASSERT_VK_SUCCESS(err);
18433
Karl Schultz6addd812016-02-02 17:17:23 -070018434 // Note: Some implementations expect color attachment usage for any
18435 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018436 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018437
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018438 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018439 ASSERT_VK_SUCCESS(err);
18440
18441 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018442 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018443 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18444 memAlloc.pNext = NULL;
18445 memAlloc.allocationSize = 0;
18446 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018447
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018448 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018449 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018450 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018451 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018452 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018453 ASSERT_VK_SUCCESS(err);
18454
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018455 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018456 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018457 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018458 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018459 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018460 ASSERT_VK_SUCCESS(err);
18461
18462 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18463 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018464 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018465 ASSERT_VK_SUCCESS(err);
18466
Tony Barbour552f6c02016-12-21 14:34:07 -070018467 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018468 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018469 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18470 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018471 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018472 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018473 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018474 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018475 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018476 resolveRegion.srcOffset.x = 0;
18477 resolveRegion.srcOffset.y = 0;
18478 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018479 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018480 resolveRegion.dstSubresource.mipLevel = 0;
18481 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018482 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018483 resolveRegion.dstOffset.x = 0;
18484 resolveRegion.dstOffset.y = 0;
18485 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018486 resolveRegion.extent.width = 1;
18487 resolveRegion.extent.height = 1;
18488 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018489 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018490 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018491
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018492 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018493
Chia-I Wuf7458c52015-10-26 21:10:41 +080018494 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018495 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018496 vkFreeMemory(m_device->device(), srcMem, NULL);
18497 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018498}
18499
Karl Schultz6addd812016-02-02 17:17:23 -070018500TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
18501 VkResult err;
18502 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018503
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018505 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018506
Tony Barbour1fa09702017-03-16 12:09:08 -060018507 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018508
18509 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018510 VkImage srcImage;
18511 VkImage dstImage;
18512 VkDeviceMemory srcMem;
18513 VkDeviceMemory destMem;
18514 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018515
18516 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018517 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18518 image_create_info.pNext = NULL;
18519 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18520 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18521 image_create_info.extent.width = 32;
18522 image_create_info.extent.height = 1;
18523 image_create_info.extent.depth = 1;
18524 image_create_info.mipLevels = 1;
18525 image_create_info.arrayLayers = 1;
18526 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18527 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18528 // Note: Some implementations expect color attachment usage for any
18529 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018530 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018531 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018532
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018533 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018534 ASSERT_VK_SUCCESS(err);
18535
Karl Schultz6addd812016-02-02 17:17:23 -070018536 // Set format to something other than source image
18537 image_create_info.format = VK_FORMAT_R32_SFLOAT;
18538 // Note: Some implementations expect color attachment usage for any
18539 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018540 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018541 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018542
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018543 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018544 ASSERT_VK_SUCCESS(err);
18545
18546 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018547 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018548 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18549 memAlloc.pNext = NULL;
18550 memAlloc.allocationSize = 0;
18551 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018552
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018553 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018554 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018555 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018556 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018557 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018558 ASSERT_VK_SUCCESS(err);
18559
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018560 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018561 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018562 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018563 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018564 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018565 ASSERT_VK_SUCCESS(err);
18566
18567 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18568 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018569 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018570 ASSERT_VK_SUCCESS(err);
18571
Tony Barbour552f6c02016-12-21 14:34:07 -070018572 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018573 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018574 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18575 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018576 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018577 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018578 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018579 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018580 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018581 resolveRegion.srcOffset.x = 0;
18582 resolveRegion.srcOffset.y = 0;
18583 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018584 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018585 resolveRegion.dstSubresource.mipLevel = 0;
18586 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018587 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018588 resolveRegion.dstOffset.x = 0;
18589 resolveRegion.dstOffset.y = 0;
18590 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018591 resolveRegion.extent.width = 1;
18592 resolveRegion.extent.height = 1;
18593 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018594 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018595 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018596
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018597 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018598
Chia-I Wuf7458c52015-10-26 21:10:41 +080018599 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018600 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018601 vkFreeMemory(m_device->device(), srcMem, NULL);
18602 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018603}
18604
Karl Schultz6addd812016-02-02 17:17:23 -070018605TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
18606 VkResult err;
18607 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018608
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018610 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018611
Tony Barbour1fa09702017-03-16 12:09:08 -060018612 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018613
18614 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018615 VkImage srcImage;
18616 VkImage dstImage;
18617 VkDeviceMemory srcMem;
18618 VkDeviceMemory destMem;
18619 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018620
18621 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018622 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18623 image_create_info.pNext = NULL;
18624 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18625 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18626 image_create_info.extent.width = 32;
18627 image_create_info.extent.height = 1;
18628 image_create_info.extent.depth = 1;
18629 image_create_info.mipLevels = 1;
18630 image_create_info.arrayLayers = 1;
18631 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18632 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18633 // Note: Some implementations expect color attachment usage for any
18634 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018635 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018636 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018637
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018638 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018639 ASSERT_VK_SUCCESS(err);
18640
Karl Schultz6addd812016-02-02 17:17:23 -070018641 image_create_info.imageType = VK_IMAGE_TYPE_1D;
18642 // Note: Some implementations expect color attachment usage for any
18643 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018644 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018645 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018646
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018647 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018648 ASSERT_VK_SUCCESS(err);
18649
18650 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018651 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018652 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18653 memAlloc.pNext = NULL;
18654 memAlloc.allocationSize = 0;
18655 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018656
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018657 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018658 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018659 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018660 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018661 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018662 ASSERT_VK_SUCCESS(err);
18663
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018664 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018665 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018666 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018667 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018668 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018669 ASSERT_VK_SUCCESS(err);
18670
18671 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18672 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018673 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018674 ASSERT_VK_SUCCESS(err);
18675
Tony Barbour552f6c02016-12-21 14:34:07 -070018676 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018677 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018678 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18679 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018680 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018681 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018682 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018683 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018684 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018685 resolveRegion.srcOffset.x = 0;
18686 resolveRegion.srcOffset.y = 0;
18687 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018688 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018689 resolveRegion.dstSubresource.mipLevel = 0;
18690 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018691 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018692 resolveRegion.dstOffset.x = 0;
18693 resolveRegion.dstOffset.y = 0;
18694 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018695 resolveRegion.extent.width = 1;
18696 resolveRegion.extent.height = 1;
18697 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018698 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018699 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018700
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018701 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018702
Chia-I Wuf7458c52015-10-26 21:10:41 +080018703 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018704 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018705 vkFreeMemory(m_device->device(), srcMem, NULL);
18706 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018707}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018708
Karl Schultz6addd812016-02-02 17:17:23 -070018709TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018710 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018711 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18712 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018713 // The image format check comes 2nd in validation so we trigger it first,
18714 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018715 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018716
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18718 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018719
Tony Barbour1fa09702017-03-16 12:09:08 -060018720 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018721 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018722 if (!depth_format) {
18723 return;
18724 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018725
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018726 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018727 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18728 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018729
18730 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018731 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18732 ds_pool_ci.pNext = NULL;
18733 ds_pool_ci.maxSets = 1;
18734 ds_pool_ci.poolSizeCount = 1;
18735 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018736
18737 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018738 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018739 ASSERT_VK_SUCCESS(err);
18740
18741 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018742 dsl_binding.binding = 0;
18743 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18744 dsl_binding.descriptorCount = 1;
18745 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18746 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018747
18748 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018749 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18750 ds_layout_ci.pNext = NULL;
18751 ds_layout_ci.bindingCount = 1;
18752 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018753 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018754 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018755 ASSERT_VK_SUCCESS(err);
18756
18757 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018758 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018759 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018760 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018761 alloc_info.descriptorPool = ds_pool;
18762 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018763 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018764 ASSERT_VK_SUCCESS(err);
18765
Karl Schultz6addd812016-02-02 17:17:23 -070018766 VkImage image_bad;
18767 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018768 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018769 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018770 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018771 const int32_t tex_width = 32;
18772 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018773
18774 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018775 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18776 image_create_info.pNext = NULL;
18777 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18778 image_create_info.format = tex_format_bad;
18779 image_create_info.extent.width = tex_width;
18780 image_create_info.extent.height = tex_height;
18781 image_create_info.extent.depth = 1;
18782 image_create_info.mipLevels = 1;
18783 image_create_info.arrayLayers = 1;
18784 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18785 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018786 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018787 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018788
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018789 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018790 ASSERT_VK_SUCCESS(err);
18791 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018792 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18793 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018794 ASSERT_VK_SUCCESS(err);
18795
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018796 // ---Bind image memory---
18797 VkMemoryRequirements img_mem_reqs;
18798 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18799 VkMemoryAllocateInfo image_alloc_info = {};
18800 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18801 image_alloc_info.pNext = NULL;
18802 image_alloc_info.memoryTypeIndex = 0;
18803 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018804 bool pass =
18805 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 -070018806 ASSERT_TRUE(pass);
18807 VkDeviceMemory mem;
18808 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18809 ASSERT_VK_SUCCESS(err);
18810 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18811 ASSERT_VK_SUCCESS(err);
18812 // -----------------------
18813
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018814 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018815 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018816 image_view_create_info.image = image_bad;
18817 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18818 image_view_create_info.format = tex_format_bad;
18819 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18820 image_view_create_info.subresourceRange.baseMipLevel = 0;
18821 image_view_create_info.subresourceRange.layerCount = 1;
18822 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018823 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018824
18825 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018826 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018827
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018828 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018829
Chia-I Wuf7458c52015-10-26 21:10:41 +080018830 vkDestroyImage(m_device->device(), image_bad, NULL);
18831 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018832 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18833 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018834
18835 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018836}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018837
18838TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018839 TEST_DESCRIPTION(
18840 "Call ClearColorImage w/ a depth|stencil image and "
18841 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018842
Tony Barbour1fa09702017-03-16 12:09:08 -060018843 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018844 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018845 if (!depth_format) {
18846 return;
18847 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018848 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18849
Tony Barbour552f6c02016-12-21 14:34:07 -070018850 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018851
18852 // Color image
18853 VkClearColorValue clear_color;
18854 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18855 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18856 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18857 const int32_t img_width = 32;
18858 const int32_t img_height = 32;
18859 VkImageCreateInfo image_create_info = {};
18860 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18861 image_create_info.pNext = NULL;
18862 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18863 image_create_info.format = color_format;
18864 image_create_info.extent.width = img_width;
18865 image_create_info.extent.height = img_height;
18866 image_create_info.extent.depth = 1;
18867 image_create_info.mipLevels = 1;
18868 image_create_info.arrayLayers = 1;
18869 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18870 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18871 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18872
18873 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018874 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018875
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018876 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018877
18878 // Depth/Stencil image
18879 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018880 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018881 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18882 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018883 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018884 ds_image_create_info.extent.width = 64;
18885 ds_image_create_info.extent.height = 64;
18886 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018887 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 -060018888
18889 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018890 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018891
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018892 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 -060018893
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018895
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018896 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018897 &color_range);
18898
18899 m_errorMonitor->VerifyFound();
18900
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18902 "vkCmdClearColorImage called with "
18903 "image created without "
18904 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018905
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018906 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018907 &color_range);
18908
18909 m_errorMonitor->VerifyFound();
18910
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018911 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18913 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018914
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018915 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18916 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018917
18918 m_errorMonitor->VerifyFound();
18919}
Tobin Ehliscde08892015-09-22 10:11:37 -060018920
Mike Schuchardt35fece12017-03-07 14:40:28 -070018921TEST_F(VkLayerTest, CommandQueueFlags) {
18922 TEST_DESCRIPTION(
18923 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18924 "graphics-only command");
18925
18926 ASSERT_NO_FATAL_FAILURE(Init());
18927
18928 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018929 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018930 printf(" Non-graphics queue family not found; skipped.\n");
18931 return;
18932 } else {
18933 // Create command pool on a non-graphics queue
18934 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18935
18936 // Setup command buffer on pool
18937 VkCommandBufferObj command_buffer(m_device, &command_pool);
18938 command_buffer.BeginCommandBuffer();
18939
18940 // Issue a graphics only command
18941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18942 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18943 command_buffer.SetViewport(0, 1, &viewport);
18944 m_errorMonitor->VerifyFound();
18945 }
18946}
18947
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018948// WSI Enabled Tests
18949//
Chris Forbes09368e42016-10-13 11:59:22 +130018950#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018951TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18952
18953#if defined(VK_USE_PLATFORM_XCB_KHR)
18954 VkSurfaceKHR surface = VK_NULL_HANDLE;
18955
18956 VkResult err;
18957 bool pass;
18958 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18959 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18960 // uint32_t swapchain_image_count = 0;
18961 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18962 // uint32_t image_index = 0;
18963 // VkPresentInfoKHR present_info = {};
18964
Tony Barbour1fa09702017-03-16 12:09:08 -060018965 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018966
18967 // Use the create function from one of the VK_KHR_*_surface extension in
18968 // order to create a surface, testing all known errors in the process,
18969 // before successfully creating a surface:
18970 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18972 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18973 pass = (err != VK_SUCCESS);
18974 ASSERT_TRUE(pass);
18975 m_errorMonitor->VerifyFound();
18976
18977 // Next, try to create a surface with the wrong
18978 // VkXcbSurfaceCreateInfoKHR::sType:
18979 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18980 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18982 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18983 pass = (err != VK_SUCCESS);
18984 ASSERT_TRUE(pass);
18985 m_errorMonitor->VerifyFound();
18986
18987 // Create a native window, and then correctly create a surface:
18988 xcb_connection_t *connection;
18989 xcb_screen_t *screen;
18990 xcb_window_t xcb_window;
18991 xcb_intern_atom_reply_t *atom_wm_delete_window;
18992
18993 const xcb_setup_t *setup;
18994 xcb_screen_iterator_t iter;
18995 int scr;
18996 uint32_t value_mask, value_list[32];
18997 int width = 1;
18998 int height = 1;
18999
19000 connection = xcb_connect(NULL, &scr);
19001 ASSERT_TRUE(connection != NULL);
19002 setup = xcb_get_setup(connection);
19003 iter = xcb_setup_roots_iterator(setup);
19004 while (scr-- > 0)
19005 xcb_screen_next(&iter);
19006 screen = iter.data;
19007
19008 xcb_window = xcb_generate_id(connection);
19009
19010 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
19011 value_list[0] = screen->black_pixel;
19012 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
19013
19014 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
19015 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
19016
19017 /* Magic code that will send notification when window is destroyed */
19018 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
19019 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
19020
19021 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
19022 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
19023 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
19024 free(reply);
19025
19026 xcb_map_window(connection, xcb_window);
19027
19028 // Force the x/y coordinates to 100,100 results are identical in consecutive
19029 // runs
19030 const uint32_t coords[] = { 100, 100 };
19031 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
19032
19033 // Finally, try to correctly create a surface:
19034 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
19035 xcb_create_info.pNext = NULL;
19036 xcb_create_info.flags = 0;
19037 xcb_create_info.connection = connection;
19038 xcb_create_info.window = xcb_window;
19039 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19040 pass = (err == VK_SUCCESS);
19041 ASSERT_TRUE(pass);
19042
19043 // Check if surface supports presentation:
19044
19045 // 1st, do so without having queried the queue families:
19046 VkBool32 supported = false;
19047 // TODO: Get the following error to come out:
19048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19049 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
19050 "function");
19051 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19052 pass = (err != VK_SUCCESS);
19053 // ASSERT_TRUE(pass);
19054 // m_errorMonitor->VerifyFound();
19055
19056 // Next, query a queue family index that's too large:
19057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19058 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
19059 pass = (err != VK_SUCCESS);
19060 ASSERT_TRUE(pass);
19061 m_errorMonitor->VerifyFound();
19062
19063 // Finally, do so correctly:
19064 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19065 // SUPPORTED
19066 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19067 pass = (err == VK_SUCCESS);
19068 ASSERT_TRUE(pass);
19069
19070 // Before proceeding, try to create a swapchain without having called
19071 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
19072 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19073 swapchain_create_info.pNext = NULL;
19074 swapchain_create_info.flags = 0;
19075 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
19076 swapchain_create_info.surface = surface;
19077 swapchain_create_info.imageArrayLayers = 1;
19078 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
19079 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
19080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19081 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
19082 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19083 pass = (err != VK_SUCCESS);
19084 ASSERT_TRUE(pass);
19085 m_errorMonitor->VerifyFound();
19086
19087 // Get the surface capabilities:
19088 VkSurfaceCapabilitiesKHR surface_capabilities;
19089
19090 // Do so correctly (only error logged by this entrypoint is if the
19091 // extension isn't enabled):
19092 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
19093 pass = (err == VK_SUCCESS);
19094 ASSERT_TRUE(pass);
19095
19096 // Get the surface formats:
19097 uint32_t surface_format_count;
19098
19099 // First, try without a pointer to surface_format_count:
19100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
19101 "specified as NULL");
19102 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
19103 pass = (err == VK_SUCCESS);
19104 ASSERT_TRUE(pass);
19105 m_errorMonitor->VerifyFound();
19106
19107 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
19108 // correctly done a 1st try (to get the count):
19109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19110 surface_format_count = 0;
19111 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
19112 pass = (err == VK_SUCCESS);
19113 ASSERT_TRUE(pass);
19114 m_errorMonitor->VerifyFound();
19115
19116 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19117 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19118 pass = (err == VK_SUCCESS);
19119 ASSERT_TRUE(pass);
19120
19121 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19122 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
19123
19124 // Next, do a 2nd try with surface_format_count being set too high:
19125 surface_format_count += 5;
19126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19127 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19128 pass = (err == VK_SUCCESS);
19129 ASSERT_TRUE(pass);
19130 m_errorMonitor->VerifyFound();
19131
19132 // Finally, do a correct 1st and 2nd try:
19133 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19134 pass = (err == VK_SUCCESS);
19135 ASSERT_TRUE(pass);
19136 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19137 pass = (err == VK_SUCCESS);
19138 ASSERT_TRUE(pass);
19139
19140 // Get the surface present modes:
19141 uint32_t surface_present_mode_count;
19142
19143 // First, try without a pointer to surface_format_count:
19144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
19145 "specified as NULL");
19146
19147 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
19148 pass = (err == VK_SUCCESS);
19149 ASSERT_TRUE(pass);
19150 m_errorMonitor->VerifyFound();
19151
19152 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
19153 // correctly done a 1st try (to get the count):
19154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19155 surface_present_mode_count = 0;
19156 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
19157 (VkPresentModeKHR *)&surface_present_mode_count);
19158 pass = (err == VK_SUCCESS);
19159 ASSERT_TRUE(pass);
19160 m_errorMonitor->VerifyFound();
19161
19162 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19163 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19164 pass = (err == VK_SUCCESS);
19165 ASSERT_TRUE(pass);
19166
19167 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19168 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
19169
19170 // Next, do a 2nd try with surface_format_count being set too high:
19171 surface_present_mode_count += 5;
19172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19173 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19174 pass = (err == VK_SUCCESS);
19175 ASSERT_TRUE(pass);
19176 m_errorMonitor->VerifyFound();
19177
19178 // Finally, do a correct 1st and 2nd try:
19179 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19180 pass = (err == VK_SUCCESS);
19181 ASSERT_TRUE(pass);
19182 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19183 pass = (err == VK_SUCCESS);
19184 ASSERT_TRUE(pass);
19185
19186 // Create a swapchain:
19187
19188 // First, try without a pointer to swapchain_create_info:
19189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
19190 "specified as NULL");
19191
19192 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
19193 pass = (err != VK_SUCCESS);
19194 ASSERT_TRUE(pass);
19195 m_errorMonitor->VerifyFound();
19196
19197 // Next, call with a non-NULL swapchain_create_info, that has the wrong
19198 // sType:
19199 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19201
19202 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19203 pass = (err != VK_SUCCESS);
19204 ASSERT_TRUE(pass);
19205 m_errorMonitor->VerifyFound();
19206
19207 // Next, call with a NULL swapchain pointer:
19208 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19209 swapchain_create_info.pNext = NULL;
19210 swapchain_create_info.flags = 0;
19211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
19212 "specified as NULL");
19213
19214 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
19215 pass = (err != VK_SUCCESS);
19216 ASSERT_TRUE(pass);
19217 m_errorMonitor->VerifyFound();
19218
19219 // TODO: Enhance swapchain layer so that
19220 // swapchain_create_info.queueFamilyIndexCount is checked against something?
19221
19222 // Next, call with a queue family index that's too large:
19223 uint32_t queueFamilyIndex[2] = { 100000, 0 };
19224 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19225 swapchain_create_info.queueFamilyIndexCount = 2;
19226 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
19227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19228 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19229 pass = (err != VK_SUCCESS);
19230 ASSERT_TRUE(pass);
19231 m_errorMonitor->VerifyFound();
19232
19233 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
19234 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19235 swapchain_create_info.queueFamilyIndexCount = 1;
19236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19237 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
19238 "pCreateInfo->pQueueFamilyIndices).");
19239 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19240 pass = (err != VK_SUCCESS);
19241 ASSERT_TRUE(pass);
19242 m_errorMonitor->VerifyFound();
19243
19244 // Next, call with an invalid imageSharingMode:
19245 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
19246 swapchain_create_info.queueFamilyIndexCount = 1;
19247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19248 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
19249 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19250 pass = (err != VK_SUCCESS);
19251 ASSERT_TRUE(pass);
19252 m_errorMonitor->VerifyFound();
19253 // Fix for the future:
19254 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19255 // SUPPORTED
19256 swapchain_create_info.queueFamilyIndexCount = 0;
19257 queueFamilyIndex[0] = 0;
19258 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
19259
19260 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
19261 // Get the images from a swapchain:
19262 // Acquire an image from a swapchain:
19263 // Present an image to a swapchain:
19264 // Destroy the swapchain:
19265
19266 // TODOs:
19267 //
19268 // - Try destroying the device without first destroying the swapchain
19269 //
19270 // - Try destroying the device without first destroying the surface
19271 //
19272 // - Try destroying the surface without first destroying the swapchain
19273
19274 // Destroy the surface:
19275 vkDestroySurfaceKHR(instance(), surface, NULL);
19276
19277 // Tear down the window:
19278 xcb_destroy_window(connection, xcb_window);
19279 xcb_disconnect(connection);
19280
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019281#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019282 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019283#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019284}
Chris Forbes09368e42016-10-13 11:59:22 +130019285#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019286
19287//
19288// POSITIVE VALIDATION TESTS
19289//
19290// These tests do not expect to encounter ANY validation errors pass only if this is true
19291
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019292TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
19293 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060019294 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019295 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19296
19297 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19298 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019299 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019300 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19301 command_buffer_allocate_info.commandBufferCount = 1;
19302
19303 VkCommandBuffer secondary_command_buffer;
19304 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19305 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19306 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19307 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19308 command_buffer_inheritance_info.renderPass = m_renderPass;
19309 command_buffer_inheritance_info.framebuffer = m_framebuffer;
19310
19311 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19312 command_buffer_begin_info.flags =
19313 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
19314 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19315
19316 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19317 VkClearAttachment color_attachment;
19318 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19319 color_attachment.clearValue.color.float32[0] = 0;
19320 color_attachment.clearValue.color.float32[1] = 0;
19321 color_attachment.clearValue.color.float32[2] = 0;
19322 color_attachment.clearValue.color.float32[3] = 0;
19323 color_attachment.colorAttachment = 0;
19324 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
19325 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
19326}
19327
Tobin Ehlise0006882016-11-03 10:14:28 -060019328TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019329 TEST_DESCRIPTION(
19330 "Perform an image layout transition in a secondary command buffer followed "
19331 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060019332 VkResult err;
19333 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060019334 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060019335 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070019336 if (!depth_format) {
19337 return;
19338 }
Tobin Ehlise0006882016-11-03 10:14:28 -060019339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19340 // Allocate a secondary and primary cmd buffer
19341 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19342 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019343 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060019344 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19345 command_buffer_allocate_info.commandBufferCount = 1;
19346
19347 VkCommandBuffer secondary_command_buffer;
19348 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19349 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19350 VkCommandBuffer primary_command_buffer;
19351 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19352 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19353 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19354 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19355 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19356 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
19357 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19358
19359 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19360 ASSERT_VK_SUCCESS(err);
19361 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019362 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 -060019363 ASSERT_TRUE(image.initialized());
19364 VkImageMemoryBarrier img_barrier = {};
19365 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19366 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19367 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19368 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
19369 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19370 img_barrier.image = image.handle();
19371 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19372 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19373 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19374 img_barrier.subresourceRange.baseArrayLayer = 0;
19375 img_barrier.subresourceRange.baseMipLevel = 0;
19376 img_barrier.subresourceRange.layerCount = 1;
19377 img_barrier.subresourceRange.levelCount = 1;
19378 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
19379 0, nullptr, 1, &img_barrier);
19380 err = vkEndCommandBuffer(secondary_command_buffer);
19381 ASSERT_VK_SUCCESS(err);
19382
19383 // Now update primary cmd buffer to execute secondary and transitions image
19384 command_buffer_begin_info.pInheritanceInfo = nullptr;
19385 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
19386 ASSERT_VK_SUCCESS(err);
19387 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
19388 VkImageMemoryBarrier img_barrier2 = {};
19389 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19390 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19391 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19392 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19393 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19394 img_barrier2.image = image.handle();
19395 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19396 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19397 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19398 img_barrier2.subresourceRange.baseArrayLayer = 0;
19399 img_barrier2.subresourceRange.baseMipLevel = 0;
19400 img_barrier2.subresourceRange.layerCount = 1;
19401 img_barrier2.subresourceRange.levelCount = 1;
19402 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
19403 nullptr, 1, &img_barrier2);
19404 err = vkEndCommandBuffer(primary_command_buffer);
19405 ASSERT_VK_SUCCESS(err);
19406 VkSubmitInfo submit_info = {};
19407 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19408 submit_info.commandBufferCount = 1;
19409 submit_info.pCommandBuffers = &primary_command_buffer;
19410 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19411 ASSERT_VK_SUCCESS(err);
19412 m_errorMonitor->VerifyNotFound();
19413 err = vkDeviceWaitIdle(m_device->device());
19414 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070019415 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
19416 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060019417}
19418
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019419// This is a positive test. No failures are expected.
19420TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019421 TEST_DESCRIPTION(
19422 "Ensure that the vkUpdateDescriptorSets validation code "
19423 "is ignoring VkWriteDescriptorSet members that are not "
19424 "related to the descriptor type specified by "
19425 "VkWriteDescriptorSet::descriptorType. Correct "
19426 "validation behavior will result in the test running to "
19427 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019428
19429 const uintptr_t invalid_ptr = 0xcdcdcdcd;
19430
Tony Barbour1fa09702017-03-16 12:09:08 -060019431 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019432
19433 // Image Case
19434 {
19435 m_errorMonitor->ExpectSuccess();
19436
19437 VkImage image;
19438 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
19439 const int32_t tex_width = 32;
19440 const int32_t tex_height = 32;
19441 VkImageCreateInfo image_create_info = {};
19442 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19443 image_create_info.pNext = NULL;
19444 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19445 image_create_info.format = tex_format;
19446 image_create_info.extent.width = tex_width;
19447 image_create_info.extent.height = tex_height;
19448 image_create_info.extent.depth = 1;
19449 image_create_info.mipLevels = 1;
19450 image_create_info.arrayLayers = 1;
19451 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19452 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19453 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
19454 image_create_info.flags = 0;
19455 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19456 ASSERT_VK_SUCCESS(err);
19457
19458 VkMemoryRequirements memory_reqs;
19459 VkDeviceMemory image_memory;
19460 bool pass;
19461 VkMemoryAllocateInfo memory_info = {};
19462 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19463 memory_info.pNext = NULL;
19464 memory_info.allocationSize = 0;
19465 memory_info.memoryTypeIndex = 0;
19466 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19467 memory_info.allocationSize = memory_reqs.size;
19468 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19469 ASSERT_TRUE(pass);
19470 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
19471 ASSERT_VK_SUCCESS(err);
19472 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
19473 ASSERT_VK_SUCCESS(err);
19474
19475 VkImageViewCreateInfo image_view_create_info = {};
19476 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19477 image_view_create_info.image = image;
19478 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
19479 image_view_create_info.format = tex_format;
19480 image_view_create_info.subresourceRange.layerCount = 1;
19481 image_view_create_info.subresourceRange.baseMipLevel = 0;
19482 image_view_create_info.subresourceRange.levelCount = 1;
19483 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19484
19485 VkImageView view;
19486 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
19487 ASSERT_VK_SUCCESS(err);
19488
19489 VkDescriptorPoolSize ds_type_count = {};
19490 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19491 ds_type_count.descriptorCount = 1;
19492
19493 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19494 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19495 ds_pool_ci.pNext = NULL;
19496 ds_pool_ci.maxSets = 1;
19497 ds_pool_ci.poolSizeCount = 1;
19498 ds_pool_ci.pPoolSizes = &ds_type_count;
19499
19500 VkDescriptorPool ds_pool;
19501 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19502 ASSERT_VK_SUCCESS(err);
19503
19504 VkDescriptorSetLayoutBinding dsl_binding = {};
19505 dsl_binding.binding = 0;
19506 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19507 dsl_binding.descriptorCount = 1;
19508 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19509 dsl_binding.pImmutableSamplers = NULL;
19510
19511 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19512 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19513 ds_layout_ci.pNext = NULL;
19514 ds_layout_ci.bindingCount = 1;
19515 ds_layout_ci.pBindings = &dsl_binding;
19516 VkDescriptorSetLayout ds_layout;
19517 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19518 ASSERT_VK_SUCCESS(err);
19519
19520 VkDescriptorSet descriptor_set;
19521 VkDescriptorSetAllocateInfo alloc_info = {};
19522 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19523 alloc_info.descriptorSetCount = 1;
19524 alloc_info.descriptorPool = ds_pool;
19525 alloc_info.pSetLayouts = &ds_layout;
19526 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19527 ASSERT_VK_SUCCESS(err);
19528
19529 VkDescriptorImageInfo image_info = {};
19530 image_info.imageView = view;
19531 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
19532
19533 VkWriteDescriptorSet descriptor_write;
19534 memset(&descriptor_write, 0, sizeof(descriptor_write));
19535 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19536 descriptor_write.dstSet = descriptor_set;
19537 descriptor_write.dstBinding = 0;
19538 descriptor_write.descriptorCount = 1;
19539 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19540 descriptor_write.pImageInfo = &image_info;
19541
19542 // Set pBufferInfo and pTexelBufferView to invalid values, which should
19543 // be
19544 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
19545 // This will most likely produce a crash if the parameter_validation
19546 // layer
19547 // does not correctly ignore pBufferInfo.
19548 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19549 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19550
19551 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19552
19553 m_errorMonitor->VerifyNotFound();
19554
19555 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19556 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19557 vkDestroyImageView(m_device->device(), view, NULL);
19558 vkDestroyImage(m_device->device(), image, NULL);
19559 vkFreeMemory(m_device->device(), image_memory, NULL);
19560 }
19561
19562 // Buffer Case
19563 {
19564 m_errorMonitor->ExpectSuccess();
19565
19566 VkBuffer buffer;
19567 uint32_t queue_family_index = 0;
19568 VkBufferCreateInfo buffer_create_info = {};
19569 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19570 buffer_create_info.size = 1024;
19571 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19572 buffer_create_info.queueFamilyIndexCount = 1;
19573 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19574
19575 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19576 ASSERT_VK_SUCCESS(err);
19577
19578 VkMemoryRequirements memory_reqs;
19579 VkDeviceMemory buffer_memory;
19580 bool pass;
19581 VkMemoryAllocateInfo memory_info = {};
19582 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19583 memory_info.pNext = NULL;
19584 memory_info.allocationSize = 0;
19585 memory_info.memoryTypeIndex = 0;
19586
19587 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19588 memory_info.allocationSize = memory_reqs.size;
19589 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19590 ASSERT_TRUE(pass);
19591
19592 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19593 ASSERT_VK_SUCCESS(err);
19594 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19595 ASSERT_VK_SUCCESS(err);
19596
19597 VkDescriptorPoolSize ds_type_count = {};
19598 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19599 ds_type_count.descriptorCount = 1;
19600
19601 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19602 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19603 ds_pool_ci.pNext = NULL;
19604 ds_pool_ci.maxSets = 1;
19605 ds_pool_ci.poolSizeCount = 1;
19606 ds_pool_ci.pPoolSizes = &ds_type_count;
19607
19608 VkDescriptorPool ds_pool;
19609 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19610 ASSERT_VK_SUCCESS(err);
19611
19612 VkDescriptorSetLayoutBinding dsl_binding = {};
19613 dsl_binding.binding = 0;
19614 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19615 dsl_binding.descriptorCount = 1;
19616 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19617 dsl_binding.pImmutableSamplers = NULL;
19618
19619 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19620 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19621 ds_layout_ci.pNext = NULL;
19622 ds_layout_ci.bindingCount = 1;
19623 ds_layout_ci.pBindings = &dsl_binding;
19624 VkDescriptorSetLayout ds_layout;
19625 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19626 ASSERT_VK_SUCCESS(err);
19627
19628 VkDescriptorSet descriptor_set;
19629 VkDescriptorSetAllocateInfo alloc_info = {};
19630 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19631 alloc_info.descriptorSetCount = 1;
19632 alloc_info.descriptorPool = ds_pool;
19633 alloc_info.pSetLayouts = &ds_layout;
19634 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19635 ASSERT_VK_SUCCESS(err);
19636
19637 VkDescriptorBufferInfo buffer_info = {};
19638 buffer_info.buffer = buffer;
19639 buffer_info.offset = 0;
19640 buffer_info.range = 1024;
19641
19642 VkWriteDescriptorSet descriptor_write;
19643 memset(&descriptor_write, 0, sizeof(descriptor_write));
19644 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19645 descriptor_write.dstSet = descriptor_set;
19646 descriptor_write.dstBinding = 0;
19647 descriptor_write.descriptorCount = 1;
19648 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19649 descriptor_write.pBufferInfo = &buffer_info;
19650
19651 // Set pImageInfo and pTexelBufferView to invalid values, which should
19652 // be
19653 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
19654 // This will most likely produce a crash if the parameter_validation
19655 // layer
19656 // does not correctly ignore pImageInfo.
19657 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19658 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19659
19660 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19661
19662 m_errorMonitor->VerifyNotFound();
19663
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019664 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19665 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19666 vkDestroyBuffer(m_device->device(), buffer, NULL);
19667 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19668 }
19669
19670 // Texel Buffer Case
19671 {
19672 m_errorMonitor->ExpectSuccess();
19673
19674 VkBuffer buffer;
19675 uint32_t queue_family_index = 0;
19676 VkBufferCreateInfo buffer_create_info = {};
19677 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19678 buffer_create_info.size = 1024;
19679 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
19680 buffer_create_info.queueFamilyIndexCount = 1;
19681 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19682
19683 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19684 ASSERT_VK_SUCCESS(err);
19685
19686 VkMemoryRequirements memory_reqs;
19687 VkDeviceMemory buffer_memory;
19688 bool pass;
19689 VkMemoryAllocateInfo memory_info = {};
19690 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19691 memory_info.pNext = NULL;
19692 memory_info.allocationSize = 0;
19693 memory_info.memoryTypeIndex = 0;
19694
19695 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19696 memory_info.allocationSize = memory_reqs.size;
19697 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19698 ASSERT_TRUE(pass);
19699
19700 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19701 ASSERT_VK_SUCCESS(err);
19702 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19703 ASSERT_VK_SUCCESS(err);
19704
19705 VkBufferViewCreateInfo buff_view_ci = {};
19706 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
19707 buff_view_ci.buffer = buffer;
19708 buff_view_ci.format = VK_FORMAT_R8_UNORM;
19709 buff_view_ci.range = VK_WHOLE_SIZE;
19710 VkBufferView buffer_view;
19711 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19712
19713 VkDescriptorPoolSize ds_type_count = {};
19714 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19715 ds_type_count.descriptorCount = 1;
19716
19717 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19718 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19719 ds_pool_ci.pNext = NULL;
19720 ds_pool_ci.maxSets = 1;
19721 ds_pool_ci.poolSizeCount = 1;
19722 ds_pool_ci.pPoolSizes = &ds_type_count;
19723
19724 VkDescriptorPool ds_pool;
19725 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19726 ASSERT_VK_SUCCESS(err);
19727
19728 VkDescriptorSetLayoutBinding dsl_binding = {};
19729 dsl_binding.binding = 0;
19730 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19731 dsl_binding.descriptorCount = 1;
19732 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19733 dsl_binding.pImmutableSamplers = NULL;
19734
19735 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19736 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19737 ds_layout_ci.pNext = NULL;
19738 ds_layout_ci.bindingCount = 1;
19739 ds_layout_ci.pBindings = &dsl_binding;
19740 VkDescriptorSetLayout ds_layout;
19741 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19742 ASSERT_VK_SUCCESS(err);
19743
19744 VkDescriptorSet descriptor_set;
19745 VkDescriptorSetAllocateInfo alloc_info = {};
19746 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19747 alloc_info.descriptorSetCount = 1;
19748 alloc_info.descriptorPool = ds_pool;
19749 alloc_info.pSetLayouts = &ds_layout;
19750 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19751 ASSERT_VK_SUCCESS(err);
19752
19753 VkWriteDescriptorSet descriptor_write;
19754 memset(&descriptor_write, 0, sizeof(descriptor_write));
19755 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19756 descriptor_write.dstSet = descriptor_set;
19757 descriptor_write.dstBinding = 0;
19758 descriptor_write.descriptorCount = 1;
19759 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19760 descriptor_write.pTexelBufferView = &buffer_view;
19761
19762 // Set pImageInfo and pBufferInfo to invalid values, which should be
19763 // ignored for descriptorType ==
19764 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19765 // This will most likely produce a crash if the parameter_validation
19766 // layer
19767 // does not correctly ignore pImageInfo and pBufferInfo.
19768 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19769 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19770
19771 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19772
19773 m_errorMonitor->VerifyNotFound();
19774
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019775 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19776 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19777 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19778 vkDestroyBuffer(m_device->device(), buffer, NULL);
19779 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19780 }
19781}
19782
Tobin Ehlis8893af82017-05-08 12:52:25 -060019783TEST_F(VkPositiveLayerTest, ImmutableSamplerOnlyDescriptor) {
19784 TEST_DESCRIPTION(
19785 "Bind a DescriptorSet with only an immutable sampler"
19786 "and make sure that we don't warn for no update.");
19787
19788 ASSERT_NO_FATAL_FAILURE(Init());
19789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19790
19791 VkDescriptorPoolSize ds_type_count = {};
19792 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
19793 ds_type_count.descriptorCount = 1;
19794
19795 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19796 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19797 ds_pool_ci.maxSets = 1;
19798 ds_pool_ci.poolSizeCount = 1;
19799 ds_pool_ci.pPoolSizes = &ds_type_count;
19800
19801 VkDescriptorPool ds_pool;
19802 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19803 ASSERT_VK_SUCCESS(err);
19804
19805 VkSamplerCreateInfo sampler_ci = {};
19806 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
19807 sampler_ci.pNext = NULL;
19808 sampler_ci.magFilter = VK_FILTER_NEAREST;
19809 sampler_ci.minFilter = VK_FILTER_NEAREST;
19810 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
19811 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19812 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19813 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19814 sampler_ci.mipLodBias = 1.0;
19815 sampler_ci.anisotropyEnable = VK_FALSE;
19816 sampler_ci.maxAnisotropy = 1;
19817 sampler_ci.compareEnable = VK_FALSE;
19818 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
19819 sampler_ci.minLod = 1.0;
19820 sampler_ci.maxLod = 1.0;
19821 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
19822 sampler_ci.unnormalizedCoordinates = VK_FALSE;
19823 VkSampler sampler;
19824
19825 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
19826 ASSERT_VK_SUCCESS(err);
19827
19828 VkDescriptorSetLayoutBinding layout_binding = {};
19829 layout_binding.binding = 0;
19830 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
19831 layout_binding.descriptorCount = 1;
19832 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19833 layout_binding.pImmutableSamplers = static_cast<VkSampler *>(&sampler);
19834
19835 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19836 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19837 ds_layout_ci.bindingCount = 1;
19838 ds_layout_ci.pBindings = &layout_binding;
19839 VkDescriptorSetLayout ds_layout;
19840 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19841 ASSERT_VK_SUCCESS(err);
19842
19843 VkDescriptorSetAllocateInfo alloc_info = {};
19844 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19845 alloc_info.descriptorSetCount = 1;
19846 alloc_info.descriptorPool = ds_pool;
19847 alloc_info.pSetLayouts = &ds_layout;
19848 VkDescriptorSet descriptor_set;
19849 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19850 ASSERT_VK_SUCCESS(err);
19851
19852 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19853 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19854 pipeline_layout_ci.pNext = NULL;
19855 pipeline_layout_ci.setLayoutCount = 1;
19856 pipeline_layout_ci.pSetLayouts = &ds_layout;
19857
19858 VkPipelineLayout pipeline_layout;
19859 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19860 ASSERT_VK_SUCCESS(err);
19861
19862 m_errorMonitor->ExpectSuccess();
19863 m_commandBuffer->BeginCommandBuffer();
19864 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
19865
19866 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19867 &descriptor_set, 0, nullptr);
19868 m_errorMonitor->VerifyNotFound();
19869
19870 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19871 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19872 vkDestroySampler(m_device->device(), sampler, NULL);
19873 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19874}
19875
Tobin Ehlisf7428442016-10-25 07:58:24 -060019876TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19877 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19878
Tony Barbour1fa09702017-03-16 12:09:08 -060019879 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019880 // Create layout where two binding #s are "1"
19881 static const uint32_t NUM_BINDINGS = 3;
19882 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19883 dsl_binding[0].binding = 1;
19884 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19885 dsl_binding[0].descriptorCount = 1;
19886 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19887 dsl_binding[0].pImmutableSamplers = NULL;
19888 dsl_binding[1].binding = 0;
19889 dsl_binding[1].descriptorCount = 1;
19890 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19891 dsl_binding[1].descriptorCount = 1;
19892 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19893 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019894 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019895 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19896 dsl_binding[2].descriptorCount = 1;
19897 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19898 dsl_binding[2].pImmutableSamplers = NULL;
19899
19900 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19901 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19902 ds_layout_ci.pNext = NULL;
19903 ds_layout_ci.bindingCount = NUM_BINDINGS;
19904 ds_layout_ci.pBindings = dsl_binding;
19905 VkDescriptorSetLayout ds_layout;
19906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19907 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19908 m_errorMonitor->VerifyFound();
19909}
19910
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019911TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019912 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19913
Tony Barbour1fa09702017-03-16 12:09:08 -060019914 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019915
Tony Barbour552f6c02016-12-21 14:34:07 -070019916 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019917
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019918 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19919
19920 {
19921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19922 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19923 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19924 m_errorMonitor->VerifyFound();
19925 }
19926
19927 {
19928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19929 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19930 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19931 m_errorMonitor->VerifyFound();
19932 }
19933
19934 {
19935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19936 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
19937 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19938 m_errorMonitor->VerifyFound();
19939 }
19940
19941 {
19942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19943 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
19944 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19945 m_errorMonitor->VerifyFound();
19946 }
19947
19948 {
19949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
19950 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
19951 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19952 m_errorMonitor->VerifyFound();
19953 }
19954
19955 {
19956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
19957 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19958 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19959 m_errorMonitor->VerifyFound();
19960 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019961
19962 {
19963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19964 VkRect2D scissor = {{-1, 0}, {16, 16}};
19965 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19966 m_errorMonitor->VerifyFound();
19967 }
19968
19969 {
19970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19971 VkRect2D scissor = {{0, -2}, {16, 16}};
19972 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19973 m_errorMonitor->VerifyFound();
19974 }
19975
19976 {
19977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19978 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
19979 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19980 m_errorMonitor->VerifyFound();
19981 }
19982
19983 {
19984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
19985 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19986 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19987 m_errorMonitor->VerifyFound();
19988 }
19989
Tony Barbour552f6c02016-12-21 14:34:07 -070019990 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019991}
19992
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019993// This is a positive test. No failures are expected.
19994TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19995 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19996 VkResult err;
19997
Tony Barbour1fa09702017-03-16 12:09:08 -060019998 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019999 m_errorMonitor->ExpectSuccess();
20000 VkDescriptorPoolSize ds_type_count = {};
20001 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20002 ds_type_count.descriptorCount = 2;
20003
20004 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20005 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20006 ds_pool_ci.pNext = NULL;
20007 ds_pool_ci.maxSets = 1;
20008 ds_pool_ci.poolSizeCount = 1;
20009 ds_pool_ci.pPoolSizes = &ds_type_count;
20010
20011 VkDescriptorPool ds_pool;
20012 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20013 ASSERT_VK_SUCCESS(err);
20014
20015 // Create layout with two uniform buffer descriptors w/ empty binding between them
20016 static const uint32_t NUM_BINDINGS = 3;
20017 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
20018 dsl_binding[0].binding = 0;
20019 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20020 dsl_binding[0].descriptorCount = 1;
20021 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
20022 dsl_binding[0].pImmutableSamplers = NULL;
20023 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020024 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020025 dsl_binding[2].binding = 2;
20026 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20027 dsl_binding[2].descriptorCount = 1;
20028 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
20029 dsl_binding[2].pImmutableSamplers = NULL;
20030
20031 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20032 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20033 ds_layout_ci.pNext = NULL;
20034 ds_layout_ci.bindingCount = NUM_BINDINGS;
20035 ds_layout_ci.pBindings = dsl_binding;
20036 VkDescriptorSetLayout ds_layout;
20037 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20038 ASSERT_VK_SUCCESS(err);
20039
20040 VkDescriptorSet descriptor_set = {};
20041 VkDescriptorSetAllocateInfo alloc_info = {};
20042 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20043 alloc_info.descriptorSetCount = 1;
20044 alloc_info.descriptorPool = ds_pool;
20045 alloc_info.pSetLayouts = &ds_layout;
20046 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20047 ASSERT_VK_SUCCESS(err);
20048
20049 // Create a buffer to be used for update
20050 VkBufferCreateInfo buff_ci = {};
20051 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20052 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20053 buff_ci.size = 256;
20054 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20055 VkBuffer buffer;
20056 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
20057 ASSERT_VK_SUCCESS(err);
20058 // Have to bind memory to buffer before descriptor update
20059 VkMemoryAllocateInfo mem_alloc = {};
20060 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20061 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020062 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020063 mem_alloc.memoryTypeIndex = 0;
20064
20065 VkMemoryRequirements mem_reqs;
20066 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20067 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
20068 if (!pass) {
20069 vkDestroyBuffer(m_device->device(), buffer, NULL);
20070 return;
20071 }
20072
20073 VkDeviceMemory mem;
20074 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20075 ASSERT_VK_SUCCESS(err);
20076 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20077 ASSERT_VK_SUCCESS(err);
20078
20079 // Only update the descriptor at binding 2
20080 VkDescriptorBufferInfo buff_info = {};
20081 buff_info.buffer = buffer;
20082 buff_info.offset = 0;
20083 buff_info.range = VK_WHOLE_SIZE;
20084 VkWriteDescriptorSet descriptor_write = {};
20085 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20086 descriptor_write.dstBinding = 2;
20087 descriptor_write.descriptorCount = 1;
20088 descriptor_write.pTexelBufferView = nullptr;
20089 descriptor_write.pBufferInfo = &buff_info;
20090 descriptor_write.pImageInfo = nullptr;
20091 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20092 descriptor_write.dstSet = descriptor_set;
20093
20094 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20095
20096 m_errorMonitor->VerifyNotFound();
20097 // Cleanup
20098 vkFreeMemory(m_device->device(), mem, NULL);
20099 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20100 vkDestroyBuffer(m_device->device(), buffer, NULL);
20101 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20102}
20103
20104// This is a positive test. No failures are expected.
20105TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
20106 VkResult err;
20107 bool pass;
20108
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020109 TEST_DESCRIPTION(
20110 "Create a buffer, allocate memory, bind memory, destroy "
20111 "the buffer, create an image, and bind the same memory to "
20112 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020113
20114 m_errorMonitor->ExpectSuccess();
20115
Tony Barbour1fa09702017-03-16 12:09:08 -060020116 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020117
20118 VkBuffer buffer;
20119 VkImage image;
20120 VkDeviceMemory mem;
20121 VkMemoryRequirements mem_reqs;
20122
20123 VkBufferCreateInfo buf_info = {};
20124 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20125 buf_info.pNext = NULL;
20126 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20127 buf_info.size = 256;
20128 buf_info.queueFamilyIndexCount = 0;
20129 buf_info.pQueueFamilyIndices = NULL;
20130 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20131 buf_info.flags = 0;
20132 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
20133 ASSERT_VK_SUCCESS(err);
20134
20135 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20136
20137 VkMemoryAllocateInfo alloc_info = {};
20138 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20139 alloc_info.pNext = NULL;
20140 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020141
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020142 // Ensure memory is big enough for both bindings
20143 alloc_info.allocationSize = 0x10000;
20144
20145 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20146 if (!pass) {
20147 vkDestroyBuffer(m_device->device(), buffer, NULL);
20148 return;
20149 }
20150
20151 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20152 ASSERT_VK_SUCCESS(err);
20153
20154 uint8_t *pData;
20155 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
20156 ASSERT_VK_SUCCESS(err);
20157
20158 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
20159
20160 vkUnmapMemory(m_device->device(), mem);
20161
20162 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20163 ASSERT_VK_SUCCESS(err);
20164
20165 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
20166 // memory. In fact, it was never used by the GPU.
20167 // Just be be sure, wait for idle.
20168 vkDestroyBuffer(m_device->device(), buffer, NULL);
20169 vkDeviceWaitIdle(m_device->device());
20170
Tobin Ehlis6a005702016-12-28 15:25:56 -070020171 // Use optimal as some platforms report linear support but then fail image creation
20172 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
20173 VkImageFormatProperties image_format_properties;
20174 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
20175 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
20176 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070020177 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070020178 vkFreeMemory(m_device->device(), mem, NULL);
20179 return;
20180 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020181 VkImageCreateInfo image_create_info = {};
20182 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20183 image_create_info.pNext = NULL;
20184 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20185 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
20186 image_create_info.extent.width = 64;
20187 image_create_info.extent.height = 64;
20188 image_create_info.extent.depth = 1;
20189 image_create_info.mipLevels = 1;
20190 image_create_info.arrayLayers = 1;
20191 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070020192 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020193 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
20194 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
20195 image_create_info.queueFamilyIndexCount = 0;
20196 image_create_info.pQueueFamilyIndices = NULL;
20197 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20198 image_create_info.flags = 0;
20199
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020200 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020201 * to be textures or it will be the staging image if they are not.
20202 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020203 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20204 ASSERT_VK_SUCCESS(err);
20205
20206 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
20207
Tobin Ehlis6a005702016-12-28 15:25:56 -070020208 VkMemoryAllocateInfo mem_alloc = {};
20209 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20210 mem_alloc.pNext = NULL;
20211 mem_alloc.allocationSize = 0;
20212 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020213 mem_alloc.allocationSize = mem_reqs.size;
20214
20215 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20216 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070020217 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020218 vkDestroyImage(m_device->device(), image, NULL);
20219 return;
20220 }
20221
20222 // VALIDATION FAILURE:
20223 err = vkBindImageMemory(m_device->device(), image, mem, 0);
20224 ASSERT_VK_SUCCESS(err);
20225
20226 m_errorMonitor->VerifyNotFound();
20227
20228 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020229 vkDestroyImage(m_device->device(), image, NULL);
20230}
20231
Tony Barbourab713912017-02-02 14:17:35 -070020232// This is a positive test. No failures are expected.
20233TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
20234 VkResult err;
20235
20236 TEST_DESCRIPTION(
20237 "Call all applicable destroy and free routines with NULL"
20238 "handles, expecting no validation errors");
20239
20240 m_errorMonitor->ExpectSuccess();
20241
Tony Barbour1fa09702017-03-16 12:09:08 -060020242 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070020243 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20244 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
20245 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
20246 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
20247 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20248 vkDestroyDevice(VK_NULL_HANDLE, NULL);
20249 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
20250 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
20251 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20252 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
20253 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
20254 vkDestroyInstance(VK_NULL_HANDLE, NULL);
20255 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
20256 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
20257 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20258 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
20259 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
20260 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
20261 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
20262 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
20263
20264 VkCommandPool command_pool;
20265 VkCommandPoolCreateInfo pool_create_info{};
20266 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20267 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20268 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20269 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20270 VkCommandBuffer command_buffers[3] = {};
20271 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20272 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20273 command_buffer_allocate_info.commandPool = command_pool;
20274 command_buffer_allocate_info.commandBufferCount = 1;
20275 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20276 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
20277 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
20278 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20279
20280 VkDescriptorPoolSize ds_type_count = {};
20281 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20282 ds_type_count.descriptorCount = 1;
20283
20284 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20285 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20286 ds_pool_ci.pNext = NULL;
20287 ds_pool_ci.maxSets = 1;
20288 ds_pool_ci.poolSizeCount = 1;
20289 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
20290 ds_pool_ci.pPoolSizes = &ds_type_count;
20291
20292 VkDescriptorPool ds_pool;
20293 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20294 ASSERT_VK_SUCCESS(err);
20295
20296 VkDescriptorSetLayoutBinding dsl_binding = {};
20297 dsl_binding.binding = 2;
20298 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20299 dsl_binding.descriptorCount = 1;
20300 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20301 dsl_binding.pImmutableSamplers = NULL;
20302 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20303 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20304 ds_layout_ci.pNext = NULL;
20305 ds_layout_ci.bindingCount = 1;
20306 ds_layout_ci.pBindings = &dsl_binding;
20307 VkDescriptorSetLayout ds_layout;
20308 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20309 ASSERT_VK_SUCCESS(err);
20310
20311 VkDescriptorSet descriptor_sets[3] = {};
20312 VkDescriptorSetAllocateInfo alloc_info = {};
20313 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20314 alloc_info.descriptorSetCount = 1;
20315 alloc_info.descriptorPool = ds_pool;
20316 alloc_info.pSetLayouts = &ds_layout;
20317 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
20318 ASSERT_VK_SUCCESS(err);
20319 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
20320 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20321 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20322
20323 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
20324
20325 m_errorMonitor->VerifyNotFound();
20326}
20327
Tony Barbour626994c2017-02-08 15:29:37 -070020328TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070020329 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070020330
20331 m_errorMonitor->ExpectSuccess();
20332
Tony Barbour1fa09702017-03-16 12:09:08 -060020333 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070020334 VkCommandBuffer cmd_bufs[4];
20335 VkCommandBufferAllocateInfo alloc_info;
20336 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20337 alloc_info.pNext = NULL;
20338 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070020339 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070020340 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20341 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
20342 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020343 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070020344 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
20345 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070020346 ASSERT_TRUE(image.initialized());
20347 VkCommandBufferBeginInfo cb_binfo;
20348 cb_binfo.pNext = NULL;
20349 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20350 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
20351 cb_binfo.flags = 0;
20352 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
20353 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
20354 VkImageMemoryBarrier img_barrier = {};
20355 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20356 img_barrier.pNext = NULL;
20357 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20358 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20359 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20360 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20361 img_barrier.image = image.handle();
20362 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20363 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20364 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20365 img_barrier.subresourceRange.baseArrayLayer = 0;
20366 img_barrier.subresourceRange.baseMipLevel = 0;
20367 img_barrier.subresourceRange.layerCount = 1;
20368 img_barrier.subresourceRange.levelCount = 1;
20369 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20370 &img_barrier);
20371 vkEndCommandBuffer(cmd_bufs[0]);
20372 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
20373 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20374 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20375 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20376 &img_barrier);
20377 vkEndCommandBuffer(cmd_bufs[1]);
20378 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
20379 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20380 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20381 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20382 &img_barrier);
20383 vkEndCommandBuffer(cmd_bufs[2]);
20384 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
20385 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20386 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20387 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20388 &img_barrier);
20389 vkEndCommandBuffer(cmd_bufs[3]);
20390
20391 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
20392 VkSemaphore semaphore1, semaphore2;
20393 VkSemaphoreCreateInfo semaphore_create_info{};
20394 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20395 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
20396 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
20397 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
20398 VkSubmitInfo submit_info[3];
20399 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20400 submit_info[0].pNext = nullptr;
20401 submit_info[0].commandBufferCount = 1;
20402 submit_info[0].pCommandBuffers = &cmd_bufs[0];
20403 submit_info[0].signalSemaphoreCount = 1;
20404 submit_info[0].pSignalSemaphores = &semaphore1;
20405 submit_info[0].waitSemaphoreCount = 0;
20406 submit_info[0].pWaitDstStageMask = nullptr;
20407 submit_info[0].pWaitDstStageMask = flags;
20408 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20409 submit_info[1].pNext = nullptr;
20410 submit_info[1].commandBufferCount = 1;
20411 submit_info[1].pCommandBuffers = &cmd_bufs[1];
20412 submit_info[1].waitSemaphoreCount = 1;
20413 submit_info[1].pWaitSemaphores = &semaphore1;
20414 submit_info[1].signalSemaphoreCount = 1;
20415 submit_info[1].pSignalSemaphores = &semaphore2;
20416 submit_info[1].pWaitDstStageMask = flags;
20417 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20418 submit_info[2].pNext = nullptr;
20419 submit_info[2].commandBufferCount = 2;
20420 submit_info[2].pCommandBuffers = &cmd_bufs[2];
20421 submit_info[2].waitSemaphoreCount = 1;
20422 submit_info[2].pWaitSemaphores = &semaphore2;
20423 submit_info[2].signalSemaphoreCount = 0;
20424 submit_info[2].pSignalSemaphores = nullptr;
20425 submit_info[2].pWaitDstStageMask = flags;
20426 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
20427 vkQueueWaitIdle(m_device->m_queue);
20428
20429 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
20430 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
20431 m_errorMonitor->VerifyNotFound();
20432}
20433
Tobin Ehlis953e8392016-11-17 10:54:13 -070020434TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
20435 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
20436 // We previously had a bug where dynamic offset of inactive bindings was still being used
20437 VkResult err;
20438 m_errorMonitor->ExpectSuccess();
20439
Tony Barbour1fa09702017-03-16 12:09:08 -060020440 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070020441 ASSERT_NO_FATAL_FAILURE(InitViewport());
20442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20443
20444 VkDescriptorPoolSize ds_type_count = {};
20445 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20446 ds_type_count.descriptorCount = 3;
20447
20448 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20449 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20450 ds_pool_ci.pNext = NULL;
20451 ds_pool_ci.maxSets = 1;
20452 ds_pool_ci.poolSizeCount = 1;
20453 ds_pool_ci.pPoolSizes = &ds_type_count;
20454
20455 VkDescriptorPool ds_pool;
20456 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20457 ASSERT_VK_SUCCESS(err);
20458
20459 const uint32_t BINDING_COUNT = 3;
20460 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020461 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020462 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20463 dsl_binding[0].descriptorCount = 1;
20464 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20465 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020466 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020467 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20468 dsl_binding[1].descriptorCount = 1;
20469 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20470 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020471 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020472 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20473 dsl_binding[2].descriptorCount = 1;
20474 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20475 dsl_binding[2].pImmutableSamplers = NULL;
20476
20477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20478 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20479 ds_layout_ci.pNext = NULL;
20480 ds_layout_ci.bindingCount = BINDING_COUNT;
20481 ds_layout_ci.pBindings = dsl_binding;
20482 VkDescriptorSetLayout ds_layout;
20483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20484 ASSERT_VK_SUCCESS(err);
20485
20486 VkDescriptorSet descriptor_set;
20487 VkDescriptorSetAllocateInfo alloc_info = {};
20488 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20489 alloc_info.descriptorSetCount = 1;
20490 alloc_info.descriptorPool = ds_pool;
20491 alloc_info.pSetLayouts = &ds_layout;
20492 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20493 ASSERT_VK_SUCCESS(err);
20494
20495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20497 pipeline_layout_ci.pNext = NULL;
20498 pipeline_layout_ci.setLayoutCount = 1;
20499 pipeline_layout_ci.pSetLayouts = &ds_layout;
20500
20501 VkPipelineLayout pipeline_layout;
20502 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20503 ASSERT_VK_SUCCESS(err);
20504
20505 // Create two buffers to update the descriptors with
20506 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
20507 uint32_t qfi = 0;
20508 VkBufferCreateInfo buffCI = {};
20509 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20510 buffCI.size = 2048;
20511 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20512 buffCI.queueFamilyIndexCount = 1;
20513 buffCI.pQueueFamilyIndices = &qfi;
20514
20515 VkBuffer dyub1;
20516 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
20517 ASSERT_VK_SUCCESS(err);
20518 // buffer2
20519 buffCI.size = 1024;
20520 VkBuffer dyub2;
20521 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
20522 ASSERT_VK_SUCCESS(err);
20523 // Allocate memory and bind to buffers
20524 VkMemoryAllocateInfo mem_alloc[2] = {};
20525 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20526 mem_alloc[0].pNext = NULL;
20527 mem_alloc[0].memoryTypeIndex = 0;
20528 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20529 mem_alloc[1].pNext = NULL;
20530 mem_alloc[1].memoryTypeIndex = 0;
20531
20532 VkMemoryRequirements mem_reqs1;
20533 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
20534 VkMemoryRequirements mem_reqs2;
20535 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
20536 mem_alloc[0].allocationSize = mem_reqs1.size;
20537 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
20538 mem_alloc[1].allocationSize = mem_reqs2.size;
20539 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
20540 if (!pass) {
20541 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20542 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20543 return;
20544 }
20545
20546 VkDeviceMemory mem1;
20547 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
20548 ASSERT_VK_SUCCESS(err);
20549 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
20550 ASSERT_VK_SUCCESS(err);
20551 VkDeviceMemory mem2;
20552 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
20553 ASSERT_VK_SUCCESS(err);
20554 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
20555 ASSERT_VK_SUCCESS(err);
20556 // Update descriptors
20557 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
20558 buff_info[0].buffer = dyub1;
20559 buff_info[0].offset = 0;
20560 buff_info[0].range = 256;
20561 buff_info[1].buffer = dyub1;
20562 buff_info[1].offset = 256;
20563 buff_info[1].range = 512;
20564 buff_info[2].buffer = dyub2;
20565 buff_info[2].offset = 0;
20566 buff_info[2].range = 512;
20567
20568 VkWriteDescriptorSet descriptor_write;
20569 memset(&descriptor_write, 0, sizeof(descriptor_write));
20570 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20571 descriptor_write.dstSet = descriptor_set;
20572 descriptor_write.dstBinding = 0;
20573 descriptor_write.descriptorCount = BINDING_COUNT;
20574 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20575 descriptor_write.pBufferInfo = buff_info;
20576
20577 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20578
Tony Barbour552f6c02016-12-21 14:34:07 -070020579 m_commandBuffer->BeginCommandBuffer();
20580 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070020581
20582 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020583 char const *vsSource =
20584 "#version 450\n"
20585 "\n"
20586 "out gl_PerVertex { \n"
20587 " vec4 gl_Position;\n"
20588 "};\n"
20589 "void main(){\n"
20590 " gl_Position = vec4(1);\n"
20591 "}\n";
20592 char const *fsSource =
20593 "#version 450\n"
20594 "\n"
20595 "layout(location=0) out vec4 x;\n"
20596 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
20597 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
20598 "void main(){\n"
20599 " x = vec4(bar1.y) + vec4(bar2.y);\n"
20600 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070020601 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20602 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20603 VkPipelineObj pipe(m_device);
20604 pipe.SetViewport(m_viewports);
20605 pipe.SetScissor(m_scissors);
20606 pipe.AddShader(&vs);
20607 pipe.AddShader(&fs);
20608 pipe.AddColorAttachment();
20609 pipe.CreateVKPipeline(pipeline_layout, renderPass());
20610
20611 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
20612 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
20613 // we used to have a bug in this case.
20614 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
20615 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
20616 &descriptor_set, BINDING_COUNT, dyn_off);
20617 Draw(1, 0, 0, 0);
20618 m_errorMonitor->VerifyNotFound();
20619
20620 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20621 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20622 vkFreeMemory(m_device->device(), mem1, NULL);
20623 vkFreeMemory(m_device->device(), mem2, NULL);
20624
20625 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20626 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20627 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20628}
20629
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020630TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020631 TEST_DESCRIPTION(
20632 "Ensure that validations handling of non-coherent memory "
20633 "mapping while using VK_WHOLE_SIZE does not cause access "
20634 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020635 VkResult err;
20636 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060020637 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020638
20639 VkDeviceMemory mem;
20640 VkMemoryRequirements mem_reqs;
20641 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020642 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020643 VkMemoryAllocateInfo alloc_info = {};
20644 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20645 alloc_info.pNext = NULL;
20646 alloc_info.memoryTypeIndex = 0;
20647
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020648 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020649 alloc_info.allocationSize = allocation_size;
20650
20651 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
20652 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 -070020653 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020654 if (!pass) {
20655 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020656 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
20657 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020658 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020659 pass = m_device->phy().set_memory_type(
20660 mem_reqs.memoryTypeBits, &alloc_info,
20661 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
20662 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020663 if (!pass) {
20664 return;
20665 }
20666 }
20667 }
20668
20669 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20670 ASSERT_VK_SUCCESS(err);
20671
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020672 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020673 m_errorMonitor->ExpectSuccess();
20674 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20675 ASSERT_VK_SUCCESS(err);
20676 VkMappedMemoryRange mmr = {};
20677 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20678 mmr.memory = mem;
20679 mmr.offset = 0;
20680 mmr.size = VK_WHOLE_SIZE;
20681 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20682 ASSERT_VK_SUCCESS(err);
20683 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20684 ASSERT_VK_SUCCESS(err);
20685 m_errorMonitor->VerifyNotFound();
20686 vkUnmapMemory(m_device->device(), mem);
20687
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020688 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020689 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020690 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020691 ASSERT_VK_SUCCESS(err);
20692 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20693 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020694 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020695 mmr.size = VK_WHOLE_SIZE;
20696 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20697 ASSERT_VK_SUCCESS(err);
20698 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20699 ASSERT_VK_SUCCESS(err);
20700 m_errorMonitor->VerifyNotFound();
20701 vkUnmapMemory(m_device->device(), mem);
20702
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020703 // Map with offset and size
20704 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020705 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020706 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020707 ASSERT_VK_SUCCESS(err);
20708 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20709 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020710 mmr.offset = 4 * atom_size;
20711 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020712 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20713 ASSERT_VK_SUCCESS(err);
20714 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20715 ASSERT_VK_SUCCESS(err);
20716 m_errorMonitor->VerifyNotFound();
20717 vkUnmapMemory(m_device->device(), mem);
20718
20719 // Map without offset and flush WHOLE_SIZE with two separate offsets
20720 m_errorMonitor->ExpectSuccess();
20721 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20722 ASSERT_VK_SUCCESS(err);
20723 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20724 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020725 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020726 mmr.size = VK_WHOLE_SIZE;
20727 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20728 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020729 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020730 mmr.size = VK_WHOLE_SIZE;
20731 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20732 ASSERT_VK_SUCCESS(err);
20733 m_errorMonitor->VerifyNotFound();
20734 vkUnmapMemory(m_device->device(), mem);
20735
20736 vkFreeMemory(m_device->device(), mem, NULL);
20737}
20738
20739// This is a positive test. We used to expect error in this case but spec now allows it
20740TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
20741 m_errorMonitor->ExpectSuccess();
20742 vk_testing::Fence testFence;
20743 VkFenceCreateInfo fenceInfo = {};
20744 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20745 fenceInfo.pNext = NULL;
20746
Tony Barbour1fa09702017-03-16 12:09:08 -060020747 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020748 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020749 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020750 VkResult result = vkResetFences(m_device->device(), 1, fences);
20751 ASSERT_VK_SUCCESS(result);
20752
20753 m_errorMonitor->VerifyNotFound();
20754}
20755
20756TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
20757 m_errorMonitor->ExpectSuccess();
20758
Tony Barbour1fa09702017-03-16 12:09:08 -060020759 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020760 VkResult err;
20761
20762 // Record (empty!) command buffer that can be submitted multiple times
20763 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020764 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
20765 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020766 m_commandBuffer->BeginCommandBuffer(&cbbi);
20767 m_commandBuffer->EndCommandBuffer();
20768
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020769 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020770 VkFence fence;
20771 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20772 ASSERT_VK_SUCCESS(err);
20773
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020774 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020775 VkSemaphore s1, s2;
20776 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
20777 ASSERT_VK_SUCCESS(err);
20778 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
20779 ASSERT_VK_SUCCESS(err);
20780
20781 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020782 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020783 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20784 ASSERT_VK_SUCCESS(err);
20785
20786 // Submit CB again, signaling s2.
20787 si.pSignalSemaphores = &s2;
20788 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
20789 ASSERT_VK_SUCCESS(err);
20790
20791 // Wait for fence.
20792 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20793 ASSERT_VK_SUCCESS(err);
20794
20795 // CB is still in flight from second submission, but semaphore s1 is no
20796 // longer in flight. delete it.
20797 vkDestroySemaphore(m_device->device(), s1, nullptr);
20798
20799 m_errorMonitor->VerifyNotFound();
20800
20801 // Force device idle and clean up remaining objects
20802 vkDeviceWaitIdle(m_device->device());
20803 vkDestroySemaphore(m_device->device(), s2, nullptr);
20804 vkDestroyFence(m_device->device(), fence, nullptr);
20805}
20806
20807TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20808 m_errorMonitor->ExpectSuccess();
20809
Tony Barbour1fa09702017-03-16 12:09:08 -060020810 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020811 VkResult err;
20812
20813 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020814 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020815 VkFence f1;
20816 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20817 ASSERT_VK_SUCCESS(err);
20818
20819 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020820 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020821 VkFence f2;
20822 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20823 ASSERT_VK_SUCCESS(err);
20824
20825 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020826 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020827 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20828
20829 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020830 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020831 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20832
20833 // Should have both retired!
20834 vkDestroyFence(m_device->device(), f1, nullptr);
20835 vkDestroyFence(m_device->device(), f2, nullptr);
20836
20837 m_errorMonitor->VerifyNotFound();
20838}
20839
20840TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020841 TEST_DESCRIPTION(
20842 "Verify that creating an image view from an image with valid usage "
20843 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020844
Tony Barbour1fa09702017-03-16 12:09:08 -060020845 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020846
20847 m_errorMonitor->ExpectSuccess();
20848 // Verify that we can create a view with usage INPUT_ATTACHMENT
20849 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020850 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 -060020851 ASSERT_TRUE(image.initialized());
20852 VkImageView imageView;
20853 VkImageViewCreateInfo ivci = {};
20854 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20855 ivci.image = image.handle();
20856 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20857 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20858 ivci.subresourceRange.layerCount = 1;
20859 ivci.subresourceRange.baseMipLevel = 0;
20860 ivci.subresourceRange.levelCount = 1;
20861 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20862
20863 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20864 m_errorMonitor->VerifyNotFound();
20865 vkDestroyImageView(m_device->device(), imageView, NULL);
20866}
20867
20868// This is a positive test. No failures are expected.
20869TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020870 TEST_DESCRIPTION(
20871 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20872 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020873
Tony Barbour1fa09702017-03-16 12:09:08 -060020874 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020875
20876 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020877 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020878 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020879
20880 m_errorMonitor->ExpectSuccess();
20881
20882 VkImage image;
20883 VkImageCreateInfo image_create_info = {};
20884 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20885 image_create_info.pNext = NULL;
20886 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20887 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20888 image_create_info.extent.width = 64;
20889 image_create_info.extent.height = 64;
20890 image_create_info.extent.depth = 1;
20891 image_create_info.mipLevels = 1;
20892 image_create_info.arrayLayers = 1;
20893 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20894 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20895 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20896 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20897 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20898 ASSERT_VK_SUCCESS(err);
20899
20900 VkMemoryRequirements memory_reqs;
20901 VkDeviceMemory memory_one, memory_two;
20902 bool pass;
20903 VkMemoryAllocateInfo memory_info = {};
20904 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20905 memory_info.pNext = NULL;
20906 memory_info.allocationSize = 0;
20907 memory_info.memoryTypeIndex = 0;
20908 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20909 // Find an image big enough to allow sparse mapping of 2 memory regions
20910 // Increase the image size until it is at least twice the
20911 // size of the required alignment, to ensure we can bind both
20912 // allocated memory blocks to the image on aligned offsets.
20913 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20914 vkDestroyImage(m_device->device(), image, nullptr);
20915 image_create_info.extent.width *= 2;
20916 image_create_info.extent.height *= 2;
20917 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20918 ASSERT_VK_SUCCESS(err);
20919 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20920 }
20921 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20922 // at the end of the first
20923 memory_info.allocationSize = memory_reqs.alignment;
20924 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20925 ASSERT_TRUE(pass);
20926 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20927 ASSERT_VK_SUCCESS(err);
20928 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20929 ASSERT_VK_SUCCESS(err);
20930 VkSparseMemoryBind binds[2];
20931 binds[0].flags = 0;
20932 binds[0].memory = memory_one;
20933 binds[0].memoryOffset = 0;
20934 binds[0].resourceOffset = 0;
20935 binds[0].size = memory_info.allocationSize;
20936 binds[1].flags = 0;
20937 binds[1].memory = memory_two;
20938 binds[1].memoryOffset = 0;
20939 binds[1].resourceOffset = memory_info.allocationSize;
20940 binds[1].size = memory_info.allocationSize;
20941
20942 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20943 opaqueBindInfo.image = image;
20944 opaqueBindInfo.bindCount = 2;
20945 opaqueBindInfo.pBinds = binds;
20946
20947 VkFence fence = VK_NULL_HANDLE;
20948 VkBindSparseInfo bindSparseInfo = {};
20949 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20950 bindSparseInfo.imageOpaqueBindCount = 1;
20951 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20952
20953 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20954 vkQueueWaitIdle(m_device->m_queue);
20955 vkDestroyImage(m_device->device(), image, NULL);
20956 vkFreeMemory(m_device->device(), memory_one, NULL);
20957 vkFreeMemory(m_device->device(), memory_two, NULL);
20958 m_errorMonitor->VerifyNotFound();
20959}
20960
20961TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020962 TEST_DESCRIPTION(
20963 "Ensure that CmdBeginRenderPass with an attachment's "
20964 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20965 "the command buffer has prior knowledge of that "
20966 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020967
20968 m_errorMonitor->ExpectSuccess();
20969
Tony Barbour1fa09702017-03-16 12:09:08 -060020970 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020971
20972 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020973 VkAttachmentDescription attachment = {0,
20974 VK_FORMAT_R8G8B8A8_UNORM,
20975 VK_SAMPLE_COUNT_1_BIT,
20976 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20977 VK_ATTACHMENT_STORE_OP_STORE,
20978 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20979 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20980 VK_IMAGE_LAYOUT_UNDEFINED,
20981 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020982
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020983 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020984
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020985 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020986
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020987 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020988
20989 VkRenderPass rp;
20990 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20991 ASSERT_VK_SUCCESS(err);
20992
20993 // A compatible framebuffer.
20994 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020995 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 -060020996 ASSERT_TRUE(image.initialized());
20997
20998 VkImageViewCreateInfo ivci = {
20999 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21000 nullptr,
21001 0,
21002 image.handle(),
21003 VK_IMAGE_VIEW_TYPE_2D,
21004 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021005 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21006 VK_COMPONENT_SWIZZLE_IDENTITY},
21007 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021008 };
21009 VkImageView view;
21010 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21011 ASSERT_VK_SUCCESS(err);
21012
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021013 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021014 VkFramebuffer fb;
21015 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21016 ASSERT_VK_SUCCESS(err);
21017
21018 // Record a single command buffer which uses this renderpass twice. The
21019 // bug is triggered at the beginning of the second renderpass, when the
21020 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021021 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 -070021022 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021023 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21024 vkCmdEndRenderPass(m_commandBuffer->handle());
21025 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21026
21027 m_errorMonitor->VerifyNotFound();
21028
21029 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070021030 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021031
21032 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21033 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21034 vkDestroyImageView(m_device->device(), view, nullptr);
21035}
21036
21037TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021038 TEST_DESCRIPTION(
21039 "This test should pass. Create a Framebuffer and "
21040 "command buffer, bind them together, then destroy "
21041 "command pool and framebuffer and verify there are no "
21042 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021043
21044 m_errorMonitor->ExpectSuccess();
21045
Tony Barbour1fa09702017-03-16 12:09:08 -060021046 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021047
21048 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021049 VkAttachmentDescription attachment = {0,
21050 VK_FORMAT_R8G8B8A8_UNORM,
21051 VK_SAMPLE_COUNT_1_BIT,
21052 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21053 VK_ATTACHMENT_STORE_OP_STORE,
21054 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21055 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21056 VK_IMAGE_LAYOUT_UNDEFINED,
21057 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021058
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021059 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021060
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021061 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021062
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021063 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021064
21065 VkRenderPass rp;
21066 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21067 ASSERT_VK_SUCCESS(err);
21068
21069 // A compatible framebuffer.
21070 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021071 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 -060021072 ASSERT_TRUE(image.initialized());
21073
21074 VkImageViewCreateInfo ivci = {
21075 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21076 nullptr,
21077 0,
21078 image.handle(),
21079 VK_IMAGE_VIEW_TYPE_2D,
21080 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021081 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21082 VK_COMPONENT_SWIZZLE_IDENTITY},
21083 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021084 };
21085 VkImageView view;
21086 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21087 ASSERT_VK_SUCCESS(err);
21088
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021089 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021090 VkFramebuffer fb;
21091 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21092 ASSERT_VK_SUCCESS(err);
21093
21094 // Explicitly create a command buffer to bind the FB to so that we can then
21095 // destroy the command pool in order to implicitly free command buffer
21096 VkCommandPool command_pool;
21097 VkCommandPoolCreateInfo pool_create_info{};
21098 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21099 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21100 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21101 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21102
21103 VkCommandBuffer command_buffer;
21104 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21105 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21106 command_buffer_allocate_info.commandPool = command_pool;
21107 command_buffer_allocate_info.commandBufferCount = 1;
21108 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21109 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21110
21111 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021112 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 -060021113 VkCommandBufferBeginInfo begin_info{};
21114 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21115 vkBeginCommandBuffer(command_buffer, &begin_info);
21116
21117 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21118 vkCmdEndRenderPass(command_buffer);
21119 vkEndCommandBuffer(command_buffer);
21120 vkDestroyImageView(m_device->device(), view, nullptr);
21121 // Destroy command pool to implicitly free command buffer
21122 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21123 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21124 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21125 m_errorMonitor->VerifyNotFound();
21126}
21127
21128TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021129 TEST_DESCRIPTION(
21130 "Ensure that CmdBeginRenderPass applies the layout "
21131 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021132
21133 m_errorMonitor->ExpectSuccess();
21134
Tony Barbour1fa09702017-03-16 12:09:08 -060021135 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021136
21137 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021138 VkAttachmentDescription attachment = {0,
21139 VK_FORMAT_R8G8B8A8_UNORM,
21140 VK_SAMPLE_COUNT_1_BIT,
21141 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21142 VK_ATTACHMENT_STORE_OP_STORE,
21143 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21144 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21145 VK_IMAGE_LAYOUT_UNDEFINED,
21146 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021147
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021148 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021149
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021150 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021151
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021152 VkSubpassDependency dep = {0,
21153 0,
21154 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21155 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21156 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21157 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21158 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021159
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021160 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021161
21162 VkResult err;
21163 VkRenderPass rp;
21164 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21165 ASSERT_VK_SUCCESS(err);
21166
21167 // A compatible framebuffer.
21168 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021169 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 -060021170 ASSERT_TRUE(image.initialized());
21171
21172 VkImageViewCreateInfo ivci = {
21173 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21174 nullptr,
21175 0,
21176 image.handle(),
21177 VK_IMAGE_VIEW_TYPE_2D,
21178 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021179 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21180 VK_COMPONENT_SWIZZLE_IDENTITY},
21181 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021182 };
21183 VkImageView view;
21184 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21185 ASSERT_VK_SUCCESS(err);
21186
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021187 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021188 VkFramebuffer fb;
21189 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21190 ASSERT_VK_SUCCESS(err);
21191
21192 // Record a single command buffer which issues a pipeline barrier w/
21193 // image memory barrier for the attachment. This detects the previously
21194 // missing tracking of the subpass layout by throwing a validation error
21195 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021196 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 -070021197 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021198 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21199
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021200 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
21201 nullptr,
21202 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21203 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21204 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21205 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21206 VK_QUEUE_FAMILY_IGNORED,
21207 VK_QUEUE_FAMILY_IGNORED,
21208 image.handle(),
21209 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021210 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021211 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21212 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021213
21214 vkCmdEndRenderPass(m_commandBuffer->handle());
21215 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021216 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021217
21218 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21219 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21220 vkDestroyImageView(m_device->device(), view, nullptr);
21221}
21222
21223TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021224 TEST_DESCRIPTION(
21225 "Validate that when an imageView of a depth/stencil image "
21226 "is used as a depth/stencil framebuffer attachment, the "
21227 "aspectMask is ignored and both depth and stencil image "
21228 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021229
Tony Barbour1fa09702017-03-16 12:09:08 -060021230 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021231 VkFormatProperties format_properties;
21232 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
21233 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
21234 return;
21235 }
21236
21237 m_errorMonitor->ExpectSuccess();
21238
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021239 VkAttachmentDescription attachment = {0,
21240 VK_FORMAT_D32_SFLOAT_S8_UINT,
21241 VK_SAMPLE_COUNT_1_BIT,
21242 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21243 VK_ATTACHMENT_STORE_OP_STORE,
21244 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21245 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21246 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
21247 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021248
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021249 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021250
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021251 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021252
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021253 VkSubpassDependency dep = {0,
21254 0,
21255 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21256 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21257 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21258 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21259 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021260
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021261 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021262
21263 VkResult err;
21264 VkRenderPass rp;
21265 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21266 ASSERT_VK_SUCCESS(err);
21267
21268 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021269 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
21270 0x26, // usage
21271 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021272 ASSERT_TRUE(image.initialized());
21273 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
21274
21275 VkImageViewCreateInfo ivci = {
21276 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21277 nullptr,
21278 0,
21279 image.handle(),
21280 VK_IMAGE_VIEW_TYPE_2D,
21281 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021282 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
21283 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021284 };
21285 VkImageView view;
21286 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21287 ASSERT_VK_SUCCESS(err);
21288
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021289 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021290 VkFramebuffer fb;
21291 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21292 ASSERT_VK_SUCCESS(err);
21293
Tony Barbour552f6c02016-12-21 14:34:07 -070021294 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021295
21296 VkImageMemoryBarrier imb = {};
21297 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21298 imb.pNext = nullptr;
21299 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21300 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21301 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21302 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
21303 imb.srcQueueFamilyIndex = 0;
21304 imb.dstQueueFamilyIndex = 0;
21305 imb.image = image.handle();
21306 imb.subresourceRange.aspectMask = 0x6;
21307 imb.subresourceRange.baseMipLevel = 0;
21308 imb.subresourceRange.levelCount = 0x1;
21309 imb.subresourceRange.baseArrayLayer = 0;
21310 imb.subresourceRange.layerCount = 0x1;
21311
21312 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021313 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21314 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021315
Tony Barbour552f6c02016-12-21 14:34:07 -070021316 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021317 QueueCommandBuffer(false);
21318 m_errorMonitor->VerifyNotFound();
21319
21320 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21321 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21322 vkDestroyImageView(m_device->device(), view, nullptr);
21323}
21324
21325TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021326 TEST_DESCRIPTION(
21327 "Ensure that layout transitions work correctly without "
21328 "errors, when an attachment reference is "
21329 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021330
21331 m_errorMonitor->ExpectSuccess();
21332
Tony Barbour1fa09702017-03-16 12:09:08 -060021333 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021334
21335 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021336 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021337
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021338 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021339
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021340 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021341
21342 VkRenderPass rp;
21343 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21344 ASSERT_VK_SUCCESS(err);
21345
21346 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021347 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021348 VkFramebuffer fb;
21349 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21350 ASSERT_VK_SUCCESS(err);
21351
21352 // Record a command buffer which just begins and ends the renderpass. The
21353 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021354 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 -070021355 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021356 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21357 vkCmdEndRenderPass(m_commandBuffer->handle());
21358 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021359 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021360
21361 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21362 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21363}
21364
21365// This is a positive test. No errors are expected.
21366TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021367 TEST_DESCRIPTION(
21368 "Create a stencil-only attachment with a LOAD_OP set to "
21369 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021370 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060021371 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021372 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021373 if (!depth_format) {
21374 printf(" No Depth + Stencil format found. Skipped.\n");
21375 return;
21376 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021377 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070021378 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021379 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
21380 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021381 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
21382 return;
21383 }
21384
Tony Barbourf887b162017-03-09 10:06:46 -070021385 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021386 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021387 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021388 VkAttachmentDescription att = {};
21389 VkAttachmentReference ref = {};
21390 att.format = depth_stencil_fmt;
21391 att.samples = VK_SAMPLE_COUNT_1_BIT;
21392 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
21393 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21394 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21395 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
21396 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21397 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21398
21399 VkClearValue clear;
21400 clear.depthStencil.depth = 1.0;
21401 clear.depthStencil.stencil = 0;
21402 ref.attachment = 0;
21403 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21404
21405 VkSubpassDescription subpass = {};
21406 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
21407 subpass.flags = 0;
21408 subpass.inputAttachmentCount = 0;
21409 subpass.pInputAttachments = NULL;
21410 subpass.colorAttachmentCount = 0;
21411 subpass.pColorAttachments = NULL;
21412 subpass.pResolveAttachments = NULL;
21413 subpass.pDepthStencilAttachment = &ref;
21414 subpass.preserveAttachmentCount = 0;
21415 subpass.pPreserveAttachments = NULL;
21416
21417 VkRenderPass rp;
21418 VkRenderPassCreateInfo rp_info = {};
21419 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21420 rp_info.attachmentCount = 1;
21421 rp_info.pAttachments = &att;
21422 rp_info.subpassCount = 1;
21423 rp_info.pSubpasses = &subpass;
21424 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
21425 ASSERT_VK_SUCCESS(result);
21426
21427 VkImageView *depthView = m_depthStencil->BindInfo();
21428 VkFramebufferCreateInfo fb_info = {};
21429 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
21430 fb_info.pNext = NULL;
21431 fb_info.renderPass = rp;
21432 fb_info.attachmentCount = 1;
21433 fb_info.pAttachments = depthView;
21434 fb_info.width = 100;
21435 fb_info.height = 100;
21436 fb_info.layers = 1;
21437 VkFramebuffer fb;
21438 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
21439 ASSERT_VK_SUCCESS(result);
21440
21441 VkRenderPassBeginInfo rpbinfo = {};
21442 rpbinfo.clearValueCount = 1;
21443 rpbinfo.pClearValues = &clear;
21444 rpbinfo.pNext = NULL;
21445 rpbinfo.renderPass = rp;
21446 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
21447 rpbinfo.renderArea.extent.width = 100;
21448 rpbinfo.renderArea.extent.height = 100;
21449 rpbinfo.renderArea.offset.x = 0;
21450 rpbinfo.renderArea.offset.y = 0;
21451 rpbinfo.framebuffer = fb;
21452
21453 VkFence fence = {};
21454 VkFenceCreateInfo fence_ci = {};
21455 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21456 fence_ci.pNext = nullptr;
21457 fence_ci.flags = 0;
21458 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
21459 ASSERT_VK_SUCCESS(result);
21460
21461 m_commandBuffer->BeginCommandBuffer();
21462 m_commandBuffer->BeginRenderPass(rpbinfo);
21463 m_commandBuffer->EndRenderPass();
21464 m_commandBuffer->EndCommandBuffer();
21465 m_commandBuffer->QueueCommandBuffer(fence);
21466
21467 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021468 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 -070021469 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021470 VkImageMemoryBarrier barrier = {};
21471 VkImageSubresourceRange range;
21472 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21473 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21474 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
21475 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21476 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
21477 barrier.image = m_depthStencil->handle();
21478 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21479 range.baseMipLevel = 0;
21480 range.levelCount = 1;
21481 range.baseArrayLayer = 0;
21482 range.layerCount = 1;
21483 barrier.subresourceRange = range;
21484 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21485 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
21486 cmdbuf.BeginCommandBuffer();
21487 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 -070021488 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021489 barrier.srcAccessMask = 0;
21490 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
21491 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
21492 barrier.image = destImage.handle();
21493 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21494 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 -070021495 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021496 VkImageCopy cregion;
21497 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21498 cregion.srcSubresource.mipLevel = 0;
21499 cregion.srcSubresource.baseArrayLayer = 0;
21500 cregion.srcSubresource.layerCount = 1;
21501 cregion.srcOffset.x = 0;
21502 cregion.srcOffset.y = 0;
21503 cregion.srcOffset.z = 0;
21504 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21505 cregion.dstSubresource.mipLevel = 0;
21506 cregion.dstSubresource.baseArrayLayer = 0;
21507 cregion.dstSubresource.layerCount = 1;
21508 cregion.dstOffset.x = 0;
21509 cregion.dstOffset.y = 0;
21510 cregion.dstOffset.z = 0;
21511 cregion.extent.width = 100;
21512 cregion.extent.height = 100;
21513 cregion.extent.depth = 1;
21514 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021515 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021516 cmdbuf.EndCommandBuffer();
21517
21518 VkSubmitInfo submit_info;
21519 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21520 submit_info.pNext = NULL;
21521 submit_info.waitSemaphoreCount = 0;
21522 submit_info.pWaitSemaphores = NULL;
21523 submit_info.pWaitDstStageMask = NULL;
21524 submit_info.commandBufferCount = 1;
21525 submit_info.pCommandBuffers = &cmdbuf.handle();
21526 submit_info.signalSemaphoreCount = 0;
21527 submit_info.pSignalSemaphores = NULL;
21528
21529 m_errorMonitor->ExpectSuccess();
21530 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21531 m_errorMonitor->VerifyNotFound();
21532
21533 vkQueueWaitIdle(m_device->m_queue);
21534 vkDestroyFence(m_device->device(), fence, nullptr);
21535 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21536 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21537}
21538
21539// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070021540TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
21541 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
21542
21543 m_errorMonitor->ExpectSuccess();
21544
Tony Barbour1fa09702017-03-16 12:09:08 -060021545 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021546 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060021547 if (!depth_format) {
21548 printf(" No Depth + Stencil format found. Skipped.\n");
21549 return;
21550 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070021551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21552
21553 VkImageMemoryBarrier img_barrier = {};
21554 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21555 img_barrier.pNext = NULL;
21556 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
21557 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21558 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21559 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21560 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21561 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21562 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
21563 img_barrier.subresourceRange.baseArrayLayer = 0;
21564 img_barrier.subresourceRange.baseMipLevel = 0;
21565 img_barrier.subresourceRange.layerCount = 1;
21566 img_barrier.subresourceRange.levelCount = 1;
21567
21568 {
21569 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021570 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 -070021571 ASSERT_TRUE(img_color.initialized());
21572
21573 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021574 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 -070021575 ASSERT_TRUE(img_ds1.initialized());
21576
21577 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021578 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 -070021579 ASSERT_TRUE(img_ds2.initialized());
21580
21581 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021582 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 -070021583 ASSERT_TRUE(img_xfer_src.initialized());
21584
21585 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021586 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 -070021587 ASSERT_TRUE(img_xfer_dst.initialized());
21588
21589 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021590 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 -070021591 ASSERT_TRUE(img_sampled.initialized());
21592
21593 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021594 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 -070021595 ASSERT_TRUE(img_input.initialized());
21596
21597 const struct {
21598 VkImageObj &image_obj;
21599 VkImageLayout old_layout;
21600 VkImageLayout new_layout;
21601 } buffer_layouts[] = {
21602 // clang-format off
21603 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21604 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21605 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21606 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21607 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21608 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21609 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21610 // clang-format on
21611 };
21612 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
21613
21614 m_commandBuffer->BeginCommandBuffer();
21615 for (uint32_t i = 0; i < layout_count; ++i) {
21616 img_barrier.image = buffer_layouts[i].image_obj.handle();
21617 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
21618 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
21619 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
21620 : VK_IMAGE_ASPECT_COLOR_BIT;
21621
21622 img_barrier.oldLayout = buffer_layouts[i].old_layout;
21623 img_barrier.newLayout = buffer_layouts[i].new_layout;
21624 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21625 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21626
21627 img_barrier.oldLayout = buffer_layouts[i].new_layout;
21628 img_barrier.newLayout = buffer_layouts[i].old_layout;
21629 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21630 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21631 }
21632 m_commandBuffer->EndCommandBuffer();
21633
21634 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
21635 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
21636 }
21637 m_errorMonitor->VerifyNotFound();
21638}
21639
21640// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021641TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
21642 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
21643
21644 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021645 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021646
21647 VkEvent event;
21648 VkEventCreateInfo event_create_info{};
21649 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21650 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21651
21652 VkCommandPool command_pool;
21653 VkCommandPoolCreateInfo pool_create_info{};
21654 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21655 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21656 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21657 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21658
21659 VkCommandBuffer command_buffer;
21660 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21661 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21662 command_buffer_allocate_info.commandPool = command_pool;
21663 command_buffer_allocate_info.commandBufferCount = 1;
21664 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21665 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21666
21667 VkQueue queue = VK_NULL_HANDLE;
21668 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21669
21670 {
21671 VkCommandBufferBeginInfo begin_info{};
21672 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21673 vkBeginCommandBuffer(command_buffer, &begin_info);
21674
21675 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 -070021676 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021677 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
21678 vkEndCommandBuffer(command_buffer);
21679 }
21680 {
21681 VkSubmitInfo submit_info{};
21682 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21683 submit_info.commandBufferCount = 1;
21684 submit_info.pCommandBuffers = &command_buffer;
21685 submit_info.signalSemaphoreCount = 0;
21686 submit_info.pSignalSemaphores = nullptr;
21687 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21688 }
21689 { vkSetEvent(m_device->device(), event); }
21690
21691 vkQueueWaitIdle(queue);
21692
21693 vkDestroyEvent(m_device->device(), event, nullptr);
21694 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21695 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21696
21697 m_errorMonitor->VerifyNotFound();
21698}
21699// This is a positive test. No errors should be generated.
21700TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
21701 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
21702
Tony Barbour1fa09702017-03-16 12:09:08 -060021703 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021704 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021705
21706 m_errorMonitor->ExpectSuccess();
21707
21708 VkQueryPool query_pool;
21709 VkQueryPoolCreateInfo query_pool_create_info{};
21710 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21711 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21712 query_pool_create_info.queryCount = 1;
21713 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21714
21715 VkCommandPool command_pool;
21716 VkCommandPoolCreateInfo pool_create_info{};
21717 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21718 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21719 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21720 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21721
21722 VkCommandBuffer command_buffer;
21723 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21724 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21725 command_buffer_allocate_info.commandPool = command_pool;
21726 command_buffer_allocate_info.commandBufferCount = 1;
21727 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21728 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21729
21730 VkCommandBuffer secondary_command_buffer;
21731 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
21732 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
21733
21734 VkQueue queue = VK_NULL_HANDLE;
21735 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21736
21737 uint32_t qfi = 0;
21738 VkBufferCreateInfo buff_create_info = {};
21739 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21740 buff_create_info.size = 1024;
21741 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21742 buff_create_info.queueFamilyIndexCount = 1;
21743 buff_create_info.pQueueFamilyIndices = &qfi;
21744
21745 VkResult err;
21746 VkBuffer buffer;
21747 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21748 ASSERT_VK_SUCCESS(err);
21749 VkMemoryAllocateInfo mem_alloc = {};
21750 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21751 mem_alloc.pNext = NULL;
21752 mem_alloc.allocationSize = 1024;
21753 mem_alloc.memoryTypeIndex = 0;
21754
21755 VkMemoryRequirements memReqs;
21756 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21757 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21758 if (!pass) {
21759 vkDestroyBuffer(m_device->device(), buffer, NULL);
21760 return;
21761 }
21762
21763 VkDeviceMemory mem;
21764 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21765 ASSERT_VK_SUCCESS(err);
21766 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21767 ASSERT_VK_SUCCESS(err);
21768
21769 VkCommandBufferInheritanceInfo hinfo = {};
21770 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
21771 hinfo.renderPass = VK_NULL_HANDLE;
21772 hinfo.subpass = 0;
21773 hinfo.framebuffer = VK_NULL_HANDLE;
21774 hinfo.occlusionQueryEnable = VK_FALSE;
21775 hinfo.queryFlags = 0;
21776 hinfo.pipelineStatistics = 0;
21777
21778 {
21779 VkCommandBufferBeginInfo begin_info{};
21780 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21781 begin_info.pInheritanceInfo = &hinfo;
21782 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
21783
21784 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
21785 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21786
21787 vkEndCommandBuffer(secondary_command_buffer);
21788
21789 begin_info.pInheritanceInfo = nullptr;
21790 vkBeginCommandBuffer(command_buffer, &begin_info);
21791
21792 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
21793 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
21794
21795 vkEndCommandBuffer(command_buffer);
21796 }
21797 {
21798 VkSubmitInfo submit_info{};
21799 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21800 submit_info.commandBufferCount = 1;
21801 submit_info.pCommandBuffers = &command_buffer;
21802 submit_info.signalSemaphoreCount = 0;
21803 submit_info.pSignalSemaphores = nullptr;
21804 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21805 }
21806
21807 vkQueueWaitIdle(queue);
21808
21809 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21810 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21811 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21812 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21813 vkDestroyBuffer(m_device->device(), buffer, NULL);
21814 vkFreeMemory(m_device->device(), mem, NULL);
21815
21816 m_errorMonitor->VerifyNotFound();
21817}
21818
21819// This is a positive test. No errors should be generated.
21820TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21821 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21822
Tony Barbour1fa09702017-03-16 12:09:08 -060021823 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021824 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021825
21826 m_errorMonitor->ExpectSuccess();
21827
21828 VkQueryPool query_pool;
21829 VkQueryPoolCreateInfo query_pool_create_info{};
21830 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21831 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21832 query_pool_create_info.queryCount = 1;
21833 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21834
21835 VkCommandPool command_pool;
21836 VkCommandPoolCreateInfo pool_create_info{};
21837 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21838 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21839 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21840 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21841
21842 VkCommandBuffer command_buffer[2];
21843 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21844 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21845 command_buffer_allocate_info.commandPool = command_pool;
21846 command_buffer_allocate_info.commandBufferCount = 2;
21847 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21848 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21849
21850 VkQueue queue = VK_NULL_HANDLE;
21851 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21852
21853 uint32_t qfi = 0;
21854 VkBufferCreateInfo buff_create_info = {};
21855 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21856 buff_create_info.size = 1024;
21857 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21858 buff_create_info.queueFamilyIndexCount = 1;
21859 buff_create_info.pQueueFamilyIndices = &qfi;
21860
21861 VkResult err;
21862 VkBuffer buffer;
21863 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21864 ASSERT_VK_SUCCESS(err);
21865 VkMemoryAllocateInfo mem_alloc = {};
21866 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21867 mem_alloc.pNext = NULL;
21868 mem_alloc.allocationSize = 1024;
21869 mem_alloc.memoryTypeIndex = 0;
21870
21871 VkMemoryRequirements memReqs;
21872 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21873 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21874 if (!pass) {
21875 vkDestroyBuffer(m_device->device(), buffer, NULL);
21876 return;
21877 }
21878
21879 VkDeviceMemory mem;
21880 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21881 ASSERT_VK_SUCCESS(err);
21882 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21883 ASSERT_VK_SUCCESS(err);
21884
21885 {
21886 VkCommandBufferBeginInfo begin_info{};
21887 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21888 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21889
21890 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21891 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21892
21893 vkEndCommandBuffer(command_buffer[0]);
21894
21895 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21896
21897 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21898
21899 vkEndCommandBuffer(command_buffer[1]);
21900 }
21901 {
21902 VkSubmitInfo submit_info{};
21903 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21904 submit_info.commandBufferCount = 2;
21905 submit_info.pCommandBuffers = command_buffer;
21906 submit_info.signalSemaphoreCount = 0;
21907 submit_info.pSignalSemaphores = nullptr;
21908 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21909 }
21910
21911 vkQueueWaitIdle(queue);
21912
21913 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21914 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21915 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21916 vkDestroyBuffer(m_device->device(), buffer, NULL);
21917 vkFreeMemory(m_device->device(), mem, NULL);
21918
21919 m_errorMonitor->VerifyNotFound();
21920}
21921
Tony Barbourc46924f2016-11-04 11:49:52 -060021922TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021923 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21924
Tony Barbour1fa09702017-03-16 12:09:08 -060021925 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021926 VkEvent event;
21927 VkEventCreateInfo event_create_info{};
21928 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21929 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21930
21931 VkCommandPool command_pool;
21932 VkCommandPoolCreateInfo pool_create_info{};
21933 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21934 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21935 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21936 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21937
21938 VkCommandBuffer command_buffer;
21939 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21940 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21941 command_buffer_allocate_info.commandPool = command_pool;
21942 command_buffer_allocate_info.commandBufferCount = 1;
21943 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21944 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21945
21946 VkQueue queue = VK_NULL_HANDLE;
21947 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21948
21949 {
21950 VkCommandBufferBeginInfo begin_info{};
21951 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21952 vkBeginCommandBuffer(command_buffer, &begin_info);
21953
21954 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021955 vkEndCommandBuffer(command_buffer);
21956 }
21957 {
21958 VkSubmitInfo submit_info{};
21959 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21960 submit_info.commandBufferCount = 1;
21961 submit_info.pCommandBuffers = &command_buffer;
21962 submit_info.signalSemaphoreCount = 0;
21963 submit_info.pSignalSemaphores = nullptr;
21964 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21965 }
21966 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21968 "that is already in use by a "
21969 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021970 vkSetEvent(m_device->device(), event);
21971 m_errorMonitor->VerifyFound();
21972 }
21973
21974 vkQueueWaitIdle(queue);
21975
21976 vkDestroyEvent(m_device->device(), event, nullptr);
21977 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21978 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21979}
21980
21981// This is a positive test. No errors should be generated.
21982TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021983 TEST_DESCRIPTION(
21984 "Two command buffers with two separate fences are each "
21985 "run through a Submit & WaitForFences cycle 3 times. This "
21986 "previously revealed a bug so running this positive test "
21987 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021988 m_errorMonitor->ExpectSuccess();
21989
Tony Barbour1fa09702017-03-16 12:09:08 -060021990 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021991 VkQueue queue = VK_NULL_HANDLE;
21992 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21993
21994 static const uint32_t NUM_OBJECTS = 2;
21995 static const uint32_t NUM_FRAMES = 3;
21996 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21997 VkFence fences[NUM_OBJECTS] = {};
21998
21999 VkCommandPool cmd_pool;
22000 VkCommandPoolCreateInfo cmd_pool_ci = {};
22001 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22002 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
22003 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22004 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
22005 ASSERT_VK_SUCCESS(err);
22006
22007 VkCommandBufferAllocateInfo cmd_buf_info = {};
22008 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22009 cmd_buf_info.commandPool = cmd_pool;
22010 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22011 cmd_buf_info.commandBufferCount = 1;
22012
22013 VkFenceCreateInfo fence_ci = {};
22014 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22015 fence_ci.pNext = nullptr;
22016 fence_ci.flags = 0;
22017
22018 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22019 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
22020 ASSERT_VK_SUCCESS(err);
22021 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
22022 ASSERT_VK_SUCCESS(err);
22023 }
22024
22025 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
22026 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
22027 // Create empty cmd buffer
22028 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
22029 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22030
22031 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
22032 ASSERT_VK_SUCCESS(err);
22033 err = vkEndCommandBuffer(cmd_buffers[obj]);
22034 ASSERT_VK_SUCCESS(err);
22035
22036 VkSubmitInfo submit_info = {};
22037 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22038 submit_info.commandBufferCount = 1;
22039 submit_info.pCommandBuffers = &cmd_buffers[obj];
22040 // Submit cmd buffer and wait for fence
22041 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
22042 ASSERT_VK_SUCCESS(err);
22043 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
22044 ASSERT_VK_SUCCESS(err);
22045 err = vkResetFences(m_device->device(), 1, &fences[obj]);
22046 ASSERT_VK_SUCCESS(err);
22047 }
22048 }
22049 m_errorMonitor->VerifyNotFound();
22050 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
22051 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22052 vkDestroyFence(m_device->device(), fences[i], nullptr);
22053 }
22054}
22055// This is a positive test. No errors should be generated.
22056TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022057 TEST_DESCRIPTION(
22058 "Two command buffers, each in a separate QueueSubmit call "
22059 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022060
Tony Barbour1fa09702017-03-16 12:09:08 -060022061 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022062 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022063
22064 m_errorMonitor->ExpectSuccess();
22065
22066 VkSemaphore semaphore;
22067 VkSemaphoreCreateInfo semaphore_create_info{};
22068 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22069 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22070
22071 VkCommandPool command_pool;
22072 VkCommandPoolCreateInfo pool_create_info{};
22073 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22074 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22075 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22076 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22077
22078 VkCommandBuffer command_buffer[2];
22079 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22080 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22081 command_buffer_allocate_info.commandPool = command_pool;
22082 command_buffer_allocate_info.commandBufferCount = 2;
22083 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22084 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22085
22086 VkQueue queue = VK_NULL_HANDLE;
22087 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22088
22089 {
22090 VkCommandBufferBeginInfo begin_info{};
22091 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22092 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22093
22094 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 -070022095 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022096
22097 VkViewport viewport{};
22098 viewport.maxDepth = 1.0f;
22099 viewport.minDepth = 0.0f;
22100 viewport.width = 512;
22101 viewport.height = 512;
22102 viewport.x = 0;
22103 viewport.y = 0;
22104 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22105 vkEndCommandBuffer(command_buffer[0]);
22106 }
22107 {
22108 VkCommandBufferBeginInfo begin_info{};
22109 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22110 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22111
22112 VkViewport viewport{};
22113 viewport.maxDepth = 1.0f;
22114 viewport.minDepth = 0.0f;
22115 viewport.width = 512;
22116 viewport.height = 512;
22117 viewport.x = 0;
22118 viewport.y = 0;
22119 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22120 vkEndCommandBuffer(command_buffer[1]);
22121 }
22122 {
22123 VkSubmitInfo submit_info{};
22124 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22125 submit_info.commandBufferCount = 1;
22126 submit_info.pCommandBuffers = &command_buffer[0];
22127 submit_info.signalSemaphoreCount = 1;
22128 submit_info.pSignalSemaphores = &semaphore;
22129 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22130 }
22131 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022132 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022133 VkSubmitInfo submit_info{};
22134 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22135 submit_info.commandBufferCount = 1;
22136 submit_info.pCommandBuffers = &command_buffer[1];
22137 submit_info.waitSemaphoreCount = 1;
22138 submit_info.pWaitSemaphores = &semaphore;
22139 submit_info.pWaitDstStageMask = flags;
22140 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22141 }
22142
22143 vkQueueWaitIdle(m_device->m_queue);
22144
22145 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22146 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22147 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22148
22149 m_errorMonitor->VerifyNotFound();
22150}
22151
22152// This is a positive test. No errors should be generated.
22153TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022154 TEST_DESCRIPTION(
22155 "Two command buffers, each in a separate QueueSubmit call "
22156 "submitted on separate queues, the second having a fence"
22157 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022158
Tony Barbour1fa09702017-03-16 12:09:08 -060022159 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022160 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022161
22162 m_errorMonitor->ExpectSuccess();
22163
22164 VkFence fence;
22165 VkFenceCreateInfo fence_create_info{};
22166 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22167 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22168
22169 VkSemaphore semaphore;
22170 VkSemaphoreCreateInfo semaphore_create_info{};
22171 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22172 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22173
22174 VkCommandPool command_pool;
22175 VkCommandPoolCreateInfo pool_create_info{};
22176 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22177 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22178 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22179 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22180
22181 VkCommandBuffer command_buffer[2];
22182 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22183 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22184 command_buffer_allocate_info.commandPool = command_pool;
22185 command_buffer_allocate_info.commandBufferCount = 2;
22186 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22187 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22188
22189 VkQueue queue = VK_NULL_HANDLE;
22190 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22191
22192 {
22193 VkCommandBufferBeginInfo begin_info{};
22194 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22195 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22196
22197 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 -070022198 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022199
22200 VkViewport viewport{};
22201 viewport.maxDepth = 1.0f;
22202 viewport.minDepth = 0.0f;
22203 viewport.width = 512;
22204 viewport.height = 512;
22205 viewport.x = 0;
22206 viewport.y = 0;
22207 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22208 vkEndCommandBuffer(command_buffer[0]);
22209 }
22210 {
22211 VkCommandBufferBeginInfo begin_info{};
22212 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22213 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22214
22215 VkViewport viewport{};
22216 viewport.maxDepth = 1.0f;
22217 viewport.minDepth = 0.0f;
22218 viewport.width = 512;
22219 viewport.height = 512;
22220 viewport.x = 0;
22221 viewport.y = 0;
22222 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22223 vkEndCommandBuffer(command_buffer[1]);
22224 }
22225 {
22226 VkSubmitInfo submit_info{};
22227 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22228 submit_info.commandBufferCount = 1;
22229 submit_info.pCommandBuffers = &command_buffer[0];
22230 submit_info.signalSemaphoreCount = 1;
22231 submit_info.pSignalSemaphores = &semaphore;
22232 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22233 }
22234 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022235 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022236 VkSubmitInfo submit_info{};
22237 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22238 submit_info.commandBufferCount = 1;
22239 submit_info.pCommandBuffers = &command_buffer[1];
22240 submit_info.waitSemaphoreCount = 1;
22241 submit_info.pWaitSemaphores = &semaphore;
22242 submit_info.pWaitDstStageMask = flags;
22243 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22244 }
22245
22246 vkQueueWaitIdle(m_device->m_queue);
22247
22248 vkDestroyFence(m_device->device(), fence, nullptr);
22249 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22250 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22251 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22252
22253 m_errorMonitor->VerifyNotFound();
22254}
22255
22256// This is a positive test. No errors should be generated.
22257TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022258 TEST_DESCRIPTION(
22259 "Two command buffers, each in a separate QueueSubmit call "
22260 "submitted on separate queues, the second having a fence"
22261 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022262
Tony Barbour1fa09702017-03-16 12:09:08 -060022263 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022264 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022265
22266 m_errorMonitor->ExpectSuccess();
22267
22268 VkFence fence;
22269 VkFenceCreateInfo fence_create_info{};
22270 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22271 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22272
22273 VkSemaphore semaphore;
22274 VkSemaphoreCreateInfo semaphore_create_info{};
22275 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22276 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22277
22278 VkCommandPool command_pool;
22279 VkCommandPoolCreateInfo pool_create_info{};
22280 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22281 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22282 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22283 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22284
22285 VkCommandBuffer command_buffer[2];
22286 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22287 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22288 command_buffer_allocate_info.commandPool = command_pool;
22289 command_buffer_allocate_info.commandBufferCount = 2;
22290 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22291 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22292
22293 VkQueue queue = VK_NULL_HANDLE;
22294 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22295
22296 {
22297 VkCommandBufferBeginInfo begin_info{};
22298 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22299 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22300
22301 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 -070022302 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022303
22304 VkViewport viewport{};
22305 viewport.maxDepth = 1.0f;
22306 viewport.minDepth = 0.0f;
22307 viewport.width = 512;
22308 viewport.height = 512;
22309 viewport.x = 0;
22310 viewport.y = 0;
22311 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22312 vkEndCommandBuffer(command_buffer[0]);
22313 }
22314 {
22315 VkCommandBufferBeginInfo begin_info{};
22316 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22317 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22318
22319 VkViewport viewport{};
22320 viewport.maxDepth = 1.0f;
22321 viewport.minDepth = 0.0f;
22322 viewport.width = 512;
22323 viewport.height = 512;
22324 viewport.x = 0;
22325 viewport.y = 0;
22326 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22327 vkEndCommandBuffer(command_buffer[1]);
22328 }
22329 {
22330 VkSubmitInfo submit_info{};
22331 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22332 submit_info.commandBufferCount = 1;
22333 submit_info.pCommandBuffers = &command_buffer[0];
22334 submit_info.signalSemaphoreCount = 1;
22335 submit_info.pSignalSemaphores = &semaphore;
22336 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22337 }
22338 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022339 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022340 VkSubmitInfo submit_info{};
22341 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22342 submit_info.commandBufferCount = 1;
22343 submit_info.pCommandBuffers = &command_buffer[1];
22344 submit_info.waitSemaphoreCount = 1;
22345 submit_info.pWaitSemaphores = &semaphore;
22346 submit_info.pWaitDstStageMask = flags;
22347 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22348 }
22349
22350 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22351 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22352
22353 vkDestroyFence(m_device->device(), fence, nullptr);
22354 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22355 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22356 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22357
22358 m_errorMonitor->VerifyNotFound();
22359}
22360
22361TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060022362 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022363 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022364 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022365 return;
22366 }
22367
22368 VkResult err;
22369
22370 m_errorMonitor->ExpectSuccess();
22371
22372 VkQueue q0 = m_device->m_queue;
22373 VkQueue q1 = nullptr;
22374 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
22375 ASSERT_NE(q1, nullptr);
22376
22377 // An (empty) command buffer. We must have work in the first submission --
22378 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022379 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022380 VkCommandPool pool;
22381 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
22382 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022383 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
22384 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022385 VkCommandBuffer cb;
22386 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
22387 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022388 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022389 err = vkBeginCommandBuffer(cb, &cbbi);
22390 ASSERT_VK_SUCCESS(err);
22391 err = vkEndCommandBuffer(cb);
22392 ASSERT_VK_SUCCESS(err);
22393
22394 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022395 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022396 VkSemaphore s;
22397 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
22398 ASSERT_VK_SUCCESS(err);
22399
22400 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022401 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022402
22403 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
22404 ASSERT_VK_SUCCESS(err);
22405
22406 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022407 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022408 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022409
22410 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
22411 ASSERT_VK_SUCCESS(err);
22412
22413 // Wait for q0 idle
22414 err = vkQueueWaitIdle(q0);
22415 ASSERT_VK_SUCCESS(err);
22416
22417 // Command buffer should have been completed (it was on q0); reset the pool.
22418 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
22419
22420 m_errorMonitor->VerifyNotFound();
22421
22422 // Force device completely idle and clean up resources
22423 vkDeviceWaitIdle(m_device->device());
22424 vkDestroyCommandPool(m_device->device(), pool, nullptr);
22425 vkDestroySemaphore(m_device->device(), s, nullptr);
22426}
22427
22428// This is a positive test. No errors should be generated.
22429TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022430 TEST_DESCRIPTION(
22431 "Two command buffers, each in a separate QueueSubmit call "
22432 "submitted on separate queues, the second having a fence, "
22433 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022434
Tony Barbour1fa09702017-03-16 12:09:08 -060022435 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022436 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022437
22438 m_errorMonitor->ExpectSuccess();
22439
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022440 VkFence fence;
22441 VkFenceCreateInfo fence_create_info{};
22442 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22443 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22444
22445 VkSemaphore semaphore;
22446 VkSemaphoreCreateInfo semaphore_create_info{};
22447 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22448 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22449
22450 VkCommandPool command_pool;
22451 VkCommandPoolCreateInfo pool_create_info{};
22452 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22453 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22454 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22455 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22456
22457 VkCommandBuffer command_buffer[2];
22458 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22459 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22460 command_buffer_allocate_info.commandPool = command_pool;
22461 command_buffer_allocate_info.commandBufferCount = 2;
22462 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22463 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22464
22465 VkQueue queue = VK_NULL_HANDLE;
22466 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22467
22468 {
22469 VkCommandBufferBeginInfo begin_info{};
22470 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22471 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22472
22473 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 -070022474 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022475
22476 VkViewport viewport{};
22477 viewport.maxDepth = 1.0f;
22478 viewport.minDepth = 0.0f;
22479 viewport.width = 512;
22480 viewport.height = 512;
22481 viewport.x = 0;
22482 viewport.y = 0;
22483 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22484 vkEndCommandBuffer(command_buffer[0]);
22485 }
22486 {
22487 VkCommandBufferBeginInfo begin_info{};
22488 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22489 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22490
22491 VkViewport viewport{};
22492 viewport.maxDepth = 1.0f;
22493 viewport.minDepth = 0.0f;
22494 viewport.width = 512;
22495 viewport.height = 512;
22496 viewport.x = 0;
22497 viewport.y = 0;
22498 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22499 vkEndCommandBuffer(command_buffer[1]);
22500 }
22501 {
22502 VkSubmitInfo submit_info{};
22503 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22504 submit_info.commandBufferCount = 1;
22505 submit_info.pCommandBuffers = &command_buffer[0];
22506 submit_info.signalSemaphoreCount = 1;
22507 submit_info.pSignalSemaphores = &semaphore;
22508 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22509 }
22510 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022511 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022512 VkSubmitInfo submit_info{};
22513 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22514 submit_info.commandBufferCount = 1;
22515 submit_info.pCommandBuffers = &command_buffer[1];
22516 submit_info.waitSemaphoreCount = 1;
22517 submit_info.pWaitSemaphores = &semaphore;
22518 submit_info.pWaitDstStageMask = flags;
22519 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22520 }
22521
22522 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22523
22524 vkDestroyFence(m_device->device(), fence, nullptr);
22525 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22526 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22527 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22528
22529 m_errorMonitor->VerifyNotFound();
22530}
22531
22532// This is a positive test. No errors should be generated.
22533TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022534 TEST_DESCRIPTION(
22535 "Two command buffers, each in a separate QueueSubmit call "
22536 "on the same queue, sharing a signal/wait semaphore, the "
22537 "second having a fence, "
22538 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022539
22540 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 VkFence fence;
22544 VkFenceCreateInfo fence_create_info{};
22545 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22546 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22547
22548 VkSemaphore semaphore;
22549 VkSemaphoreCreateInfo semaphore_create_info{};
22550 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22551 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22552
22553 VkCommandPool command_pool;
22554 VkCommandPoolCreateInfo pool_create_info{};
22555 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22556 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22557 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22558 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22559
22560 VkCommandBuffer command_buffer[2];
22561 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22562 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22563 command_buffer_allocate_info.commandPool = command_pool;
22564 command_buffer_allocate_info.commandBufferCount = 2;
22565 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22566 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22567
22568 {
22569 VkCommandBufferBeginInfo begin_info{};
22570 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22571 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22572
22573 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 -070022574 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022575
22576 VkViewport viewport{};
22577 viewport.maxDepth = 1.0f;
22578 viewport.minDepth = 0.0f;
22579 viewport.width = 512;
22580 viewport.height = 512;
22581 viewport.x = 0;
22582 viewport.y = 0;
22583 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22584 vkEndCommandBuffer(command_buffer[0]);
22585 }
22586 {
22587 VkCommandBufferBeginInfo begin_info{};
22588 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22589 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22590
22591 VkViewport viewport{};
22592 viewport.maxDepth = 1.0f;
22593 viewport.minDepth = 0.0f;
22594 viewport.width = 512;
22595 viewport.height = 512;
22596 viewport.x = 0;
22597 viewport.y = 0;
22598 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22599 vkEndCommandBuffer(command_buffer[1]);
22600 }
22601 {
22602 VkSubmitInfo submit_info{};
22603 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22604 submit_info.commandBufferCount = 1;
22605 submit_info.pCommandBuffers = &command_buffer[0];
22606 submit_info.signalSemaphoreCount = 1;
22607 submit_info.pSignalSemaphores = &semaphore;
22608 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22609 }
22610 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022611 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022612 VkSubmitInfo submit_info{};
22613 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22614 submit_info.commandBufferCount = 1;
22615 submit_info.pCommandBuffers = &command_buffer[1];
22616 submit_info.waitSemaphoreCount = 1;
22617 submit_info.pWaitSemaphores = &semaphore;
22618 submit_info.pWaitDstStageMask = flags;
22619 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22620 }
22621
22622 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22623
22624 vkDestroyFence(m_device->device(), fence, nullptr);
22625 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22626 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22627 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22628
22629 m_errorMonitor->VerifyNotFound();
22630}
22631
22632// This is a positive test. No errors should be generated.
22633TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022634 TEST_DESCRIPTION(
22635 "Two command buffers, each in a separate QueueSubmit call "
22636 "on the same queue, no fences, followed by a third QueueSubmit with NO "
22637 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022638
22639 m_errorMonitor->ExpectSuccess();
22640
Tony Barbour1fa09702017-03-16 12:09:08 -060022641 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022642 VkFence fence;
22643 VkFenceCreateInfo fence_create_info{};
22644 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22645 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22646
22647 VkCommandPool command_pool;
22648 VkCommandPoolCreateInfo pool_create_info{};
22649 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22650 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22651 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22652 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22653
22654 VkCommandBuffer command_buffer[2];
22655 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22656 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22657 command_buffer_allocate_info.commandPool = command_pool;
22658 command_buffer_allocate_info.commandBufferCount = 2;
22659 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22660 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22661
22662 {
22663 VkCommandBufferBeginInfo begin_info{};
22664 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22665 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22666
22667 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 -070022668 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022669
22670 VkViewport viewport{};
22671 viewport.maxDepth = 1.0f;
22672 viewport.minDepth = 0.0f;
22673 viewport.width = 512;
22674 viewport.height = 512;
22675 viewport.x = 0;
22676 viewport.y = 0;
22677 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22678 vkEndCommandBuffer(command_buffer[0]);
22679 }
22680 {
22681 VkCommandBufferBeginInfo begin_info{};
22682 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22683 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22684
22685 VkViewport viewport{};
22686 viewport.maxDepth = 1.0f;
22687 viewport.minDepth = 0.0f;
22688 viewport.width = 512;
22689 viewport.height = 512;
22690 viewport.x = 0;
22691 viewport.y = 0;
22692 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22693 vkEndCommandBuffer(command_buffer[1]);
22694 }
22695 {
22696 VkSubmitInfo submit_info{};
22697 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22698 submit_info.commandBufferCount = 1;
22699 submit_info.pCommandBuffers = &command_buffer[0];
22700 submit_info.signalSemaphoreCount = 0;
22701 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22702 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22703 }
22704 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022705 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022706 VkSubmitInfo submit_info{};
22707 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22708 submit_info.commandBufferCount = 1;
22709 submit_info.pCommandBuffers = &command_buffer[1];
22710 submit_info.waitSemaphoreCount = 0;
22711 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22712 submit_info.pWaitDstStageMask = flags;
22713 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22714 }
22715
22716 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
22717
22718 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22719 ASSERT_VK_SUCCESS(err);
22720
22721 vkDestroyFence(m_device->device(), fence, nullptr);
22722 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22723 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22724
22725 m_errorMonitor->VerifyNotFound();
22726}
22727
22728// This is a positive test. No errors should be generated.
22729TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022730 TEST_DESCRIPTION(
22731 "Two command buffers, each in a separate QueueSubmit call "
22732 "on the same queue, the second having a fence, followed "
22733 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022734
22735 m_errorMonitor->ExpectSuccess();
22736
Tony Barbour1fa09702017-03-16 12:09:08 -060022737 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022738 VkFence fence;
22739 VkFenceCreateInfo fence_create_info{};
22740 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22741 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22742
22743 VkCommandPool command_pool;
22744 VkCommandPoolCreateInfo pool_create_info{};
22745 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22746 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22747 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22748 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22749
22750 VkCommandBuffer command_buffer[2];
22751 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22752 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22753 command_buffer_allocate_info.commandPool = command_pool;
22754 command_buffer_allocate_info.commandBufferCount = 2;
22755 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22756 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22757
22758 {
22759 VkCommandBufferBeginInfo begin_info{};
22760 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22761 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22762
22763 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 -070022764 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022765
22766 VkViewport viewport{};
22767 viewport.maxDepth = 1.0f;
22768 viewport.minDepth = 0.0f;
22769 viewport.width = 512;
22770 viewport.height = 512;
22771 viewport.x = 0;
22772 viewport.y = 0;
22773 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22774 vkEndCommandBuffer(command_buffer[0]);
22775 }
22776 {
22777 VkCommandBufferBeginInfo begin_info{};
22778 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22779 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22780
22781 VkViewport viewport{};
22782 viewport.maxDepth = 1.0f;
22783 viewport.minDepth = 0.0f;
22784 viewport.width = 512;
22785 viewport.height = 512;
22786 viewport.x = 0;
22787 viewport.y = 0;
22788 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22789 vkEndCommandBuffer(command_buffer[1]);
22790 }
22791 {
22792 VkSubmitInfo submit_info{};
22793 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22794 submit_info.commandBufferCount = 1;
22795 submit_info.pCommandBuffers = &command_buffer[0];
22796 submit_info.signalSemaphoreCount = 0;
22797 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22798 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22799 }
22800 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022801 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022802 VkSubmitInfo submit_info{};
22803 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22804 submit_info.commandBufferCount = 1;
22805 submit_info.pCommandBuffers = &command_buffer[1];
22806 submit_info.waitSemaphoreCount = 0;
22807 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22808 submit_info.pWaitDstStageMask = flags;
22809 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22810 }
22811
22812 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22813
22814 vkDestroyFence(m_device->device(), fence, nullptr);
22815 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22816 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22817
22818 m_errorMonitor->VerifyNotFound();
22819}
22820
22821// This is a positive test. No errors should be generated.
22822TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022823 TEST_DESCRIPTION(
22824 "Two command buffers each in a separate SubmitInfo sent in a single "
22825 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022826 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022827
22828 m_errorMonitor->ExpectSuccess();
22829
22830 VkFence fence;
22831 VkFenceCreateInfo fence_create_info{};
22832 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22833 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22834
22835 VkSemaphore semaphore;
22836 VkSemaphoreCreateInfo semaphore_create_info{};
22837 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22838 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22839
22840 VkCommandPool command_pool;
22841 VkCommandPoolCreateInfo pool_create_info{};
22842 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22843 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22844 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22845 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22846
22847 VkCommandBuffer command_buffer[2];
22848 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22849 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22850 command_buffer_allocate_info.commandPool = command_pool;
22851 command_buffer_allocate_info.commandBufferCount = 2;
22852 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22853 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22854
22855 {
22856 VkCommandBufferBeginInfo begin_info{};
22857 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22858 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22859
22860 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 -070022861 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022862
22863 VkViewport viewport{};
22864 viewport.maxDepth = 1.0f;
22865 viewport.minDepth = 0.0f;
22866 viewport.width = 512;
22867 viewport.height = 512;
22868 viewport.x = 0;
22869 viewport.y = 0;
22870 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22871 vkEndCommandBuffer(command_buffer[0]);
22872 }
22873 {
22874 VkCommandBufferBeginInfo begin_info{};
22875 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22876 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22877
22878 VkViewport viewport{};
22879 viewport.maxDepth = 1.0f;
22880 viewport.minDepth = 0.0f;
22881 viewport.width = 512;
22882 viewport.height = 512;
22883 viewport.x = 0;
22884 viewport.y = 0;
22885 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22886 vkEndCommandBuffer(command_buffer[1]);
22887 }
22888 {
22889 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022890 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022891
22892 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22893 submit_info[0].pNext = NULL;
22894 submit_info[0].commandBufferCount = 1;
22895 submit_info[0].pCommandBuffers = &command_buffer[0];
22896 submit_info[0].signalSemaphoreCount = 1;
22897 submit_info[0].pSignalSemaphores = &semaphore;
22898 submit_info[0].waitSemaphoreCount = 0;
22899 submit_info[0].pWaitSemaphores = NULL;
22900 submit_info[0].pWaitDstStageMask = 0;
22901
22902 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22903 submit_info[1].pNext = NULL;
22904 submit_info[1].commandBufferCount = 1;
22905 submit_info[1].pCommandBuffers = &command_buffer[1];
22906 submit_info[1].waitSemaphoreCount = 1;
22907 submit_info[1].pWaitSemaphores = &semaphore;
22908 submit_info[1].pWaitDstStageMask = flags;
22909 submit_info[1].signalSemaphoreCount = 0;
22910 submit_info[1].pSignalSemaphores = NULL;
22911 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22912 }
22913
22914 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22915
22916 vkDestroyFence(m_device->device(), fence, nullptr);
22917 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22918 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22919 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22920
22921 m_errorMonitor->VerifyNotFound();
22922}
22923
22924TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22925 m_errorMonitor->ExpectSuccess();
22926
Tony Barbour1fa09702017-03-16 12:09:08 -060022927 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22929
Tony Barbour552f6c02016-12-21 14:34:07 -070022930 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022931
22932 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22933 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22934 m_errorMonitor->VerifyNotFound();
22935 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22936 m_errorMonitor->VerifyNotFound();
22937 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22938 m_errorMonitor->VerifyNotFound();
22939
22940 m_commandBuffer->EndCommandBuffer();
22941 m_errorMonitor->VerifyNotFound();
22942}
22943
22944TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022945 TEST_DESCRIPTION(
22946 "Positive test where we create a renderpass with an "
22947 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22948 "has a valid layout, and a second subpass then uses a "
22949 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022950 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022951 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022952 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022953 if (!depth_format) {
22954 printf(" No Depth + Stencil format found. Skipped.\n");
22955 return;
22956 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022957
22958 VkAttachmentReference attach[2] = {};
22959 attach[0].attachment = 0;
22960 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22961 attach[1].attachment = 0;
22962 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22963 VkSubpassDescription subpasses[2] = {};
22964 // First subpass clears DS attach on load
22965 subpasses[0].pDepthStencilAttachment = &attach[0];
22966 // 2nd subpass reads in DS as input attachment
22967 subpasses[1].inputAttachmentCount = 1;
22968 subpasses[1].pInputAttachments = &attach[1];
22969 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022970 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022971 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22972 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22973 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22974 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22975 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22976 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22977 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22978 VkRenderPassCreateInfo rpci = {};
22979 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22980 rpci.attachmentCount = 1;
22981 rpci.pAttachments = &attach_desc;
22982 rpci.subpassCount = 2;
22983 rpci.pSubpasses = subpasses;
22984
22985 // Now create RenderPass and verify no errors
22986 VkRenderPass rp;
22987 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22988 m_errorMonitor->VerifyNotFound();
22989
22990 vkDestroyRenderPass(m_device->device(), rp, NULL);
22991}
22992
Tobin Ehlis01103de2017-02-16 13:22:47 -070022993TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22994 TEST_DESCRIPTION(
22995 "Create a render pass with depth-stencil attachment where layout transition "
22996 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22997 "transition has correctly occurred at queue submit time with no validation errors.");
22998
Tony Barbour1fa09702017-03-16 12:09:08 -060022999 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060023000 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070023001 if (!depth_format) {
23002 printf(" No Depth + Stencil format found. Skipped.\n");
23003 return;
23004 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070023005 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070023006 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023007 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
23008 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070023009 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070023010 return;
23011 }
23012
23013 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070023014 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23015
23016 // A renderpass with one depth/stencil attachment.
23017 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070023018 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023019 VK_SAMPLE_COUNT_1_BIT,
23020 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23021 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23022 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23023 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23024 VK_IMAGE_LAYOUT_UNDEFINED,
23025 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23026
23027 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23028
23029 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
23030
23031 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
23032
23033 VkRenderPass rp;
23034 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23035 ASSERT_VK_SUCCESS(err);
23036 // A compatible ds image.
23037 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060023038 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 -070023039 ASSERT_TRUE(image.initialized());
23040
23041 VkImageViewCreateInfo ivci = {
23042 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
23043 nullptr,
23044 0,
23045 image.handle(),
23046 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070023047 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023048 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
23049 VK_COMPONENT_SWIZZLE_IDENTITY},
23050 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
23051 };
23052 VkImageView view;
23053 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
23054 ASSERT_VK_SUCCESS(err);
23055
23056 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
23057 VkFramebuffer fb;
23058 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
23059 ASSERT_VK_SUCCESS(err);
23060
23061 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
23062 m_commandBuffer->BeginCommandBuffer();
23063 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
23064 vkCmdEndRenderPass(m_commandBuffer->handle());
23065 m_commandBuffer->EndCommandBuffer();
23066 QueueCommandBuffer(false);
23067 m_errorMonitor->VerifyNotFound();
23068
23069 // Cleanup
23070 vkDestroyImageView(m_device->device(), view, NULL);
23071 vkDestroyRenderPass(m_device->device(), rp, NULL);
23072 vkDestroyFramebuffer(m_device->device(), fb, NULL);
23073}
23074
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023075TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023076 TEST_DESCRIPTION(
23077 "Test that pipeline validation accepts matrices passed "
23078 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023079 m_errorMonitor->ExpectSuccess();
23080
Tony Barbour1fa09702017-03-16 12:09:08 -060023081 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023082 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23083
23084 VkVertexInputBindingDescription input_binding;
23085 memset(&input_binding, 0, sizeof(input_binding));
23086
23087 VkVertexInputAttributeDescription input_attribs[2];
23088 memset(input_attribs, 0, sizeof(input_attribs));
23089
23090 for (int i = 0; i < 2; i++) {
23091 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23092 input_attribs[i].location = i;
23093 }
23094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023095 char const *vsSource =
23096 "#version 450\n"
23097 "\n"
23098 "layout(location=0) in mat2x4 x;\n"
23099 "out gl_PerVertex {\n"
23100 " vec4 gl_Position;\n"
23101 "};\n"
23102 "void main(){\n"
23103 " gl_Position = x[0] + x[1];\n"
23104 "}\n";
23105 char const *fsSource =
23106 "#version 450\n"
23107 "\n"
23108 "layout(location=0) out vec4 color;\n"
23109 "void main(){\n"
23110 " color = vec4(1);\n"
23111 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023112
23113 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23114 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23115
23116 VkPipelineObj pipe(m_device);
23117 pipe.AddColorAttachment();
23118 pipe.AddShader(&vs);
23119 pipe.AddShader(&fs);
23120
23121 pipe.AddVertexInputBindings(&input_binding, 1);
23122 pipe.AddVertexInputAttribs(input_attribs, 2);
23123
23124 VkDescriptorSetObj descriptorSet(m_device);
23125 descriptorSet.AppendDummy();
23126 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23127
23128 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23129
23130 /* expect success */
23131 m_errorMonitor->VerifyNotFound();
23132}
23133
23134TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
23135 m_errorMonitor->ExpectSuccess();
23136
Tony Barbour1fa09702017-03-16 12:09:08 -060023137 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23139
23140 VkVertexInputBindingDescription input_binding;
23141 memset(&input_binding, 0, sizeof(input_binding));
23142
23143 VkVertexInputAttributeDescription input_attribs[2];
23144 memset(input_attribs, 0, sizeof(input_attribs));
23145
23146 for (int i = 0; i < 2; i++) {
23147 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23148 input_attribs[i].location = i;
23149 }
23150
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023151 char const *vsSource =
23152 "#version 450\n"
23153 "\n"
23154 "layout(location=0) in vec4 x[2];\n"
23155 "out gl_PerVertex {\n"
23156 " vec4 gl_Position;\n"
23157 "};\n"
23158 "void main(){\n"
23159 " gl_Position = x[0] + x[1];\n"
23160 "}\n";
23161 char const *fsSource =
23162 "#version 450\n"
23163 "\n"
23164 "layout(location=0) out vec4 color;\n"
23165 "void main(){\n"
23166 " color = vec4(1);\n"
23167 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023168
23169 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23170 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23171
23172 VkPipelineObj pipe(m_device);
23173 pipe.AddColorAttachment();
23174 pipe.AddShader(&vs);
23175 pipe.AddShader(&fs);
23176
23177 pipe.AddVertexInputBindings(&input_binding, 1);
23178 pipe.AddVertexInputAttribs(input_attribs, 2);
23179
23180 VkDescriptorSetObj descriptorSet(m_device);
23181 descriptorSet.AppendDummy();
23182 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23183
23184 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23185
23186 m_errorMonitor->VerifyNotFound();
23187}
23188
23189TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023190 TEST_DESCRIPTION(
23191 "Test that pipeline validation accepts consuming a vertex attribute "
23192 "through multiple vertex shader inputs, each consuming a different "
23193 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023194 m_errorMonitor->ExpectSuccess();
23195
Tony Barbour1fa09702017-03-16 12:09:08 -060023196 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023197 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23198
23199 VkVertexInputBindingDescription input_binding;
23200 memset(&input_binding, 0, sizeof(input_binding));
23201
23202 VkVertexInputAttributeDescription input_attribs[3];
23203 memset(input_attribs, 0, sizeof(input_attribs));
23204
23205 for (int i = 0; i < 3; i++) {
23206 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23207 input_attribs[i].location = i;
23208 }
23209
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023210 char const *vsSource =
23211 "#version 450\n"
23212 "\n"
23213 "layout(location=0) in vec4 x;\n"
23214 "layout(location=1) in vec3 y1;\n"
23215 "layout(location=1, component=3) in float y2;\n"
23216 "layout(location=2) in vec4 z;\n"
23217 "out gl_PerVertex {\n"
23218 " vec4 gl_Position;\n"
23219 "};\n"
23220 "void main(){\n"
23221 " gl_Position = x + vec4(y1, y2) + z;\n"
23222 "}\n";
23223 char const *fsSource =
23224 "#version 450\n"
23225 "\n"
23226 "layout(location=0) out vec4 color;\n"
23227 "void main(){\n"
23228 " color = vec4(1);\n"
23229 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023230
23231 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23232 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23233
23234 VkPipelineObj pipe(m_device);
23235 pipe.AddColorAttachment();
23236 pipe.AddShader(&vs);
23237 pipe.AddShader(&fs);
23238
23239 pipe.AddVertexInputBindings(&input_binding, 1);
23240 pipe.AddVertexInputAttribs(input_attribs, 3);
23241
23242 VkDescriptorSetObj descriptorSet(m_device);
23243 descriptorSet.AppendDummy();
23244 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23245
23246 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23247
23248 m_errorMonitor->VerifyNotFound();
23249}
23250
23251TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
23252 m_errorMonitor->ExpectSuccess();
23253
Tony Barbour1fa09702017-03-16 12:09:08 -060023254 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023255 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23256
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023257 char const *vsSource =
23258 "#version 450\n"
23259 "out gl_PerVertex {\n"
23260 " vec4 gl_Position;\n"
23261 "};\n"
23262 "void main(){\n"
23263 " gl_Position = vec4(0);\n"
23264 "}\n";
23265 char const *fsSource =
23266 "#version 450\n"
23267 "\n"
23268 "layout(location=0) out vec4 color;\n"
23269 "void main(){\n"
23270 " color = vec4(1);\n"
23271 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023272
23273 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23274 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23275
23276 VkPipelineObj pipe(m_device);
23277 pipe.AddColorAttachment();
23278 pipe.AddShader(&vs);
23279 pipe.AddShader(&fs);
23280
23281 VkDescriptorSetObj descriptorSet(m_device);
23282 descriptorSet.AppendDummy();
23283 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23284
23285 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23286
23287 m_errorMonitor->VerifyNotFound();
23288}
23289
23290TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023291 TEST_DESCRIPTION(
23292 "Test that pipeline validation accepts the relaxed type matching rules "
23293 "set out in 14.1.3: fundamental type must match, and producer side must "
23294 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023295 m_errorMonitor->ExpectSuccess();
23296
23297 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
23298
Tony Barbour1fa09702017-03-16 12:09:08 -060023299 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023300 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23301
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023302 char const *vsSource =
23303 "#version 450\n"
23304 "out gl_PerVertex {\n"
23305 " vec4 gl_Position;\n"
23306 "};\n"
23307 "layout(location=0) out vec3 x;\n"
23308 "layout(location=1) out ivec3 y;\n"
23309 "layout(location=2) out vec3 z;\n"
23310 "void main(){\n"
23311 " gl_Position = vec4(0);\n"
23312 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
23313 "}\n";
23314 char const *fsSource =
23315 "#version 450\n"
23316 "\n"
23317 "layout(location=0) out vec4 color;\n"
23318 "layout(location=0) in float x;\n"
23319 "layout(location=1) flat in int y;\n"
23320 "layout(location=2) in vec2 z;\n"
23321 "void main(){\n"
23322 " color = vec4(1 + x + y + z.x);\n"
23323 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023324
23325 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23326 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23327
23328 VkPipelineObj pipe(m_device);
23329 pipe.AddColorAttachment();
23330 pipe.AddShader(&vs);
23331 pipe.AddShader(&fs);
23332
23333 VkDescriptorSetObj descriptorSet(m_device);
23334 descriptorSet.AppendDummy();
23335 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23336
23337 VkResult err = VK_SUCCESS;
23338 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23339 ASSERT_VK_SUCCESS(err);
23340
23341 m_errorMonitor->VerifyNotFound();
23342}
23343
23344TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023345 TEST_DESCRIPTION(
23346 "Test that pipeline validation accepts per-vertex variables "
23347 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023348 m_errorMonitor->ExpectSuccess();
23349
Tony Barbour1fa09702017-03-16 12:09:08 -060023350 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23352
23353 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023354 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023355 return;
23356 }
23357
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023358 char const *vsSource =
23359 "#version 450\n"
23360 "void main(){}\n";
23361 char const *tcsSource =
23362 "#version 450\n"
23363 "layout(location=0) out int x[];\n"
23364 "layout(vertices=3) out;\n"
23365 "void main(){\n"
23366 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
23367 " gl_TessLevelInner[0] = 1;\n"
23368 " x[gl_InvocationID] = gl_InvocationID;\n"
23369 "}\n";
23370 char const *tesSource =
23371 "#version 450\n"
23372 "layout(triangles, equal_spacing, cw) in;\n"
23373 "layout(location=0) in int x[];\n"
23374 "out gl_PerVertex { vec4 gl_Position; };\n"
23375 "void main(){\n"
23376 " gl_Position.xyz = gl_TessCoord;\n"
23377 " gl_Position.w = x[0] + x[1] + x[2];\n"
23378 "}\n";
23379 char const *fsSource =
23380 "#version 450\n"
23381 "layout(location=0) out vec4 color;\n"
23382 "void main(){\n"
23383 " color = vec4(1);\n"
23384 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023385
23386 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23387 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
23388 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
23389 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23390
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023391 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
23392 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023393
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023394 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023395
23396 VkPipelineObj pipe(m_device);
23397 pipe.SetInputAssembly(&iasci);
23398 pipe.SetTessellation(&tsci);
23399 pipe.AddColorAttachment();
23400 pipe.AddShader(&vs);
23401 pipe.AddShader(&tcs);
23402 pipe.AddShader(&tes);
23403 pipe.AddShader(&fs);
23404
23405 VkDescriptorSetObj descriptorSet(m_device);
23406 descriptorSet.AppendDummy();
23407 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23408
23409 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23410
23411 m_errorMonitor->VerifyNotFound();
23412}
23413
23414TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023415 TEST_DESCRIPTION(
23416 "Test that pipeline validation accepts a user-defined "
23417 "interface block passed into the geometry shader. This "
23418 "is interesting because the 'extra' array level is not "
23419 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023420 m_errorMonitor->ExpectSuccess();
23421
Tony Barbour1fa09702017-03-16 12:09:08 -060023422 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23424
23425 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023426 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023427 return;
23428 }
23429
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023430 char const *vsSource =
23431 "#version 450\n"
23432 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
23433 "void main(){\n"
23434 " vs_out.x = vec4(1);\n"
23435 "}\n";
23436 char const *gsSource =
23437 "#version 450\n"
23438 "layout(triangles) in;\n"
23439 "layout(triangle_strip, max_vertices=3) out;\n"
23440 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
23441 "out gl_PerVertex { vec4 gl_Position; };\n"
23442 "void main() {\n"
23443 " gl_Position = gs_in[0].x;\n"
23444 " EmitVertex();\n"
23445 "}\n";
23446 char const *fsSource =
23447 "#version 450\n"
23448 "layout(location=0) out vec4 color;\n"
23449 "void main(){\n"
23450 " color = vec4(1);\n"
23451 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023452
23453 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23454 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
23455 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23456
23457 VkPipelineObj pipe(m_device);
23458 pipe.AddColorAttachment();
23459 pipe.AddShader(&vs);
23460 pipe.AddShader(&gs);
23461 pipe.AddShader(&fs);
23462
23463 VkDescriptorSetObj descriptorSet(m_device);
23464 descriptorSet.AppendDummy();
23465 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23466
23467 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23468
23469 m_errorMonitor->VerifyNotFound();
23470}
23471
23472TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023473 TEST_DESCRIPTION(
23474 "Test that pipeline validation accepts basic use of 64bit vertex "
23475 "attributes. This is interesting because they consume multiple "
23476 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023477 m_errorMonitor->ExpectSuccess();
23478
Tony Barbour1fa09702017-03-16 12:09:08 -060023479 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23481
23482 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023483 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023484 return;
23485 }
23486
23487 VkVertexInputBindingDescription input_bindings[1];
23488 memset(input_bindings, 0, sizeof(input_bindings));
23489
23490 VkVertexInputAttributeDescription input_attribs[4];
23491 memset(input_attribs, 0, sizeof(input_attribs));
23492 input_attribs[0].location = 0;
23493 input_attribs[0].offset = 0;
23494 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23495 input_attribs[1].location = 2;
23496 input_attribs[1].offset = 32;
23497 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23498 input_attribs[2].location = 4;
23499 input_attribs[2].offset = 64;
23500 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23501 input_attribs[3].location = 6;
23502 input_attribs[3].offset = 96;
23503 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23504
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023505 char const *vsSource =
23506 "#version 450\n"
23507 "\n"
23508 "layout(location=0) in dmat4 x;\n"
23509 "out gl_PerVertex {\n"
23510 " vec4 gl_Position;\n"
23511 "};\n"
23512 "void main(){\n"
23513 " gl_Position = vec4(x[0][0]);\n"
23514 "}\n";
23515 char const *fsSource =
23516 "#version 450\n"
23517 "\n"
23518 "layout(location=0) out vec4 color;\n"
23519 "void main(){\n"
23520 " color = vec4(1);\n"
23521 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023522
23523 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23524 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23525
23526 VkPipelineObj pipe(m_device);
23527 pipe.AddColorAttachment();
23528 pipe.AddShader(&vs);
23529 pipe.AddShader(&fs);
23530
23531 pipe.AddVertexInputBindings(input_bindings, 1);
23532 pipe.AddVertexInputAttribs(input_attribs, 4);
23533
23534 VkDescriptorSetObj descriptorSet(m_device);
23535 descriptorSet.AppendDummy();
23536 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23537
23538 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23539
23540 m_errorMonitor->VerifyNotFound();
23541}
23542
23543TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
23544 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
23545 m_errorMonitor->ExpectSuccess();
23546
Tony Barbour1fa09702017-03-16 12:09:08 -060023547 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023548
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023549 char const *vsSource =
23550 "#version 450\n"
23551 "\n"
23552 "out gl_PerVertex {\n"
23553 " vec4 gl_Position;\n"
23554 "};\n"
23555 "void main(){\n"
23556 " gl_Position = vec4(1);\n"
23557 "}\n";
23558 char const *fsSource =
23559 "#version 450\n"
23560 "\n"
23561 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
23562 "layout(location=0) out vec4 color;\n"
23563 "void main() {\n"
23564 " color = subpassLoad(x);\n"
23565 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023566
23567 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23568 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23569
23570 VkPipelineObj pipe(m_device);
23571 pipe.AddShader(&vs);
23572 pipe.AddShader(&fs);
23573 pipe.AddColorAttachment();
23574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23575
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023576 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
23577 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023578 VkDescriptorSetLayout dsl;
23579 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23580 ASSERT_VK_SUCCESS(err);
23581
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023582 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023583 VkPipelineLayout pl;
23584 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23585 ASSERT_VK_SUCCESS(err);
23586
23587 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023588 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23589 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23590 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
23591 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23592 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 -060023593 };
23594 VkAttachmentReference color = {
23595 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23596 };
23597 VkAttachmentReference input = {
23598 1, VK_IMAGE_LAYOUT_GENERAL,
23599 };
23600
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023601 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023602
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023603 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023604 VkRenderPass rp;
23605 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23606 ASSERT_VK_SUCCESS(err);
23607
23608 // should be OK. would go wrong here if it's going to...
23609 pipe.CreateVKPipeline(pl, rp);
23610
23611 m_errorMonitor->VerifyNotFound();
23612
23613 vkDestroyRenderPass(m_device->device(), rp, nullptr);
23614 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23615 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23616}
23617
23618TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023619 TEST_DESCRIPTION(
23620 "Test that pipeline validation accepts a compute pipeline which declares a "
23621 "descriptor-backed resource which is not provided, but the shader does not "
23622 "statically use it. This is interesting because it requires compute pipelines "
23623 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023624 m_errorMonitor->ExpectSuccess();
23625
Tony Barbour1fa09702017-03-16 12:09:08 -060023626 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023627
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023628 char const *csSource =
23629 "#version 450\n"
23630 "\n"
23631 "layout(local_size_x=1) in;\n"
23632 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
23633 "void main(){\n"
23634 " // x is not used.\n"
23635 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023636
23637 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23638
23639 VkDescriptorSetObj descriptorSet(m_device);
23640 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23641
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023642 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23643 nullptr,
23644 0,
23645 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23646 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23647 descriptorSet.GetPipelineLayout(),
23648 VK_NULL_HANDLE,
23649 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023650
23651 VkPipeline pipe;
23652 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23653
23654 m_errorMonitor->VerifyNotFound();
23655
23656 if (err == VK_SUCCESS) {
23657 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23658 }
23659}
23660
23661TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023662 TEST_DESCRIPTION(
23663 "Test that pipeline validation accepts a shader consuming only the "
23664 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023665 m_errorMonitor->ExpectSuccess();
23666
Tony Barbour1fa09702017-03-16 12:09:08 -060023667 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023668
23669 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023670 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23671 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23672 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023673 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023674 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023675 VkDescriptorSetLayout dsl;
23676 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23677 ASSERT_VK_SUCCESS(err);
23678
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023679 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023680 VkPipelineLayout pl;
23681 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23682 ASSERT_VK_SUCCESS(err);
23683
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023684 char const *csSource =
23685 "#version 450\n"
23686 "\n"
23687 "layout(local_size_x=1) in;\n"
23688 "layout(set=0, binding=0) uniform sampler s;\n"
23689 "layout(set=0, binding=1) uniform texture2D t;\n"
23690 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23691 "void main() {\n"
23692 " x = texture(sampler2D(t, s), vec2(0));\n"
23693 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023694 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23695
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023696 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23697 nullptr,
23698 0,
23699 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23700 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23701 pl,
23702 VK_NULL_HANDLE,
23703 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023704
23705 VkPipeline pipe;
23706 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23707
23708 m_errorMonitor->VerifyNotFound();
23709
23710 if (err == VK_SUCCESS) {
23711 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23712 }
23713
23714 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23715 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23716}
23717
23718TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023719 TEST_DESCRIPTION(
23720 "Test that pipeline validation accepts a shader consuming only the "
23721 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023722 m_errorMonitor->ExpectSuccess();
23723
Tony Barbour1fa09702017-03-16 12:09:08 -060023724 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023725
23726 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023727 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23728 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23729 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023730 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023731 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023732 VkDescriptorSetLayout dsl;
23733 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23734 ASSERT_VK_SUCCESS(err);
23735
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023736 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023737 VkPipelineLayout pl;
23738 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23739 ASSERT_VK_SUCCESS(err);
23740
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023741 char const *csSource =
23742 "#version 450\n"
23743 "\n"
23744 "layout(local_size_x=1) in;\n"
23745 "layout(set=0, binding=0) uniform texture2D t;\n"
23746 "layout(set=0, binding=1) uniform sampler s;\n"
23747 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23748 "void main() {\n"
23749 " x = texture(sampler2D(t, s), vec2(0));\n"
23750 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023751 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23752
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023753 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23754 nullptr,
23755 0,
23756 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23757 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23758 pl,
23759 VK_NULL_HANDLE,
23760 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023761
23762 VkPipeline pipe;
23763 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23764
23765 m_errorMonitor->VerifyNotFound();
23766
23767 if (err == VK_SUCCESS) {
23768 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23769 }
23770
23771 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23772 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23773}
23774
23775TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023776 TEST_DESCRIPTION(
23777 "Test that pipeline validation accepts a shader consuming "
23778 "both the sampler and the image of a combined image+sampler "
23779 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023780 m_errorMonitor->ExpectSuccess();
23781
Tony Barbour1fa09702017-03-16 12:09:08 -060023782 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023783
23784 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023785 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23786 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023787 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023788 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023789 VkDescriptorSetLayout dsl;
23790 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23791 ASSERT_VK_SUCCESS(err);
23792
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023793 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023794 VkPipelineLayout pl;
23795 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23796 ASSERT_VK_SUCCESS(err);
23797
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023798 char const *csSource =
23799 "#version 450\n"
23800 "\n"
23801 "layout(local_size_x=1) in;\n"
23802 "layout(set=0, binding=0) uniform texture2D t;\n"
23803 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23804 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23805 "void main() {\n"
23806 " x = texture(sampler2D(t, s), vec2(0));\n"
23807 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023808 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23809
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023810 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23811 nullptr,
23812 0,
23813 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23814 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23815 pl,
23816 VK_NULL_HANDLE,
23817 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023818
23819 VkPipeline pipe;
23820 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23821
23822 m_errorMonitor->VerifyNotFound();
23823
23824 if (err == VK_SUCCESS) {
23825 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23826 }
23827
23828 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23829 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23830}
23831
Tony Barbour3ed87a02017-03-15 16:19:02 -060023832TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023833 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23834
Tony Barbour3ed87a02017-03-15 16:19:02 -060023835 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023836 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023837
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023838 // Ensure that extension is available and enabled.
23839 uint32_t extension_count = 0;
23840 bool supports_maintenance1_extension = false;
23841 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23842 ASSERT_VK_SUCCESS(err);
23843 if (extension_count > 0) {
23844 std::vector<VkExtensionProperties> available_extensions(extension_count);
23845
23846 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23847 ASSERT_VK_SUCCESS(err);
23848 for (const auto &extension_props : available_extensions) {
23849 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23850 supports_maintenance1_extension = true;
23851 }
23852 }
23853 }
23854
23855 // Proceed if extension is supported by hardware
23856 if (!supports_maintenance1_extension) {
23857 printf(" Maintenance1 Extension not supported, skipping tests\n");
23858 return;
23859 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023860
23861 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023862 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023863 VkCommandBuffer cmd_buf;
23864 VkCommandBufferAllocateInfo alloc_info;
23865 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23866 alloc_info.pNext = NULL;
23867 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023868 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023869 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23870 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23871
23872 VkCommandBufferBeginInfo cb_binfo;
23873 cb_binfo.pNext = NULL;
23874 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23875 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23876 cb_binfo.flags = 0;
23877 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23878 // Set Negative height, should give error if Maintenance 1 is not enabled
23879 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23880 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23881 vkEndCommandBuffer(cmd_buf);
23882
23883 m_errorMonitor->VerifyNotFound();
23884}
23885
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023886TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23887 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23888
23889 ASSERT_NO_FATAL_FAILURE(Init());
23890
23891 uint32_t extension_count = 0;
23892 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23893 ASSERT_VK_SUCCESS(err);
23894
23895 if (extension_count > 0) {
23896 std::vector<VkExtensionProperties> available_extensions(extension_count);
23897 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23898 ASSERT_VK_SUCCESS(err);
23899
23900 for (const auto &extension_props : available_extensions) {
23901 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23902 // Create two pNext structures which by themselves would be valid
23903 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23904 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23905 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23906 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23907 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23908
23909 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23910 dedicated_buffer_create_info_2.pNext = nullptr;
23911 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23912
23913 uint32_t queue_family_index = 0;
23914 VkBufferCreateInfo buffer_create_info = {};
23915 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23916 buffer_create_info.pNext = &dedicated_buffer_create_info;
23917 buffer_create_info.size = 1024;
23918 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23919 buffer_create_info.queueFamilyIndexCount = 1;
23920 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23921
23922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23923 VkBuffer buffer;
23924 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23925 m_errorMonitor->VerifyFound();
23926 }
23927 }
23928 }
23929}
23930
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023931TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23932 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23933
Tony Barbour1fa09702017-03-16 12:09:08 -060023934 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023935
23936 // Positive test to check parameter_validation and unique_objects support
23937 // for NV_dedicated_allocation
23938 uint32_t extension_count = 0;
23939 bool supports_nv_dedicated_allocation = false;
23940 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23941 ASSERT_VK_SUCCESS(err);
23942
23943 if (extension_count > 0) {
23944 std::vector<VkExtensionProperties> available_extensions(extension_count);
23945
23946 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23947 ASSERT_VK_SUCCESS(err);
23948
23949 for (const auto &extension_props : available_extensions) {
23950 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23951 supports_nv_dedicated_allocation = true;
23952 }
23953 }
23954 }
23955
23956 if (supports_nv_dedicated_allocation) {
23957 m_errorMonitor->ExpectSuccess();
23958
23959 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23960 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23961 dedicated_buffer_create_info.pNext = nullptr;
23962 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23963
23964 uint32_t queue_family_index = 0;
23965 VkBufferCreateInfo buffer_create_info = {};
23966 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23967 buffer_create_info.pNext = &dedicated_buffer_create_info;
23968 buffer_create_info.size = 1024;
23969 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23970 buffer_create_info.queueFamilyIndexCount = 1;
23971 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23972
23973 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023974 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023975 ASSERT_VK_SUCCESS(err);
23976
23977 VkMemoryRequirements memory_reqs;
23978 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23979
23980 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23981 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23982 dedicated_memory_info.pNext = nullptr;
23983 dedicated_memory_info.buffer = buffer;
23984 dedicated_memory_info.image = VK_NULL_HANDLE;
23985
23986 VkMemoryAllocateInfo memory_info = {};
23987 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23988 memory_info.pNext = &dedicated_memory_info;
23989 memory_info.allocationSize = memory_reqs.size;
23990
23991 bool pass;
23992 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23993 ASSERT_TRUE(pass);
23994
23995 VkDeviceMemory buffer_memory;
23996 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23997 ASSERT_VK_SUCCESS(err);
23998
23999 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
24000 ASSERT_VK_SUCCESS(err);
24001
24002 vkDestroyBuffer(m_device->device(), buffer, NULL);
24003 vkFreeMemory(m_device->device(), buffer_memory, NULL);
24004
24005 m_errorMonitor->VerifyNotFound();
24006 }
24007}
24008
24009TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
24010 VkResult err;
24011
24012 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
24013
Tony Barbour1fa09702017-03-16 12:09:08 -060024014 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
24016
24017 std::vector<const char *> device_extension_names;
24018 auto features = m_device->phy().features();
24019 // Artificially disable support for non-solid fill modes
24020 features.fillModeNonSolid = false;
24021 // The sacrificial device object
24022 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
24023
24024 VkRenderpassObj render_pass(&test_device);
24025
24026 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
24027 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
24028 pipeline_layout_ci.setLayoutCount = 0;
24029 pipeline_layout_ci.pSetLayouts = NULL;
24030
24031 VkPipelineLayout pipeline_layout;
24032 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
24033 ASSERT_VK_SUCCESS(err);
24034
24035 VkPipelineRasterizationStateCreateInfo rs_ci = {};
24036 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
24037 rs_ci.pNext = nullptr;
24038 rs_ci.lineWidth = 1.0f;
24039 rs_ci.rasterizerDiscardEnable = true;
24040
24041 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
24042 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
24043
24044 // Set polygonMode=FILL. No error is expected
24045 m_errorMonitor->ExpectSuccess();
24046 {
24047 VkPipelineObj pipe(&test_device);
24048 pipe.AddShader(&vs);
24049 pipe.AddShader(&fs);
24050 pipe.AddColorAttachment();
24051 // Set polygonMode to a good value
24052 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
24053 pipe.SetRasterization(&rs_ci);
24054 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
24055 }
24056 m_errorMonitor->VerifyNotFound();
24057
24058 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
24059}
24060
Dave Houlton1150cf52017-04-27 14:38:11 -060024061TEST_F(VkPositiveLayerTest, LongSemaphoreChain) {
Chris Forbes94196952017-04-06 16:30:59 -070024062 m_errorMonitor->ExpectSuccess();
24063
24064 ASSERT_NO_FATAL_FAILURE(Init());
24065 VkResult err;
24066
24067 std::vector<VkSemaphore> semaphores;
24068
24069 const int chainLength = 32768;
24070 VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
24071
24072 for (int i = 0; i < chainLength; i++) {
Dave Houlton1150cf52017-04-27 14:38:11 -060024073 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024074 VkSemaphore semaphore;
24075 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &semaphore);
24076 ASSERT_VK_SUCCESS(err);
24077
24078 semaphores.push_back(semaphore);
24079
Chris Forbesfc50aaa2017-05-01 10:20:17 -070024080 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO,
24081 nullptr,
24082 semaphores.size() > 1 ? 1u : 0u,
24083 semaphores.size() > 1 ? &semaphores[semaphores.size() - 2] : nullptr,
24084 &flags,
24085 0,
24086 nullptr,
24087 1,
24088 &semaphores[semaphores.size() - 1]};
Chris Forbes94196952017-04-06 16:30:59 -070024089 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
24090 ASSERT_VK_SUCCESS(err);
24091 }
24092
Dave Houlton1150cf52017-04-27 14:38:11 -060024093 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024094 VkFence fence;
24095 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24096 ASSERT_VK_SUCCESS(err);
Dave Houlton1150cf52017-04-27 14:38:11 -060024097 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &semaphores.back(), &flags, 0, nullptr, 0, nullptr};
Chris Forbes94196952017-04-06 16:30:59 -070024098 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24099 ASSERT_VK_SUCCESS(err);
24100
24101 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
24102
Dave Houlton1150cf52017-04-27 14:38:11 -060024103 for (auto semaphore : semaphores) vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Chris Forbes94196952017-04-06 16:30:59 -070024104
24105 vkDestroyFence(m_device->device(), fence, nullptr);
24106
24107 m_errorMonitor->VerifyNotFound();
24108}
24109
Mike Stroyanca855662017-05-02 11:06:27 -060024110extern "C" void *ReleaseNullFence(void *arg) {
24111 struct thread_data_struct *data = (struct thread_data_struct *)arg;
24112
24113 for (int i = 0; i < 40000; i++) {
24114 vkDestroyFence(data->device, VK_NULL_HANDLE, NULL);
24115 if (data->bailout) {
24116 break;
24117 }
24118 }
24119 return NULL;
24120}
24121
24122TEST_F(VkPositiveLayerTest, ThreadNullFenceCollision) {
24123 test_platform_thread thread;
24124
24125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
24126
24127 ASSERT_NO_FATAL_FAILURE(Init());
24128
24129 struct thread_data_struct data;
24130 data.device = m_device->device();
24131 data.bailout = false;
24132 m_errorMonitor->SetBailout(&data.bailout);
24133
24134 // Call vkDestroyFence of VK_NULL_HANDLE repeatedly using multiple threads.
24135 // There should be no validation error from collision of that non-object.
24136 test_platform_thread_create(&thread, ReleaseNullFence, (void *)&data);
24137 for (int i = 0; i < 40000; i++) {
24138 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
24139 }
24140 test_platform_thread_join(thread, NULL);
24141
24142 m_errorMonitor->SetBailout(NULL);
24143
24144 m_errorMonitor->VerifyNotFound();
24145}
24146
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024147#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024148TEST_F(VkPositiveLayerTest, LongFenceChain)
24149{
24150 m_errorMonitor->ExpectSuccess();
24151
Tony Barbour1fa09702017-03-16 12:09:08 -060024152 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024153 VkResult err;
24154
24155 std::vector<VkFence> fences;
24156
24157 const int chainLength = 32768;
24158
24159 for (int i = 0; i < chainLength; i++) {
24160 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
24161 VkFence fence;
24162 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24163 ASSERT_VK_SUCCESS(err);
24164
24165 fences.push_back(fence);
24166
24167 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
24168 0, nullptr, 0, nullptr };
24169 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24170 ASSERT_VK_SUCCESS(err);
24171
24172 }
24173
24174 // BOOM, stack overflow.
24175 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
24176
24177 for (auto fence : fences)
24178 vkDestroyFence(m_device->device(), fence, nullptr);
24179
24180 m_errorMonitor->VerifyNotFound();
24181}
24182#endif
24183
Cody Northrop1242dfd2016-07-13 17:24:59 -060024184#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060024185const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060024186static bool initialized = false;
24187static bool active = false;
24188
24189// Convert Intents to argv
24190// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024191std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024192 std::vector<std::string> args;
24193 JavaVM &vm = *app.activity->vm;
24194 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024195 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024196
24197 JNIEnv &env = *p_env;
24198 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024199 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024200 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024201 jmethodID get_string_extra_method =
24202 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024203 jvalue get_string_extra_args;
24204 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024205 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060024206
24207 std::string args_str;
24208 if (extra_str) {
24209 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
24210 args_str = extra_utf;
24211 env.ReleaseStringUTFChars(extra_str, extra_utf);
24212 env.DeleteLocalRef(extra_str);
24213 }
24214
24215 env.DeleteLocalRef(get_string_extra_args.l);
24216 env.DeleteLocalRef(intent);
24217 vm.DetachCurrentThread();
24218
24219 // split args_str
24220 std::stringstream ss(args_str);
24221 std::string arg;
24222 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024223 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024224 }
24225
24226 return args;
24227}
24228
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024229void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
24230 const char *const type_param = test_info.type_param();
24231 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060024232
24233 if (type_param != NULL || value_param != NULL) {
24234 error_message.append(", where ");
24235 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024236 error_message.append("TypeParam = ").append(type_param);
24237 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060024238 }
24239 if (value_param != NULL) {
24240 error_message.append("GetParam() = ").append(value_param);
24241 }
24242 }
24243}
24244
24245// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
24246class LogcatPrinter : public ::testing::EmptyTestEventListener {
24247 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024248 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024249 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
24250 }
24251
24252 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024253 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060024254 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024255 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060024256
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024257 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
24258 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060024259 }
24260
24261 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024262 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024263 std::string result;
24264 if (info.result()->Passed()) {
24265 result.append("[ OK ]");
24266 } else {
24267 result.append("[ FAILED ]");
24268 }
24269 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024270 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060024271
24272 if (::testing::GTEST_FLAG(print_time)) {
24273 std::ostringstream os;
24274 os << info.result()->elapsed_time();
24275 result.append(" (").append(os.str()).append(" ms)");
24276 }
24277
24278 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
24279 };
24280};
24281
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024282static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024283
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024284static void processCommand(struct android_app *app, int32_t cmd) {
24285 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024286 case APP_CMD_INIT_WINDOW: {
24287 if (app->window) {
24288 initialized = true;
24289 }
24290 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024291 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024292 case APP_CMD_GAINED_FOCUS: {
24293 active = true;
24294 break;
24295 }
24296 case APP_CMD_LOST_FOCUS: {
24297 active = false;
24298 break;
24299 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024300 }
24301}
24302
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024303void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024304 app_dummy();
24305
Cody Northrop1242dfd2016-07-13 17:24:59 -060024306 int vulkanSupport = InitVulkan();
24307 if (vulkanSupport == 0) {
24308 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
24309 return;
24310 }
24311
24312 app->onAppCmd = processCommand;
24313 app->onInputEvent = processInput;
24314
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024315 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024316 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024317 struct android_poll_source *source;
24318 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024319 if (source) {
24320 source->process(app, source);
24321 }
24322
24323 if (app->destroyRequested != 0) {
24324 VkTestFramework::Finish();
24325 return;
24326 }
24327 }
24328
24329 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024330 // Use the following key to send arguments to gtest, i.e.
24331 // --es args "--gtest_filter=-VkLayerTest.foo"
24332 const char key[] = "args";
24333 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024334
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024335 std::string filter = "";
24336 if (args.size() > 0) {
24337 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
24338 filter += args[0];
24339 } else {
24340 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
24341 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024342
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024343 int argc = 2;
24344 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
24345 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024346
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024347 // Route output to files until we can override the gtest output
24348 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
24349 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024351 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060024352
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024353 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060024354 listeners.Append(new LogcatPrinter);
24355
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024356 VkTestFramework::InitArgs(&argc, argv);
24357 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024359 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024360
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024361 if (result != 0) {
24362 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
24363 } else {
24364 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
24365 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024366
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024367 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024368
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024369 fclose(stdout);
24370 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024371
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024372 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024373 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024374 }
24375 }
24376}
24377#endif
24378
Tony Barbour300a6082015-04-07 13:44:53 -060024379int main(int argc, char **argv) {
24380 int result;
24381
Cody Northrop8e54a402016-03-08 22:25:52 -070024382#ifdef ANDROID
24383 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024384 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070024385#endif
24386
Tony Barbour300a6082015-04-07 13:44:53 -060024387 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060024388 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060024389
24390 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
24391
24392 result = RUN_ALL_TESTS();
24393
Tony Barbour6918cd52015-04-09 12:58:51 -060024394 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060024395 return result;
24396}