blob: 1456466db3f8d4b5722ceaf0a989034dfba8cbe2 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600341#ifdef _DEBUG
342 char embedded_code_string[2048];
343 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
344 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
345#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600346 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600347#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600348 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600349 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600350}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700353 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
355 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700356 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600357 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
358 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 }
Tony Barbour300a6082015-04-07 13:44:53 -0600360
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
362 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700363 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600364 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700365 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600366 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700367 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
369 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
370 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700371 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
372 }
373 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
374 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
375 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600376 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
378 InitState(features, flags);
379 }
380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700381 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700382 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600384 std::vector<const char *> instance_layer_names;
385 std::vector<const char *> instance_extension_names;
386 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600387
388 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700389 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600390 /*
391 * Since CreateDbgMsgCallback is an instance level extension call
392 * any extension / layer that utilizes that feature also needs
393 * to be enabled at create instance time.
394 */
Karl Schultz6addd812016-02-02 17:17:23 -0700395 // Use Threading layer first to protect others from
396 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700397 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800399 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700400 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600401 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700402 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600403
Ian Elliott2c1daf52016-05-12 09:41:46 -0600404 if (m_enableWSI) {
405 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
406 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
407#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
408#if defined(VK_USE_PLATFORM_ANDROID_KHR)
409 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_MIR_KHR)
412 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
415 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600417#if defined(VK_USE_PLATFORM_WIN32_KHR)
418 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_WIN32_KHR
420#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600421#if defined(VK_USE_PLATFORM_XCB_KHR)
422 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
423#elif defined(VK_USE_PLATFORM_XLIB_KHR)
424 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700425#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600426 }
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800430 this->app_info.pApplicationName = "layer_tests";
431 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600432 this->app_info.pEngineName = "unittest";
433 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600434 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600435
Tony Barbour15524c32015-04-29 17:34:29 -0600436 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
438
439 virtual void TearDown() {
440 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600441 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600442 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600443 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600446};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600448void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449 // Create identity matrix
450 int i;
451 struct vktriangle_vs_uniform data;
452
453 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700454 glm::mat4 View = glm::mat4(1.0f);
455 glm::mat4 Model = glm::mat4(1.0f);
456 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700458 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
460 memcpy(&data.mvp, &MVP[0][0], matrixSize);
461
Karl Schultz6addd812016-02-02 17:17:23 -0700462 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600463 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464 };
465
Karl Schultz6addd812016-02-02 17:17:23 -0700466 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 data.position[i][0] = tri_data[i].posX;
468 data.position[i][1] = tri_data[i].posY;
469 data.position[i][2] = tri_data[i].posZ;
470 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700471 data.color[i][0] = tri_data[i].r;
472 data.color[i][1] = tri_data[i].g;
473 data.color[i][2] = tri_data[i].b;
474 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475 }
476
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477 ASSERT_NO_FATAL_FAILURE(InitViewport());
478
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200479 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
480 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Karl Schultz6addd812016-02-02 17:17:23 -0700482 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800486 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487 pipelineobj.AddShader(&vs);
488 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 if (failMask & BsoFailLineWidth) {
490 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600492 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
494 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600495 }
496 if (failMask & BsoFailDepthBias) {
497 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600498 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600499 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600500 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600501 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600502 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700504 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700505 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600506 if (failMask & BsoFailViewport) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
508 }
509 if (failMask & BsoFailScissor) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
511 }
512 if (failMask & BsoFailBlend) {
513 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600514 VkPipelineColorBlendAttachmentState att_state = {};
515 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
516 att_state.blendEnable = VK_TRUE;
517 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 }
519 if (failMask & BsoFailDepthBounds) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
521 }
522 if (failMask & BsoFailStencilReadMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
524 }
525 if (failMask & BsoFailStencilWriteMask) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
527 }
528 if (failMask & BsoFailStencilReference) {
529 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
530 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600533 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700536 m_commandBuffer->BeginCommandBuffer();
537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538
Tony Barbourfe3351b2015-07-28 10:17:20 -0600539 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500540
541 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600542 if (failMask & BsoFailIndexBuffer) {
543 // Use DrawIndexed w/o an index buffer bound
544 DrawIndexed(3, 1, 0, 0, 0);
545 } else {
546 Draw(3, 1, 0, 0);
547 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500548
Mark Muellerd4914412016-06-13 17:52:06 -0600549 if (failMask & BsoFailCmdClearAttachments) {
550 VkClearAttachment color_attachment = {};
551 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700552 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600553 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
554
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600555 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600556 }
557
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500558 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700559 m_commandBuffer->EndRenderPass();
560 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600561 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562}
563
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
565 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500568 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600569 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500570 }
571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700573 // Make sure depthWriteEnable is set so that Depth fail test will work
574 // correctly
575 // Make sure stencilTestEnable is set so that Stencil fail test will work
576 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600577 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800578 stencil.failOp = VK_STENCIL_OP_KEEP;
579 stencil.passOp = VK_STENCIL_OP_KEEP;
580 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
581 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600582
583 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
584 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600585 ds_ci.pNext = NULL;
586 ds_ci.depthTestEnable = VK_FALSE;
587 ds_ci.depthWriteEnable = VK_TRUE;
588 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
589 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600590 if (failMask & BsoFailDepthBounds) {
591 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600592 ds_ci.maxDepthBounds = 0.0f;
593 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600594 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600595 ds_ci.stencilTestEnable = VK_TRUE;
596 ds_ci.front = stencil;
597 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600598
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600599 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600600 pipelineobj.SetViewport(m_viewports);
601 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600603 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 commandBuffer->BindPipeline(pipelineobj);
606 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500607}
608
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700610 public:
611 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600612};
613
Ian Elliott2c1daf52016-05-12 09:41:46 -0600614class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
616 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600617 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600618};
619
Mark Muellerdfe37552016-07-07 14:47:42 -0600620class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700621 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600622 enum eTestEnFlags {
623 eDoubleDelete,
624 eInvalidDeviceOffset,
625 eInvalidMemoryOffset,
626 eBindNullBuffer,
627 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600628 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 };
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
634 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635 return true;
636 }
637 VkDeviceSize offset_limit = 0;
638 if (eInvalidMemoryOffset == aTestFlag) {
639 VkBuffer vulkanBuffer;
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600646 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
650 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
652 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600654 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600656 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 }
658 if (eOffsetAlignment < offset_limit) {
659 return true;
660 }
661 return false;
662 }
663
664 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
666 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (eBindNullBuffer == aTestFlag) {
668 VulkanMemory = 0;
669 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
670 } else {
671 VkBufferCreateInfo buffer_create_info = {};
672 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
673 buffer_create_info.size = 32;
674 buffer_create_info.usage = aBufferUsage;
675
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600676 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677
678 CreateCurrent = true;
679
680 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 VkMemoryAllocateInfo memory_allocate_info = {};
684 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800685 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600686 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
687 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 if (!pass) {
689 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
690 return;
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 AllocateCurrent = true;
695 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600696 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
697 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 BoundCurrent = true;
699
700 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
701 }
702 }
703
704 ~VkBufferTest() {
705 if (CreateCurrent) {
706 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
707 }
708 if (AllocateCurrent) {
709 if (InvalidDeleteEn) {
710 union {
711 VkDeviceMemory device_memory;
712 unsigned long long index_access;
713 } bad_index;
714
715 bad_index.device_memory = VulkanMemory;
716 bad_index.index_access++;
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 }
720 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
721 }
722 }
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600725
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600727
728 void TestDoubleDestroy() {
729 // Destroy the buffer but leave the flag set, which will cause
730 // the buffer to be destroyed again in the destructor.
731 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
732 }
733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700734 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600735 bool AllocateCurrent;
736 bool BoundCurrent;
737 bool CreateCurrent;
738 bool InvalidDeleteEn;
739
740 VkBuffer VulkanBuffer;
741 VkDevice VulkanDevice;
742 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600743};
744
745class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600748 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700749 : BoundCurrent(false),
750 AttributeCount(aAttributeCount),
751 BindingCount(aBindingCount),
752 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600754 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
755 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700756 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
759 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
762 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
763 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
764 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
765 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600766
767 unsigned i = 0;
768 do {
769 VertexInputAttributeDescription[i].binding = BindId;
770 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
772 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 i++;
774 } while (AttributeCount < i);
775
776 i = 0;
777 do {
778 VertexInputBindingDescription[i].binding = BindId;
779 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600780 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600781 i++;
782 } while (BindingCount < i);
783 }
784
785 ~VkVerticesObj() {
786 if (VertexInputAttributeDescription) {
787 delete[] VertexInputAttributeDescription;
788 }
789 if (VertexInputBindingDescription) {
790 delete[] VertexInputBindingDescription;
791 }
792 }
793
794 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
796 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 return true;
798 }
799
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600800 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600801 VkDeviceSize *offsetList;
802 unsigned offsetCount;
803
804 if (aOffsetCount) {
805 offsetList = aOffsetList;
806 offsetCount = aOffsetCount;
807 } else {
808 offsetList = new VkDeviceSize[1]();
809 offsetCount = 1;
810 }
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600813 BoundCurrent = true;
814
815 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600817 }
818 }
819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700820 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600821 static uint32_t BindIdGenerator;
822
823 bool BoundCurrent;
824 unsigned AttributeCount;
825 unsigned BindingCount;
826 uint32_t BindId;
827
828 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
829 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
830 VkVertexInputBindingDescription *VertexInputBindingDescription;
831 VkConstantBufferObj VulkanMemoryBuffer;
832};
833
834uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500835// ********************************************************************************************************************
836// ********************************************************************************************************************
837// ********************************************************************************************************************
838// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700840 TEST_DESCRIPTION(
841 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
842 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600843
Tony Barbour1fa09702017-03-16 12:09:08 -0600844 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a pointer to a handle
848 // Expected to trigger an error with
849 // parameter_validation::validate_required_pointer
850 vkGetPhysicalDeviceFeatures(gpu(), NULL);
851 m_errorMonitor->VerifyFound();
852
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
854 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify NULL for pointer to array count
856 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600857 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify 0 for a required array count
862 // Expected to trigger an error with parameter_validation::validate_array
863 VkViewport view_port = {};
864 m_commandBuffer->SetViewport(0, 0, &view_port);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify NULL for a required array
869 // Expected to trigger an error with parameter_validation::validate_array
870 m_commandBuffer->SetViewport(0, 1, NULL);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify VK_NULL_HANDLE for a required handle
875 // Expected to trigger an error with
876 // parameter_validation::validate_required_handle
877 vkUnmapMemory(device(), VK_NULL_HANDLE);
878 m_errorMonitor->VerifyFound();
879
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
881 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882 // Specify VK_NULL_HANDLE for a required handle array entry
883 // Expected to trigger an error with
884 // parameter_validation::validate_required_handle_array
885 VkFence fence = VK_NULL_HANDLE;
886 vkResetFences(device(), 1, &fence);
887 m_errorMonitor->VerifyFound();
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags parameter
899 // Expected to trigger an error with parameter_validation::validate_flags
900 m_commandBuffer->SetStencilReference(0, 0);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600904 // Specify 0 for a required VkFlags array entry
905 // Expected to trigger an error with
906 // parameter_validation::validate_flags_array
907 VkSemaphore semaphore = VK_NULL_HANDLE;
908 VkPipelineStageFlags stageFlags = 0;
909 VkSubmitInfo submitInfo = {};
910 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
911 submitInfo.waitSemaphoreCount = 1;
912 submitInfo.pWaitSemaphores = &semaphore;
913 submitInfo.pWaitDstStageMask = &stageFlags;
914 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600917
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918TEST_F(VkLayerTest, ReservedParameter) {
919 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
920
Tony Barbour1fa09702017-03-16 12:09:08 -0600921 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600922
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600924 // Specify 0 for a reserved VkFlags parameter
925 // Expected to trigger an error with
926 // parameter_validation::validate_reserved_flags
927 VkEvent event_handle = VK_NULL_HANDLE;
928 VkEventCreateInfo event_info = {};
929 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
930 event_info.flags = 1;
931 vkCreateEvent(device(), &event_info, NULL, &event_handle);
932 m_errorMonitor->VerifyFound();
933}
934
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700936 TEST_DESCRIPTION(
937 "Specify an invalid VkStructureType for a Vulkan "
938 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939
Tony Barbour1fa09702017-03-16 12:09:08 -0600940 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600941
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943 // Zero struct memory, effectively setting sType to
944 // VK_STRUCTURE_TYPE_APPLICATION_INFO
945 // Expected to trigger an error with
946 // parameter_validation::validate_struct_type
947 VkMemoryAllocateInfo alloc_info = {};
948 VkDeviceMemory memory = VK_NULL_HANDLE;
949 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
950 m_errorMonitor->VerifyFound();
951
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600953 // Zero struct memory, effectively setting sType to
954 // VK_STRUCTURE_TYPE_APPLICATION_INFO
955 // Expected to trigger an error with
956 // parameter_validation::validate_struct_type_array
957 VkSubmitInfo submit_info = {};
958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
959 m_errorMonitor->VerifyFound();
960}
961
962TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600963 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600964
Tony Barbour1fa09702017-03-16 12:09:08 -0600965 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600966
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600968 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600969 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600970 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600971 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600972 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600973 // Zero-initialization will provide the correct sType
974 VkApplicationInfo app_info = {};
975 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
976 event_alloc_info.pNext = &app_info;
977 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
978 m_errorMonitor->VerifyFound();
979
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
981 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
983 // a function that has allowed pNext structure types and specify
984 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600985 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600987 VkMemoryAllocateInfo memory_alloc_info = {};
988 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
989 memory_alloc_info.pNext = &app_info;
990 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600991 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600992}
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
994TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600995 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600996
Tony Barbour1fa09702017-03-16 12:09:08 -0600997 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "does not fall within the begin..end "
1001 "range of the core VkFormat "
1002 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 // Specify an invalid VkFormat value
1004 // Expected to trigger an error with
1005 // parameter_validation::validate_ranged_enum
1006 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001008 m_errorMonitor->VerifyFound();
1009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001011 // Specify an invalid VkFlags bitmask value
1012 // Expected to trigger an error with parameter_validation::validate_flags
1013 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1015 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001016 m_errorMonitor->VerifyFound();
1017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001019 // Specify an invalid VkFlags array entry
1020 // Expected to trigger an error with
1021 // parameter_validation::validate_flags_array
1022 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001024 VkSubmitInfo submit_info = {};
1025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1026 submit_info.waitSemaphoreCount = 1;
1027 submit_info.pWaitSemaphores = &semaphore;
1028 submit_info.pWaitDstStageMask = &stage_flags;
1029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1030 m_errorMonitor->VerifyFound();
1031
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 // Specify an invalid VkBool32 value
1034 // Expected to trigger a warning with
1035 // parameter_validation::validate_bool32
1036 VkSampler sampler = VK_NULL_HANDLE;
1037 VkSamplerCreateInfo sampler_info = {};
1038 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1039 sampler_info.pNext = NULL;
1040 sampler_info.magFilter = VK_FILTER_NEAREST;
1041 sampler_info.minFilter = VK_FILTER_NEAREST;
1042 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1043 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1044 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1045 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1046 sampler_info.mipLodBias = 1.0;
1047 sampler_info.maxAnisotropy = 1;
1048 sampler_info.compareEnable = VK_FALSE;
1049 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1050 sampler_info.minLod = 1.0;
1051 sampler_info.maxLod = 1.0;
1052 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1053 sampler_info.unnormalizedCoordinates = VK_FALSE;
1054 // Not VK_TRUE or VK_FALSE
1055 sampler_info.anisotropyEnable = 3;
1056 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1057 m_errorMonitor->VerifyFound();
1058}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001059
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001060TEST_F(VkLayerTest, UpdateBufferAlignment) {
1061 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001062 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001063
Tony Barbour1fa09702017-03-16 12:09:08 -06001064 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001065
1066 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1067 vk_testing::Buffer buffer;
1068 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1069
Tony Barbour552f6c02016-12-21 14:34:07 -07001070 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001071 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1074 m_errorMonitor->VerifyFound();
1075
1076 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001078 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1079 m_errorMonitor->VerifyFound();
1080
1081 // Introduce failure by using dataSize that is < 0
1082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001083 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001084 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1085 m_errorMonitor->VerifyFound();
1086
1087 // Introduce failure by using dataSize that is > 65536
1088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001089 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1091 m_errorMonitor->VerifyFound();
1092
Tony Barbour552f6c02016-12-21 14:34:07 -07001093 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094}
1095
1096TEST_F(VkLayerTest, FillBufferAlignment) {
1097 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1098
Tony Barbour1fa09702017-03-16 12:09:08 -06001099 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100
1101 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1102 vk_testing::Buffer buffer;
1103 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1104
Tony Barbour552f6c02016-12-21 14:34:07 -07001105 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001106
1107 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001114 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1115 m_errorMonitor->VerifyFound();
1116
1117 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
Tony Barbour552f6c02016-12-21 14:34:07 -07001122 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001123}
Dustin Graves40f35822016-06-23 11:12:53 -06001124
Cortd889ff92016-07-27 09:51:27 -07001125TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1126 VkResult err;
1127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001128 TEST_DESCRIPTION(
1129 "Attempt to use a non-solid polygon fill mode in a "
1130 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001131
Tony Barbour1fa09702017-03-16 12:09:08 -06001132 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1134
1135 std::vector<const char *> device_extension_names;
1136 auto features = m_device->phy().features();
1137 // Artificially disable support for non-solid fill modes
Chris Forbes05054022017-05-17 16:29:06 -07001138 features.fillModeNonSolid = VK_FALSE;
Cortd889ff92016-07-27 09:51:27 -07001139 // The sacrificial device object
1140 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1141
1142 VkRenderpassObj render_pass(&test_device);
1143
1144 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1145 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1146 pipeline_layout_ci.setLayoutCount = 0;
1147 pipeline_layout_ci.pSetLayouts = NULL;
1148
1149 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001150 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001151 ASSERT_VK_SUCCESS(err);
1152
1153 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1154 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1155 rs_ci.pNext = nullptr;
1156 rs_ci.lineWidth = 1.0f;
Chris Forbes05054022017-05-17 16:29:06 -07001157 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Cortd889ff92016-07-27 09:51:27 -07001158
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001159 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1160 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001161
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001162 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1164 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001165 {
1166 VkPipelineObj pipe(&test_device);
1167 pipe.AddShader(&vs);
1168 pipe.AddShader(&fs);
1169 pipe.AddColorAttachment();
1170 // Introduce failure by setting unsupported polygon mode
1171 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1172 pipe.SetRasterization(&rs_ci);
1173 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1174 }
1175 m_errorMonitor->VerifyFound();
1176
1177 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1179 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001180 {
1181 VkPipelineObj pipe(&test_device);
1182 pipe.AddShader(&vs);
1183 pipe.AddShader(&fs);
1184 pipe.AddColorAttachment();
1185 // Introduce failure by setting unsupported polygon mode
1186 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1187 pipe.SetRasterization(&rs_ci);
1188 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1189 }
1190 m_errorMonitor->VerifyFound();
1191
Cortd889ff92016-07-27 09:51:27 -07001192 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1193}
1194
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001195#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001196TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001197{
1198 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001199 VkFenceCreateInfo fenceInfo = {};
1200 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1201 fenceInfo.pNext = NULL;
1202 fenceInfo.flags = 0;
1203
Mike Weiblencce7ec72016-10-17 19:33:05 -06001204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001205
Tony Barbour1fa09702017-03-16 12:09:08 -06001206 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001207
1208 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1209 vk_testing::Buffer buffer;
1210 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001211
Tony Barbourfe3351b2015-07-28 10:17:20 -06001212 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001213 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001214 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001215
1216 testFence.init(*m_device, fenceInfo);
1217
1218 // Bypass framework since it does the waits automatically
1219 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001220 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001221 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1222 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001223 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001224 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001225 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001226 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001228 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001229 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001230
1231 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001232 ASSERT_VK_SUCCESS( err );
1233
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001234 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001235 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001237 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001238}
1239
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001240TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001241{
1242 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001243 VkFenceCreateInfo fenceInfo = {};
1244 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1245 fenceInfo.pNext = NULL;
1246 fenceInfo.flags = 0;
1247
Mike Weiblencce7ec72016-10-17 19:33:05 -06001248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001249
Tony Barbour1fa09702017-03-16 12:09:08 -06001250 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251 ASSERT_NO_FATAL_FAILURE(InitViewport());
1252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1253
Tony Barbourfe3351b2015-07-28 10:17:20 -06001254 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001255 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001256 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257
1258 testFence.init(*m_device, fenceInfo);
1259
1260 // Bypass framework since it does the waits automatically
1261 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001262 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001263 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1264 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001265 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001266 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001267 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001268 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001269 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001270 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001271 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001272
1273 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 ASSERT_VK_SUCCESS( err );
1275
Jon Ashburnf19916e2016-01-11 13:12:43 -07001276 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001277 VkCommandBufferBeginInfo info = {};
1278 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1279 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001280 info.renderPass = VK_NULL_HANDLE;
1281 info.subpass = 0;
1282 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001283 info.occlusionQueryEnable = VK_FALSE;
1284 info.queryFlags = 0;
1285 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001286
1287 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001288 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001289
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001290 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001291}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001292#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001293
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001294TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1295 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1296
Tony Barbour1fa09702017-03-16 12:09:08 -06001297 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001298
1299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1300 VkBuffer buffer;
1301 VkBufferCreateInfo buf_info = {};
1302 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1303 buf_info.pNext = NULL;
1304 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1305 buf_info.size = 2048;
1306 buf_info.queueFamilyIndexCount = 0;
1307 buf_info.pQueueFamilyIndices = NULL;
1308 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1309 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1310 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1311 m_errorMonitor->VerifyFound();
1312
1313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1314 VkImage image;
1315 VkImageCreateInfo image_create_info = {};
1316 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1317 image_create_info.pNext = NULL;
1318 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1319 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1320 image_create_info.extent.width = 512;
1321 image_create_info.extent.height = 64;
1322 image_create_info.extent.depth = 1;
1323 image_create_info.mipLevels = 1;
1324 image_create_info.arrayLayers = 1;
1325 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1326 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1327 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1328 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1329 image_create_info.queueFamilyIndexCount = 0;
1330 image_create_info.pQueueFamilyIndices = NULL;
1331 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1332 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1333 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1334 m_errorMonitor->VerifyFound();
1335}
1336
Dave Houlton829c0d82017-01-24 15:09:17 -07001337TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1338 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1339
1340 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001341 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001342 ASSERT_NO_FATAL_FAILURE(
1343 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001344 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001345
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001346 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001347 device_features.sparseResidencyImage2D = VK_FALSE;
1348 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001349 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 VkImage image = VK_NULL_HANDLE;
1352 VkResult result = VK_RESULT_MAX_ENUM;
1353 VkImageCreateInfo image_create_info = {};
1354 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1355 image_create_info.pNext = NULL;
1356 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1357 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1358 image_create_info.extent.width = 512;
1359 image_create_info.extent.height = 1;
1360 image_create_info.extent.depth = 1;
1361 image_create_info.mipLevels = 1;
1362 image_create_info.arrayLayers = 1;
1363 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1364 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1365 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1366 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1367 image_create_info.queueFamilyIndexCount = 0;
1368 image_create_info.pQueueFamilyIndices = NULL;
1369 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1370 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1371
1372 // 1D image w/ sparse residency is an error
1373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1374 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1375 m_errorMonitor->VerifyFound();
1376 if (VK_SUCCESS == result) {
1377 vkDestroyImage(m_device->device(), image, NULL);
1378 image = VK_NULL_HANDLE;
1379 }
1380
1381 // 2D image w/ sparse residency when feature isn't available
1382 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1383 image_create_info.extent.height = 64;
1384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1385 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1386 m_errorMonitor->VerifyFound();
1387 if (VK_SUCCESS == result) {
1388 vkDestroyImage(m_device->device(), image, NULL);
1389 image = VK_NULL_HANDLE;
1390 }
1391
1392 // 3D image w/ sparse residency when feature isn't available
1393 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1394 image_create_info.extent.depth = 8;
1395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1396 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1397 m_errorMonitor->VerifyFound();
1398 if (VK_SUCCESS == result) {
1399 vkDestroyImage(m_device->device(), image, NULL);
1400 image = VK_NULL_HANDLE;
1401 }
1402}
1403
1404TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1405 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1406
1407 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001408 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001409 ASSERT_NO_FATAL_FAILURE(
1410 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001411 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001412
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001413 // These tests require that the device support sparse residency for 2D images
1414 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1415 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001416 return;
1417 }
1418
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001419 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001420 device_features.sparseResidency2Samples = VK_FALSE;
1421 device_features.sparseResidency4Samples = VK_FALSE;
1422 device_features.sparseResidency8Samples = VK_FALSE;
1423 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001424 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001425
1426 VkImage image = VK_NULL_HANDLE;
1427 VkResult result = VK_RESULT_MAX_ENUM;
1428 VkImageCreateInfo image_create_info = {};
1429 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1430 image_create_info.pNext = NULL;
1431 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1432 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1433 image_create_info.extent.width = 64;
1434 image_create_info.extent.height = 64;
1435 image_create_info.extent.depth = 1;
1436 image_create_info.mipLevels = 1;
1437 image_create_info.arrayLayers = 1;
1438 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1439 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1440 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1441 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1442 image_create_info.queueFamilyIndexCount = 0;
1443 image_create_info.pQueueFamilyIndices = NULL;
1444 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1445 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1446
1447 // 2D image w/ sparse residency and linear tiling is an error
1448 m_errorMonitor->SetDesiredFailureMsg(
1449 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1450 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1451 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1452 m_errorMonitor->VerifyFound();
1453 if (VK_SUCCESS == result) {
1454 vkDestroyImage(m_device->device(), image, NULL);
1455 image = VK_NULL_HANDLE;
1456 }
1457 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1458
1459 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1460 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1462 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1463 m_errorMonitor->VerifyFound();
1464 if (VK_SUCCESS == result) {
1465 vkDestroyImage(m_device->device(), image, NULL);
1466 image = VK_NULL_HANDLE;
1467 }
1468
1469 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486
1487 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495}
1496
Tobin Ehlisf11be982016-05-11 13:52:53 -06001497TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001498 TEST_DESCRIPTION(
1499 "Create a buffer and image, allocate memory, and bind the "
1500 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001501 VkResult err;
1502 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001503 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001504
Tobin Ehlis077ded32016-05-12 17:39:13 -06001505 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001507 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001508 VkDeviceMemory mem; // buffer will be bound first
1509 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001510 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001511 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001512
1513 VkBufferCreateInfo buf_info = {};
1514 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1515 buf_info.pNext = NULL;
1516 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1517 buf_info.size = 256;
1518 buf_info.queueFamilyIndexCount = 0;
1519 buf_info.pQueueFamilyIndices = NULL;
1520 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1521 buf_info.flags = 0;
1522 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1523 ASSERT_VK_SUCCESS(err);
1524
Tobin Ehlis077ded32016-05-12 17:39:13 -06001525 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001526
1527 VkImageCreateInfo image_create_info = {};
1528 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1529 image_create_info.pNext = NULL;
1530 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1531 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1532 image_create_info.extent.width = 64;
1533 image_create_info.extent.height = 64;
1534 image_create_info.extent.depth = 1;
1535 image_create_info.mipLevels = 1;
1536 image_create_info.arrayLayers = 1;
1537 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001538 // Image tiling must be optimal to trigger error when aliasing linear buffer
1539 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001540 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1541 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1542 image_create_info.queueFamilyIndexCount = 0;
1543 image_create_info.pQueueFamilyIndices = NULL;
1544 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1545 image_create_info.flags = 0;
1546
Tobin Ehlisf11be982016-05-11 13:52:53 -06001547 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1548 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001549 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1550 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551
Tobin Ehlis077ded32016-05-12 17:39:13 -06001552 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1553
1554 VkMemoryAllocateInfo alloc_info = {};
1555 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1556 alloc_info.pNext = NULL;
1557 alloc_info.memoryTypeIndex = 0;
1558 // Ensure memory is big enough for both bindings
1559 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001560 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1561 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001562 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001563 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001564 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001565 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001566 return;
1567 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001568 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1569 ASSERT_VK_SUCCESS(err);
1570 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1571 ASSERT_VK_SUCCESS(err);
1572
Rene Lindsayd14f5572016-12-16 14:57:18 -07001573 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1574
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001576 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001577 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1578 m_errorMonitor->VerifyFound();
1579
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001581 // aliasing buffer2
1582 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1583 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001584 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1585 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001586 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001587 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001589 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 m_errorMonitor->VerifyFound();
1592
1593 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 vkFreeMemory(m_device->device(), mem, NULL);
1598 vkFreeMemory(m_device->device(), mem_img, NULL);
1599}
1600
Tobin Ehlis35372522016-05-12 08:32:31 -06001601TEST_F(VkLayerTest, InvalidMemoryMapping) {
1602 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1603 VkResult err;
1604 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001605 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001606
1607 VkBuffer buffer;
1608 VkDeviceMemory mem;
1609 VkMemoryRequirements mem_reqs;
1610
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001611 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1612
Tobin Ehlis35372522016-05-12 08:32:31 -06001613 VkBufferCreateInfo buf_info = {};
1614 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1615 buf_info.pNext = NULL;
1616 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1617 buf_info.size = 256;
1618 buf_info.queueFamilyIndexCount = 0;
1619 buf_info.pQueueFamilyIndices = NULL;
1620 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1621 buf_info.flags = 0;
1622 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1623 ASSERT_VK_SUCCESS(err);
1624
1625 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1626 VkMemoryAllocateInfo alloc_info = {};
1627 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1628 alloc_info.pNext = NULL;
1629 alloc_info.memoryTypeIndex = 0;
1630
1631 // Ensure memory is big enough for both bindings
1632 static const VkDeviceSize allocation_size = 0x10000;
1633 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001634 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001635 if (!pass) {
1636 vkDestroyBuffer(m_device->device(), buffer, NULL);
1637 return;
1638 }
1639 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1640 ASSERT_VK_SUCCESS(err);
1641
1642 uint8_t *pData;
1643 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001645 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1646 m_errorMonitor->VerifyFound();
1647 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001648 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001649 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1651 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1652 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001653 m_errorMonitor->VerifyFound();
1654
1655 // Unmap the memory to avoid re-map error
1656 vkUnmapMemory(m_device->device(), mem);
1657 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1659 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1660 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001661 m_errorMonitor->VerifyFound();
1662 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1664 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001665 m_errorMonitor->VerifyFound();
1666 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001668 vkUnmapMemory(m_device->device(), mem);
1669 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001670
Tobin Ehlis35372522016-05-12 08:32:31 -06001671 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001672 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001673 ASSERT_VK_SUCCESS(err);
1674 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001675 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001677 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001679 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1680 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 // Now flush range that oversteps mapped range
1683 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001684 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001686 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001687 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1689 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1690 m_errorMonitor->VerifyFound();
1691
1692 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1693 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001694 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001695 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001696 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 mmr.size = VK_WHOLE_SIZE;
1698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1700 m_errorMonitor->VerifyFound();
1701
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001702#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001703 // Some platforms have an atomsize of 1 which makes the test meaningless
1704 if (atom_size > 3) {
1705 // Now with an offset NOT a multiple of the device limit
1706 vkUnmapMemory(m_device->device(), mem);
1707 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1708 ASSERT_VK_SUCCESS(err);
1709 mmr.offset = 3; // Not a multiple of atom_size
1710 mmr.size = VK_WHOLE_SIZE;
1711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1712 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1713 m_errorMonitor->VerifyFound();
1714
1715 // Now with a size NOT a multiple of the device limit
1716 vkUnmapMemory(m_device->device(), mem);
1717 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1718 ASSERT_VK_SUCCESS(err);
1719 mmr.offset = atom_size;
1720 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1722 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1723 m_errorMonitor->VerifyFound();
1724 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001725#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001726 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1727 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001728 if (!pass) {
1729 vkFreeMemory(m_device->device(), mem, NULL);
1730 vkDestroyBuffer(m_device->device(), buffer, NULL);
1731 return;
1732 }
1733 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1734 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1735
1736 vkDestroyBuffer(m_device->device(), buffer, NULL);
1737 vkFreeMemory(m_device->device(), mem, NULL);
1738}
1739
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001740#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001741TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1742 VkResult err;
1743 bool pass;
1744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001745 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1746 // following declaration (which is temporarily being moved below):
1747 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001748 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001749 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001750 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001751 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001752 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001753 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001754
Tony Barbour1fa09702017-03-16 12:09:08 -06001755 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001756
Ian Elliott3f06ce52016-04-29 14:46:21 -06001757#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1758#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1759 // Use the functions from the VK_KHR_android_surface extension without
1760 // enabling that extension:
1761
1762 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001763 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1765 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766 pass = (err != VK_SUCCESS);
1767 ASSERT_TRUE(pass);
1768 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001769#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001770
Ian Elliott3f06ce52016-04-29 14:46:21 -06001771#if defined(VK_USE_PLATFORM_MIR_KHR)
1772 // Use the functions from the VK_KHR_mir_surface extension without enabling
1773 // that extension:
1774
1775 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001776 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001778 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1779 pass = (err != VK_SUCCESS);
1780 ASSERT_TRUE(pass);
1781 m_errorMonitor->VerifyFound();
1782
1783 // Tell whether an mir_connection supports presentation:
1784 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1786 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001788#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001789
Ian Elliott3f06ce52016-04-29 14:46:21 -06001790#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1791 // Use the functions from the VK_KHR_wayland_surface extension without
1792 // enabling that extension:
1793
1794 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001795 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1797 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798 pass = (err != VK_SUCCESS);
1799 ASSERT_TRUE(pass);
1800 m_errorMonitor->VerifyFound();
1801
1802 // Tell whether an wayland_display supports presentation:
1803 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1805 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001806 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001807#endif // VK_USE_PLATFORM_WAYLAND_KHR
1808#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809
Ian Elliott3f06ce52016-04-29 14:46:21 -06001810#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001811 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1812 // TO NON-LINUX PLATFORMS:
1813 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001814 // Use the functions from the VK_KHR_win32_surface extension without
1815 // enabling that extension:
1816
1817 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001818 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1820 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821 pass = (err != VK_SUCCESS);
1822 ASSERT_TRUE(pass);
1823 m_errorMonitor->VerifyFound();
1824
1825 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001827 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001828 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001829// Set this (for now, until all platforms are supported and tested):
1830#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001831#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001832#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001833 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1834 // TO NON-LINUX PLATFORMS:
1835 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001836#endif
1837#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001838 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1839 // that extension:
1840
1841 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001842 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001844 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1845 pass = (err != VK_SUCCESS);
1846 ASSERT_TRUE(pass);
1847 m_errorMonitor->VerifyFound();
1848
1849 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001850 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001851 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1853 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001854 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001855// Set this (for now, until all platforms are supported and tested):
1856#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001857#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001858
Ian Elliott12630812016-04-29 14:35:43 -06001859#if defined(VK_USE_PLATFORM_XLIB_KHR)
1860 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1861 // that extension:
1862
1863 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001864 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001866 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1867 pass = (err != VK_SUCCESS);
1868 ASSERT_TRUE(pass);
1869 m_errorMonitor->VerifyFound();
1870
1871 // Tell whether an Xlib VisualID supports presentation:
1872 Display *dpy = NULL;
1873 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1876 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001877// Set this (for now, until all platforms are supported and tested):
1878#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001879#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001880
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001881// Use the functions from the VK_KHR_surface extension without enabling
1882// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001883
Ian Elliott489eec02016-05-05 14:12:44 -06001884#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001887 vkDestroySurfaceKHR(instance(), surface, NULL);
1888 m_errorMonitor->VerifyFound();
1889
1890 // Check if surface supports presentation:
1891 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001893 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1894 pass = (err != VK_SUCCESS);
1895 ASSERT_TRUE(pass);
1896 m_errorMonitor->VerifyFound();
1897
1898 // Check surface capabilities:
1899 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1901 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 pass = (err != VK_SUCCESS);
1903 ASSERT_TRUE(pass);
1904 m_errorMonitor->VerifyFound();
1905
1906 // Check surface formats:
1907 uint32_t format_count = 0;
1908 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface present modes:
1916 uint32_t present_mode_count = 0;
1917 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001923#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001924
Ian Elliott1c32c772016-04-28 14:47:13 -06001925 // Use the functions from the VK_KHR_swapchain extension without enabling
1926 // that extension:
1927
1928 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001930 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1931 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001932 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1939 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001940 pass = (err != VK_SUCCESS);
1941 ASSERT_TRUE(pass);
1942 m_errorMonitor->VerifyFound();
1943
Chris Forbeseb7d5502016-09-13 18:19:21 +12001944 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1945 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1946 VkFence fence;
1947 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1948
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001951 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001952 pass = (err != VK_SUCCESS);
1953 ASSERT_TRUE(pass);
1954 m_errorMonitor->VerifyFound();
1955
Chris Forbeseb7d5502016-09-13 18:19:21 +12001956 vkDestroyFence(m_device->device(), fence, nullptr);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001959 //
1960 // NOTE: Currently can't test this because a real swapchain is needed (as
1961 // opposed to the fake one we created) in order for the layer to lookup the
1962 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001963
1964 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001966 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1967 m_errorMonitor->VerifyFound();
1968}
Chris Forbes09368e42016-10-13 11:59:22 +13001969#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001970
Karl Schultz6addd812016-02-02 17:17:23 -07001971TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1972 VkResult err;
1973 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001974
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1976 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001977
Tony Barbour1fa09702017-03-16 12:09:08 -06001978 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001979
1980 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001981 VkImage image;
1982 VkDeviceMemory mem;
1983 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001984
Karl Schultz6addd812016-02-02 17:17:23 -07001985 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1986 const int32_t tex_width = 32;
1987 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
Tony Barboureb254902015-07-15 12:50:33 -06001989 VkImageCreateInfo image_create_info = {};
1990 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001991 image_create_info.pNext = NULL;
1992 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1993 image_create_info.format = tex_format;
1994 image_create_info.extent.width = tex_width;
1995 image_create_info.extent.height = tex_height;
1996 image_create_info.extent.depth = 1;
1997 image_create_info.mipLevels = 1;
1998 image_create_info.arrayLayers = 1;
1999 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2000 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2001 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2002 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002003 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002004
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002005 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002006 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002007 mem_alloc.pNext = NULL;
2008 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002009
Chia-I Wuf7458c52015-10-26 21:10:41 +08002010 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002011 ASSERT_VK_SUCCESS(err);
2012
Karl Schultz6addd812016-02-02 17:17:23 -07002013 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002014
Mark Lobodzinski23065352015-05-29 09:32:35 -05002015 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002016
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002017 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002018 if (!pass) { // If we can't find any unmappable memory this test doesn't
2019 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002020 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002021 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002022 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002023
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002024 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002025 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002026 ASSERT_VK_SUCCESS(err);
2027
2028 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002029 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002030 ASSERT_VK_SUCCESS(err);
2031
2032 // Map memory as if to initialize the image
2033 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002034 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002036 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002037
Chia-I Wuf7458c52015-10-26 21:10:41 +08002038 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002039 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040}
2041
Karl Schultz6addd812016-02-02 17:17:23 -07002042TEST_F(VkLayerTest, RebindMemory) {
2043 VkResult err;
2044 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002045
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002047
Tony Barbour1fa09702017-03-16 12:09:08 -06002048 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002049
2050 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002051 VkImage image;
2052 VkDeviceMemory mem1;
2053 VkDeviceMemory mem2;
2054 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002055
Karl Schultz6addd812016-02-02 17:17:23 -07002056 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2057 const int32_t tex_width = 32;
2058 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002059
Tony Barboureb254902015-07-15 12:50:33 -06002060 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002061 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2062 image_create_info.pNext = NULL;
2063 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2064 image_create_info.format = tex_format;
2065 image_create_info.extent.width = tex_width;
2066 image_create_info.extent.height = tex_height;
2067 image_create_info.extent.depth = 1;
2068 image_create_info.mipLevels = 1;
2069 image_create_info.arrayLayers = 1;
2070 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2071 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2072 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2073 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002075 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002076 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2077 mem_alloc.pNext = NULL;
2078 mem_alloc.allocationSize = 0;
2079 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 // Introduce failure, do NOT set memProps to
2082 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002083 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002084 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002085 ASSERT_VK_SUCCESS(err);
2086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002088
2089 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002090 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002091 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002092
2093 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002094 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002095 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002096 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097 ASSERT_VK_SUCCESS(err);
2098
2099 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002100 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101 ASSERT_VK_SUCCESS(err);
2102
Karl Schultz6addd812016-02-02 17:17:23 -07002103 // Introduce validation failure, try to bind a different memory object to
2104 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002105 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002107 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002108
Chia-I Wuf7458c52015-10-26 21:10:41 +08002109 vkDestroyImage(m_device->device(), image, NULL);
2110 vkFreeMemory(m_device->device(), mem1, NULL);
2111 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002112}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002113
Karl Schultz6addd812016-02-02 17:17:23 -07002114TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002115 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002116
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2118 "submitted in SIGNALED state. Fences "
2119 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002120
2121 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002122 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2123 fenceInfo.pNext = NULL;
2124 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002125
Tony Barbour1fa09702017-03-16 12:09:08 -06002126 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002127 ASSERT_NO_FATAL_FAILURE(InitViewport());
2128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2129
Tony Barbour552f6c02016-12-21 14:34:07 -07002130 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002131 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002132 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002133
2134 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002135
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002136 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002137 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2138 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002139 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002140 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002141 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002142 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002143 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002144 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002146
2147 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002148 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002149
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002150 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002151}
Chris Forbes4e44c912016-06-16 10:20:00 +12002152
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002153TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002154 TEST_DESCRIPTION(
2155 "Specify wrong usage for image then create conflicting view of image "
2156 "Initialize buffer with wrong usage then perform copy expecting errors "
2157 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002159
Tony Barbour1fa09702017-03-16 12:09:08 -06002160 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002161 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002162 if (!format) {
2163 printf(" No Depth + Stencil format found. Skipped.\n");
2164 return;
2165 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002166
Tony Barbourf92621a2016-05-02 14:28:12 -06002167 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002168 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002169 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002170 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002171
Tony Barbourf92621a2016-05-02 14:28:12 -06002172 VkImageView dsv;
2173 VkImageViewCreateInfo dsvci = {};
2174 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2175 dsvci.image = image.handle();
2176 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002177 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002178 dsvci.subresourceRange.layerCount = 1;
2179 dsvci.subresourceRange.baseMipLevel = 0;
2180 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002181 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002182
Tony Barbourf92621a2016-05-02 14:28:12 -06002183 // Create a view with depth / stencil aspect for image with different usage
2184 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002186 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002187
2188 // Initialize buffer with TRANSFER_DST usage
2189 vk_testing::Buffer buffer;
2190 VkMemoryPropertyFlags reqs = 0;
2191 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2192 VkBufferImageCopy region = {};
2193 region.bufferRowLength = 128;
2194 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002195 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002196 region.imageSubresource.layerCount = 1;
2197 region.imageExtent.height = 16;
2198 region.imageExtent.width = 16;
2199 region.imageExtent.depth = 1;
2200
Mark Lobodzinski80871462017-02-16 10:37:27 -07002201 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002202 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002203
Chris Forbesda581202016-10-06 18:25:26 +13002204 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Chris Forbesda581202016-10-06 18:25:26 +13002207
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002208 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2209 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002210 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002211}
Tony Barbour75d79f02016-08-30 09:39:07 -06002212
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002213TEST_F(VkLayerTest, LeakAnObject) {
2214 VkResult err;
2215
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002216 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002217
2218 // Note that we have to create a new device since destroying the
2219 // framework's device causes Teardown() to fail and just calling Teardown
2220 // will destroy the errorMonitor.
2221
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223
Tony Barbour1fa09702017-03-16 12:09:08 -06002224 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227 std::vector<VkDeviceQueueCreateInfo> queue_info;
2228 queue_info.reserve(queue_props.size());
2229 std::vector<std::vector<float>> queue_priorities;
2230 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2231 VkDeviceQueueCreateInfo qi = {};
2232 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2233 qi.pNext = NULL;
2234 qi.queueFamilyIndex = i;
2235 qi.queueCount = queue_props[i].queueCount;
2236 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2237 qi.pQueuePriorities = queue_priorities[i].data();
2238 queue_info.push_back(qi);
2239 }
2240
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002241 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002242
2243 // The sacrificial device object
2244 VkDevice testDevice;
2245 VkDeviceCreateInfo device_create_info = {};
2246 auto features = m_device->phy().features();
2247 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2248 device_create_info.pNext = NULL;
2249 device_create_info.queueCreateInfoCount = queue_info.size();
2250 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002251 device_create_info.enabledLayerCount = 0;
2252 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002253 device_create_info.pEnabledFeatures = &features;
2254 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2255 ASSERT_VK_SUCCESS(err);
2256
2257 VkFence fence;
2258 VkFenceCreateInfo fence_create_info = {};
2259 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2260 fence_create_info.pNext = NULL;
2261 fence_create_info.flags = 0;
2262 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2263 ASSERT_VK_SUCCESS(err);
2264
2265 // Induce failure by not calling vkDestroyFence
2266 vkDestroyDevice(testDevice, NULL);
2267 m_errorMonitor->VerifyFound();
2268}
2269
2270TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002271 TEST_DESCRIPTION(
2272 "Allocate command buffers from one command pool and "
2273 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002274
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002276
Tony Barbour1fa09702017-03-16 12:09:08 -06002277 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002278 VkCommandPool command_pool_one;
2279 VkCommandPool command_pool_two;
2280
2281 VkCommandPoolCreateInfo pool_create_info{};
2282 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2283 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2284 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2285
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002286 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002288 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002289
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002290 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002291 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002292 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002293 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002294 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002295 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002296 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002298 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
2300 m_errorMonitor->VerifyFound();
2301
2302 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2303 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2304}
2305
2306TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2307 VkResult err;
2308
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002309 TEST_DESCRIPTION(
2310 "Allocate descriptor sets from one DS pool and "
2311 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002312
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002314
Tony Barbour1fa09702017-03-16 12:09:08 -06002315 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002316 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2317
2318 VkDescriptorPoolSize ds_type_count = {};
2319 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2320 ds_type_count.descriptorCount = 1;
2321
2322 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2323 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2324 ds_pool_ci.pNext = NULL;
2325 ds_pool_ci.flags = 0;
2326 ds_pool_ci.maxSets = 1;
2327 ds_pool_ci.poolSizeCount = 1;
2328 ds_pool_ci.pPoolSizes = &ds_type_count;
2329
2330 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002331 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002332 ASSERT_VK_SUCCESS(err);
2333
2334 // Create a second descriptor pool
2335 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002336 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002337 ASSERT_VK_SUCCESS(err);
2338
2339 VkDescriptorSetLayoutBinding dsl_binding = {};
2340 dsl_binding.binding = 0;
2341 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2342 dsl_binding.descriptorCount = 1;
2343 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2344 dsl_binding.pImmutableSamplers = NULL;
2345
2346 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2347 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2348 ds_layout_ci.pNext = NULL;
2349 ds_layout_ci.bindingCount = 1;
2350 ds_layout_ci.pBindings = &dsl_binding;
2351
2352 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002353 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002354 ASSERT_VK_SUCCESS(err);
2355
2356 VkDescriptorSet descriptorSet;
2357 VkDescriptorSetAllocateInfo alloc_info = {};
2358 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2359 alloc_info.descriptorSetCount = 1;
2360 alloc_info.descriptorPool = ds_pool_one;
2361 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2366
2367 m_errorMonitor->VerifyFound();
2368
2369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2370 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2371 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2372}
2373
2374TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002376
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002377 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002378
Tony Barbour1fa09702017-03-16 12:09:08 -06002379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002380
2381 // Pass bogus handle into GetImageMemoryRequirements
2382 VkMemoryRequirements mem_reqs;
2383 uint64_t fakeImageHandle = 0xCADECADE;
2384 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2385
2386 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2387
2388 m_errorMonitor->VerifyFound();
2389}
2390
Mike Schuchardt17838902017-02-21 09:48:06 -07002391TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2392 TEST_DESCRIPTION(
2393 "Try to destroy a render pass object using a device other than the one it was created on. "
2394 "This should generate a distinct error from the invalid handle error.");
2395 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002396 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2398
2399 // Create second device
2400 float priorities[] = {1.0f};
2401 VkDeviceQueueCreateInfo queue_info{};
2402 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2403 queue_info.pNext = NULL;
2404 queue_info.flags = 0;
2405 queue_info.queueFamilyIndex = 0;
2406 queue_info.queueCount = 1;
2407 queue_info.pQueuePriorities = &priorities[0];
2408
2409 VkDeviceCreateInfo device_create_info = {};
2410 auto features = m_device->phy().features();
2411 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2412 device_create_info.pNext = NULL;
2413 device_create_info.queueCreateInfoCount = 1;
2414 device_create_info.pQueueCreateInfos = &queue_info;
2415 device_create_info.enabledLayerCount = 0;
2416 device_create_info.ppEnabledLayerNames = NULL;
2417 device_create_info.pEnabledFeatures = &features;
2418
2419 VkDevice second_device;
2420 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2421
2422 // Try to destroy the renderpass from the first device using the second device
2423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2424 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2425 m_errorMonitor->VerifyFound();
2426
2427 vkDestroyDevice(second_device, NULL);
2428}
2429
Karl Schultz6addd812016-02-02 17:17:23 -07002430TEST_F(VkLayerTest, PipelineNotBound) {
2431 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002432
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002433 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002434
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002436
Tony Barbour1fa09702017-03-16 12:09:08 -06002437 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002439
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002440 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002441 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2442 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002443
2444 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002445 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2446 ds_pool_ci.pNext = NULL;
2447 ds_pool_ci.maxSets = 1;
2448 ds_pool_ci.poolSizeCount = 1;
2449 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002450
2451 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002452 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453 ASSERT_VK_SUCCESS(err);
2454
2455 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002456 dsl_binding.binding = 0;
2457 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2458 dsl_binding.descriptorCount = 1;
2459 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2460 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002461
2462 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002463 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2464 ds_layout_ci.pNext = NULL;
2465 ds_layout_ci.bindingCount = 1;
2466 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002467
2468 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002469 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470 ASSERT_VK_SUCCESS(err);
2471
2472 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002473 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002474 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002475 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002476 alloc_info.descriptorPool = ds_pool;
2477 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002478 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002479 ASSERT_VK_SUCCESS(err);
2480
2481 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002482 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2483 pipeline_layout_ci.pNext = NULL;
2484 pipeline_layout_ci.setLayoutCount = 1;
2485 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002486
2487 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
Mark Youngad779052016-01-06 14:26:04 -07002491 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
Tony Barbour552f6c02016-12-21 14:34:07 -07002493 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002494 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002497
Chia-I Wuf7458c52015-10-26 21:10:41 +08002498 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002501}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002502
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002503TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2504 VkResult err;
2505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002506 TEST_DESCRIPTION(
2507 "Test validation check for an invalid memory type index "
2508 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002509
Tony Barbour1fa09702017-03-16 12:09:08 -06002510 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002511
2512 // Create an image, allocate memory, set a bad typeIndex and then try to
2513 // bind it
2514 VkImage image;
2515 VkDeviceMemory mem;
2516 VkMemoryRequirements mem_reqs;
2517 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2518 const int32_t tex_width = 32;
2519 const int32_t tex_height = 32;
2520
2521 VkImageCreateInfo image_create_info = {};
2522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2523 image_create_info.pNext = NULL;
2524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2525 image_create_info.format = tex_format;
2526 image_create_info.extent.width = tex_width;
2527 image_create_info.extent.height = tex_height;
2528 image_create_info.extent.depth = 1;
2529 image_create_info.mipLevels = 1;
2530 image_create_info.arrayLayers = 1;
2531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2532 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2533 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2534 image_create_info.flags = 0;
2535
2536 VkMemoryAllocateInfo mem_alloc = {};
2537 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2538 mem_alloc.pNext = NULL;
2539 mem_alloc.allocationSize = 0;
2540 mem_alloc.memoryTypeIndex = 0;
2541
2542 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2543 ASSERT_VK_SUCCESS(err);
2544
2545 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2546 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002547
2548 // Introduce Failure, select invalid TypeIndex
2549 VkPhysicalDeviceMemoryProperties memory_info;
2550
2551 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2552 unsigned int i;
2553 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2554 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2555 mem_alloc.memoryTypeIndex = i;
2556 break;
2557 }
2558 }
2559 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002560 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002561 vkDestroyImage(m_device->device(), image, NULL);
2562 return;
2563 }
2564
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002566
2567 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2568 ASSERT_VK_SUCCESS(err);
2569
2570 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2571 (void)err;
2572
2573 m_errorMonitor->VerifyFound();
2574
2575 vkDestroyImage(m_device->device(), image, NULL);
2576 vkFreeMemory(m_device->device(), mem, NULL);
2577}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
Karl Schultz6addd812016-02-02 17:17:23 -07002579TEST_F(VkLayerTest, BindInvalidMemory) {
2580 VkResult err;
2581 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002582
Tony Barbour1fa09702017-03-16 12:09:08 -06002583 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002584
Cortf801b982017-01-17 18:10:21 -08002585 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002586 const int32_t tex_width = 256;
2587 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002588
2589 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002590 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2591 image_create_info.pNext = NULL;
2592 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2593 image_create_info.format = tex_format;
2594 image_create_info.extent.width = tex_width;
2595 image_create_info.extent.height = tex_height;
2596 image_create_info.extent.depth = 1;
2597 image_create_info.mipLevels = 1;
2598 image_create_info.arrayLayers = 1;
2599 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002600 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002601 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2602 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002603
Cortf801b982017-01-17 18:10:21 -08002604 VkBufferCreateInfo buffer_create_info = {};
2605 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2606 buffer_create_info.pNext = NULL;
2607 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002608 buffer_create_info.size = 4 * 1024 * 1024;
2609 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002610 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002611
Cortf801b982017-01-17 18:10:21 -08002612 // Create an image/buffer, allocate memory, free it, and then try to bind it
2613 {
2614 VkImage image = VK_NULL_HANDLE;
2615 VkBuffer buffer = VK_NULL_HANDLE;
2616 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2617 ASSERT_VK_SUCCESS(err);
2618 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2619 ASSERT_VK_SUCCESS(err);
2620 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2621 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2622 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002623
Cortf801b982017-01-17 18:10:21 -08002624 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2625 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2626 image_mem_alloc.allocationSize = image_mem_reqs.size;
2627 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2628 ASSERT_TRUE(pass);
2629 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2630 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2631 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2632 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2635 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2636 ASSERT_VK_SUCCESS(err);
2637 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2638 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002639
Cortf801b982017-01-17 18:10:21 -08002640 vkFreeMemory(device(), image_mem, NULL);
2641 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2644 err = vkBindImageMemory(device(), image, image_mem, 0);
2645 (void)err; // This may very well return an error.
2646 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002647
Cortf801b982017-01-17 18:10:21 -08002648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2649 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2650 (void)err; // This may very well return an error.
2651 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 vkDestroyImage(m_device->device(), image, NULL);
2654 vkDestroyBuffer(m_device->device(), buffer, NULL);
2655 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002656
2657 // Try to bind memory to an object that already has a memory binding
2658 {
2659 VkImage image = VK_NULL_HANDLE;
2660 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2661 ASSERT_VK_SUCCESS(err);
2662 VkBuffer buffer = VK_NULL_HANDLE;
2663 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2664 ASSERT_VK_SUCCESS(err);
2665 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2666 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2667 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2668 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2669 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2670 image_alloc_info.allocationSize = image_mem_reqs.size;
2671 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2672 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2673 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2674 ASSERT_TRUE(pass);
2675 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2676 ASSERT_TRUE(pass);
2677 VkDeviceMemory image_mem, buffer_mem;
2678 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2679 ASSERT_VK_SUCCESS(err);
2680 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2681 ASSERT_VK_SUCCESS(err);
2682
2683 err = vkBindImageMemory(device(), image, image_mem, 0);
2684 ASSERT_VK_SUCCESS(err);
2685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2686 err = vkBindImageMemory(device(), image, image_mem, 0);
2687 (void)err; // This may very well return an error.
2688 m_errorMonitor->VerifyFound();
2689
2690 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2691 ASSERT_VK_SUCCESS(err);
2692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2693 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2694 (void)err; // This may very well return an error.
2695 m_errorMonitor->VerifyFound();
2696
2697 vkFreeMemory(device(), image_mem, NULL);
2698 vkFreeMemory(device(), buffer_mem, NULL);
2699 vkDestroyImage(device(), image, NULL);
2700 vkDestroyBuffer(device(), buffer, NULL);
2701 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002702
Cort Strattonde748202017-02-17 12:50:01 -08002703 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002704 {
2705 VkImage image = VK_NULL_HANDLE;
2706 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2707 ASSERT_VK_SUCCESS(err);
2708 VkBuffer buffer = VK_NULL_HANDLE;
2709 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2710 ASSERT_VK_SUCCESS(err);
2711 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2712 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2713 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2714 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2715 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002716 // Leave some extra space for alignment wiggle room
2717 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002718 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002719 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002720 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2721 ASSERT_TRUE(pass);
2722 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2723 ASSERT_TRUE(pass);
2724 VkDeviceMemory image_mem, buffer_mem;
2725 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2726 ASSERT_VK_SUCCESS(err);
2727 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2728 ASSERT_VK_SUCCESS(err);
2729
Cort Strattonde748202017-02-17 12:50:01 -08002730 // Test unaligned memory offset
2731 {
2732 if (image_mem_reqs.alignment > 1) {
2733 VkDeviceSize image_offset = 1;
2734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2735 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2736 (void)err; // This may very well return an error.
2737 m_errorMonitor->VerifyFound();
2738 }
Cort6c7dff72017-01-27 18:34:50 -08002739
Cort Strattonde748202017-02-17 12:50:01 -08002740 if (buffer_mem_reqs.alignment > 1) {
2741 VkDeviceSize buffer_offset = 1;
2742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2743 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2744 (void)err; // This may very well return an error.
2745 m_errorMonitor->VerifyFound();
2746 }
2747 }
2748
2749 // Test memory offsets outside the memory allocation
2750 {
2751 VkDeviceSize image_offset =
2752 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2754 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2755 (void)err; // This may very well return an error.
2756 m_errorMonitor->VerifyFound();
2757
2758 VkDeviceSize buffer_offset =
2759 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2761 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2762 (void)err; // This may very well return an error.
2763 m_errorMonitor->VerifyFound();
2764 }
2765
2766 // Test memory offsets within the memory allocation, but which leave too little memory for
2767 // the resource.
2768 {
2769 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002770 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2772 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2773 (void)err; // This may very well return an error.
2774 m_errorMonitor->VerifyFound();
2775 }
2776
2777 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2778 if (buffer_offset > 0) {
2779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2780 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2781 (void)err; // This may very well return an error.
2782 m_errorMonitor->VerifyFound();
2783 }
2784 }
Cort6c7dff72017-01-27 18:34:50 -08002785
2786 vkFreeMemory(device(), image_mem, NULL);
2787 vkFreeMemory(device(), buffer_mem, NULL);
2788 vkDestroyImage(device(), image, NULL);
2789 vkDestroyBuffer(device(), buffer, NULL);
2790 }
2791
Cort Stratton4c38bb52017-01-28 13:33:10 -08002792 // Try to bind memory to an object with an invalid memory type
2793 {
2794 VkImage image = VK_NULL_HANDLE;
2795 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2796 ASSERT_VK_SUCCESS(err);
2797 VkBuffer buffer = VK_NULL_HANDLE;
2798 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2799 ASSERT_VK_SUCCESS(err);
2800 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2801 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2802 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2803 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2804 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2805 image_alloc_info.allocationSize = image_mem_reqs.size;
2806 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2807 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002808 // Create a mask of available memory types *not* supported by these resources,
2809 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002810 VkPhysicalDeviceMemoryProperties memory_properties = {};
2811 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002812 VkDeviceMemory image_mem, buffer_mem;
2813
Cort Stratton4c38bb52017-01-28 13:33:10 -08002814 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002815 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002816 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2817 ASSERT_TRUE(pass);
2818 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2819 ASSERT_VK_SUCCESS(err);
2820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2821 err = vkBindImageMemory(device(), image, image_mem, 0);
2822 (void)err; // This may very well return an error.
2823 m_errorMonitor->VerifyFound();
2824 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 }
2826
Cort Stratton4c38bb52017-01-28 13:33:10 -08002827 uint32_t buffer_unsupported_mem_type_bits =
2828 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002829 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002830 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2831 ASSERT_TRUE(pass);
2832 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2833 ASSERT_VK_SUCCESS(err);
2834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2835 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2836 (void)err; // This may very well return an error.
2837 m_errorMonitor->VerifyFound();
2838 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002840
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 vkDestroyImage(device(), image, NULL);
2842 vkDestroyBuffer(device(), buffer, NULL);
2843 }
2844
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002845 // Try to bind memory to an image created with sparse memory flags
2846 {
2847 VkImageCreateInfo sparse_image_create_info = image_create_info;
2848 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2849 VkImageFormatProperties image_format_properties = {};
2850 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2851 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2852 sparse_image_create_info.usage, sparse_image_create_info.flags,
2853 &image_format_properties);
2854 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2855 // most likely means sparse formats aren't supported here; skip this test.
2856 } else {
2857 ASSERT_VK_SUCCESS(err);
2858 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002859 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002860 return;
2861 } else {
2862 VkImage sparse_image = VK_NULL_HANDLE;
2863 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2864 ASSERT_VK_SUCCESS(err);
2865 VkMemoryRequirements sparse_mem_reqs = {};
2866 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2867 if (sparse_mem_reqs.memoryTypeBits != 0) {
2868 VkMemoryAllocateInfo sparse_mem_alloc = {};
2869 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2870 sparse_mem_alloc.pNext = NULL;
2871 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2872 sparse_mem_alloc.memoryTypeIndex = 0;
2873 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2874 ASSERT_TRUE(pass);
2875 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2876 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2877 ASSERT_VK_SUCCESS(err);
2878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2879 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2880 // This may very well return an error.
2881 (void)err;
2882 m_errorMonitor->VerifyFound();
2883 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2884 }
2885 vkDestroyImage(m_device->device(), sparse_image, NULL);
2886 }
2887 }
2888 }
2889
2890 // Try to bind memory to a buffer created with sparse memory flags
2891 {
2892 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2893 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2894 if (!m_device->phy().features().sparseResidencyBuffer) {
2895 // most likely means sparse formats aren't supported here; skip this test.
2896 } else {
2897 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2898 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2899 ASSERT_VK_SUCCESS(err);
2900 VkMemoryRequirements sparse_mem_reqs = {};
2901 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2902 if (sparse_mem_reqs.memoryTypeBits != 0) {
2903 VkMemoryAllocateInfo sparse_mem_alloc = {};
2904 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2905 sparse_mem_alloc.pNext = NULL;
2906 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2907 sparse_mem_alloc.memoryTypeIndex = 0;
2908 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2909 ASSERT_TRUE(pass);
2910 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2911 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2912 ASSERT_VK_SUCCESS(err);
2913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2914 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2915 // This may very well return an error.
2916 (void)err;
2917 m_errorMonitor->VerifyFound();
2918 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2919 }
2920 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2921 }
2922 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002923}
2924
Karl Schultz6addd812016-02-02 17:17:23 -07002925TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2926 VkResult err;
2927 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002928
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002930
Tony Barbour1fa09702017-03-16 12:09:08 -06002931 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002932
Karl Schultz6addd812016-02-02 17:17:23 -07002933 // Create an image object, allocate memory, destroy the object and then try
2934 // to bind it
2935 VkImage image;
2936 VkDeviceMemory mem;
2937 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultz6addd812016-02-02 17:17:23 -07002939 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2940 const int32_t tex_width = 32;
2941 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
2943 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002944 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2945 image_create_info.pNext = NULL;
2946 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2947 image_create_info.format = tex_format;
2948 image_create_info.extent.width = tex_width;
2949 image_create_info.extent.height = tex_height;
2950 image_create_info.extent.depth = 1;
2951 image_create_info.mipLevels = 1;
2952 image_create_info.arrayLayers = 1;
2953 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2954 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2955 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2956 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002957
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002958 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002959 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2960 mem_alloc.pNext = NULL;
2961 mem_alloc.allocationSize = 0;
2962 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Chia-I Wuf7458c52015-10-26 21:10:41 +08002964 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002965 ASSERT_VK_SUCCESS(err);
2966
Karl Schultz6addd812016-02-02 17:17:23 -07002967 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002968
2969 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002970 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002971 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002972
2973 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002974 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
2977 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002978 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002979 ASSERT_VK_SUCCESS(err);
2980
2981 // Now Try to bind memory to this destroyed object
2982 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2983 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002984 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002985
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002986 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002987
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002989}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002990
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002991TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2992 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2993
Tony Barbour1fa09702017-03-16 12:09:08 -06002994 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2996
2997 VkVertexInputBindingDescription input_binding;
2998 memset(&input_binding, 0, sizeof(input_binding));
2999
3000 VkVertexInputAttributeDescription input_attribs;
3001 memset(&input_attribs, 0, sizeof(input_attribs));
3002
3003 // Pick a really bad format for this purpose and make sure it should fail
3004 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3005 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3006 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003007 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003008 return;
3009 }
3010
3011 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003012 char const *vsSource =
3013 "#version 450\n"
3014 "\n"
3015 "out gl_PerVertex {\n"
3016 " vec4 gl_Position;\n"
3017 "};\n"
3018 "void main(){\n"
3019 " gl_Position = vec4(1);\n"
3020 "}\n";
3021 char const *fsSource =
3022 "#version 450\n"
3023 "\n"
3024 "layout(location=0) out vec4 color;\n"
3025 "void main(){\n"
3026 " color = vec4(1);\n"
3027 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003028
3029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3030 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3031 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3032
3033 VkPipelineObj pipe(m_device);
3034 pipe.AddColorAttachment();
3035 pipe.AddShader(&vs);
3036 pipe.AddShader(&fs);
3037
3038 pipe.AddVertexInputBindings(&input_binding, 1);
3039 pipe.AddVertexInputAttribs(&input_attribs, 1);
3040
3041 VkDescriptorSetObj descriptorSet(m_device);
3042 descriptorSet.AppendDummy();
3043 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3044
3045 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3046
3047 m_errorMonitor->VerifyFound();
3048}
3049
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003050TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003051 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003052 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003053
3054 VkMemoryPropertyFlags reqs = 0;
3055 VkImageCreateInfo image_create_info = {};
3056 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3057 image_create_info.pNext = NULL;
3058 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3059 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3060 image_create_info.extent.width = 256;
3061 image_create_info.extent.height = 256;
3062 image_create_info.extent.depth = 1;
3063 image_create_info.mipLevels = 1;
3064 image_create_info.arrayLayers = 1;
3065 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3066 image_create_info.flags = 0;
3067
3068 VkImageBlit blit_region = {};
3069 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3070 blit_region.srcSubresource.baseArrayLayer = 0;
3071 blit_region.srcSubresource.layerCount = 1;
3072 blit_region.srcSubresource.mipLevel = 0;
3073 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3074 blit_region.dstSubresource.baseArrayLayer = 0;
3075 blit_region.dstSubresource.layerCount = 1;
3076 blit_region.dstSubresource.mipLevel = 0;
3077
3078 // Create two images, the source with sampleCount = 2, and attempt to blit
3079 // between them
3080 {
3081 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003082 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003083 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003084 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003086 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003087 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003088 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003089 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003090 m_errorMonitor->SetDesiredFailureMsg(
3091 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3092 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003093 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3094 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 m_errorMonitor->VerifyFound();
3096 m_commandBuffer->EndCommandBuffer();
3097 }
3098
3099 // Create two images, the dest with sampleCount = 4, and attempt to blit
3100 // between them
3101 {
3102 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003103 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003104 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003105 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003106 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003107 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003108 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003109 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003110 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003111 m_errorMonitor->SetDesiredFailureMsg(
3112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3113 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003114 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3115 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 m_errorMonitor->VerifyFound();
3117 m_commandBuffer->EndCommandBuffer();
3118 }
3119
3120 VkBufferImageCopy copy_region = {};
3121 copy_region.bufferRowLength = 128;
3122 copy_region.bufferImageHeight = 128;
3123 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3124 copy_region.imageSubresource.layerCount = 1;
3125 copy_region.imageExtent.height = 64;
3126 copy_region.imageExtent.width = 64;
3127 copy_region.imageExtent.depth = 1;
3128
3129 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3130 // buffer to image
3131 {
3132 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003133 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3134 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003135 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003136 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003137 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003138 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003139 m_errorMonitor->SetDesiredFailureMsg(
3140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3141 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003142 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3143 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003144 m_errorMonitor->VerifyFound();
3145 m_commandBuffer->EndCommandBuffer();
3146 }
3147
3148 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3149 // image to buffer
3150 {
3151 vk_testing::Buffer dst_buffer;
3152 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3153 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003154 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003155 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003156 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003157 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003158 m_errorMonitor->SetDesiredFailureMsg(
3159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3160 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003161 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003162 dst_buffer.handle(), 1, &copy_region);
3163 m_errorMonitor->VerifyFound();
3164 m_commandBuffer->EndCommandBuffer();
3165 }
3166}
3167
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003168TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003169 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003170
3171 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003172 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003173 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003174 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003175 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003176 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003177
3178 VkImageBlit blitRegion = {};
3179 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3180 blitRegion.srcSubresource.baseArrayLayer = 0;
3181 blitRegion.srcSubresource.layerCount = 1;
3182 blitRegion.srcSubresource.mipLevel = 0;
3183 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3184 blitRegion.dstSubresource.baseArrayLayer = 0;
3185 blitRegion.dstSubresource.layerCount = 1;
3186 blitRegion.dstSubresource.mipLevel = 0;
3187
Dave Houlton34df4cb2016-12-01 16:43:06 -07003188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3189
3190 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3191 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003192
3193 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003194 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003195 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003196 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003197
3198 m_errorMonitor->VerifyFound();
3199
Dave Houlton34df4cb2016-12-01 16:43:06 -07003200 // Test should generate 2 VU failures
3201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003203
3204 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
Dave Houlton34df4cb2016-12-01 16:43:06 -07003208 // TODO: Note that this only verifies that at least one of the VU enums was found
3209 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003210 m_errorMonitor->VerifyFound();
3211
Tony Barbour552f6c02016-12-21 14:34:07 -07003212 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213}
3214
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003215TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3216 VkResult err;
3217 bool pass;
3218
3219 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003220 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003221
3222 // If w/d/h granularity is 1, test is not meaningful
3223 // TODO: When virtual device limits are available, create a set of limits for this test that
3224 // will always have a granularity of > 1 for w, h, and d
3225 auto index = m_device->graphics_queue_node_index_;
3226 auto queue_family_properties = m_device->phy().queue_properties();
3227
3228 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3229 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3230 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3231 return;
3232 }
3233
3234 // Create two images of different types and try to copy between them
3235 VkImage srcImage;
3236 VkImage dstImage;
3237 VkDeviceMemory srcMem;
3238 VkDeviceMemory destMem;
3239 VkMemoryRequirements memReqs;
3240
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003241 VkImageCreateInfo image_create_info = {};
3242 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3243 image_create_info.pNext = NULL;
3244 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3245 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3246 image_create_info.extent.width = 32;
3247 image_create_info.extent.height = 32;
3248 image_create_info.extent.depth = 1;
3249 image_create_info.mipLevels = 1;
3250 image_create_info.arrayLayers = 4;
3251 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3252 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3253 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3254 image_create_info.flags = 0;
3255
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003256 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003257 ASSERT_VK_SUCCESS(err);
3258
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003259 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003260 ASSERT_VK_SUCCESS(err);
3261
3262 // Allocate memory
3263 VkMemoryAllocateInfo memAlloc = {};
3264 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3265 memAlloc.pNext = NULL;
3266 memAlloc.allocationSize = 0;
3267 memAlloc.memoryTypeIndex = 0;
3268
3269 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3270 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003271 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 ASSERT_TRUE(pass);
3273 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3274 ASSERT_VK_SUCCESS(err);
3275
3276 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3277 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003278 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003279 ASSERT_VK_SUCCESS(err);
3280 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3281 ASSERT_VK_SUCCESS(err);
3282
3283 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3284 ASSERT_VK_SUCCESS(err);
3285 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3286 ASSERT_VK_SUCCESS(err);
3287
Tony Barbour552f6c02016-12-21 14:34:07 -07003288 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 VkImageCopy copyRegion;
3290 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3291 copyRegion.srcSubresource.mipLevel = 0;
3292 copyRegion.srcSubresource.baseArrayLayer = 0;
3293 copyRegion.srcSubresource.layerCount = 1;
3294 copyRegion.srcOffset.x = 0;
3295 copyRegion.srcOffset.y = 0;
3296 copyRegion.srcOffset.z = 0;
3297 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3298 copyRegion.dstSubresource.mipLevel = 0;
3299 copyRegion.dstSubresource.baseArrayLayer = 0;
3300 copyRegion.dstSubresource.layerCount = 1;
3301 copyRegion.dstOffset.x = 0;
3302 copyRegion.dstOffset.y = 0;
3303 copyRegion.dstOffset.z = 0;
3304 copyRegion.extent.width = 1;
3305 copyRegion.extent.height = 1;
3306 copyRegion.extent.depth = 1;
3307
3308 // Introduce failure by setting srcOffset to a bad granularity value
3309 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3311 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003312 m_errorMonitor->VerifyFound();
3313
3314 // Introduce failure by setting extent to a bad granularity value
3315 copyRegion.srcOffset.y = 0;
3316 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3318 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003319 m_errorMonitor->VerifyFound();
3320
3321 // Now do some buffer/image copies
3322 vk_testing::Buffer buffer;
3323 VkMemoryPropertyFlags reqs = 0;
3324 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3325 VkBufferImageCopy region = {};
3326 region.bufferOffset = 0;
3327 region.bufferRowLength = 3;
3328 region.bufferImageHeight = 128;
3329 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3330 region.imageSubresource.layerCount = 1;
3331 region.imageExtent.height = 16;
3332 region.imageExtent.width = 16;
3333 region.imageExtent.depth = 1;
3334 region.imageOffset.x = 0;
3335 region.imageOffset.y = 0;
3336 region.imageOffset.z = 0;
3337
3338 // Introduce failure by setting bufferRowLength to a bad granularity value
3339 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3341 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3342 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344 region.bufferRowLength = 128;
3345
3346 // Introduce failure by setting bufferOffset to a bad granularity value
3347 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3350 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003351 m_errorMonitor->VerifyFound();
3352 region.bufferOffset = 0;
3353
3354 // Introduce failure by setting bufferImageHeight to a bad granularity value
3355 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3357 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3358 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003359 m_errorMonitor->VerifyFound();
3360 region.bufferImageHeight = 128;
3361
3362 // Introduce failure by setting imageExtent to a bad granularity value
3363 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3365 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3366 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003367 m_errorMonitor->VerifyFound();
3368 region.imageExtent.width = 16;
3369
3370 // Introduce failure by setting imageOffset to a bad granularity value
3371 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3373 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3374 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003375 m_errorMonitor->VerifyFound();
3376
Tony Barbour552f6c02016-12-21 14:34:07 -07003377 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003378
3379 vkDestroyImage(m_device->device(), srcImage, NULL);
3380 vkDestroyImage(m_device->device(), dstImage, NULL);
3381 vkFreeMemory(m_device->device(), srcMem, NULL);
3382 vkFreeMemory(m_device->device(), destMem, NULL);
3383}
3384
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003385TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003386 TEST_DESCRIPTION(
3387 "Submit command buffer created using one queue family and "
3388 "attempt to submit them on a queue created in a different "
3389 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003390
Tony Barbour1fa09702017-03-16 12:09:08 -06003391 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003392
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003393 // This test is meaningless unless we have multiple queue families
3394 auto queue_family_properties = m_device->phy().queue_properties();
3395 if (queue_family_properties.size() < 2) {
3396 return;
3397 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003399 // Get safe index of another queue family
3400 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003401 VkQueue other_queue;
3402 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3403
3404 // Record an empty cmd buffer
3405 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3406 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3407 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3408 vkEndCommandBuffer(m_commandBuffer->handle());
3409
3410 // And submit on the wrong queue
3411 VkSubmitInfo submit_info = {};
3412 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3413 submit_info.commandBufferCount = 1;
3414 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003415 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416
3417 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003418}
3419
Chris Forbes4c24a922016-11-16 08:59:10 +13003420TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003421 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003422
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003423 // There are no attachments, but refer to attachment 0.
3424 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003425 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003426 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003427 };
3428
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003429 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003430 VkRenderPass rp;
3431
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003432 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003434 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3435 m_errorMonitor->VerifyFound();
3436}
3437
Chris Forbesa58c4522016-09-28 15:19:39 +13003438TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3439 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003440 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003441
3442 // A renderpass with two subpasses, both writing the same attachment.
3443 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003444 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3445 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3446 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003447 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003448 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003449 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003450 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3451 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003452 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003453 VkSubpassDependency dep = {0,
3454 1,
3455 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3456 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3457 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3458 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3459 VK_DEPENDENCY_BY_REGION_BIT};
3460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkRenderPass rp;
3462 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3463 ASSERT_VK_SUCCESS(err);
3464
3465 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003466 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003467 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3468
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003469 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003470 VkFramebuffer fb;
3471 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3472 ASSERT_VK_SUCCESS(err);
3473
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003474 char const *vsSource =
3475 "#version 450\n"
3476 "void main() { gl_Position = vec4(1); }\n";
3477 char const *fsSource =
3478 "#version 450\n"
3479 "layout(location=0) out vec4 color;\n"
3480 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003481
3482 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3484 VkPipelineObj pipe(m_device);
3485 pipe.AddColorAttachment();
3486 pipe.AddShader(&vs);
3487 pipe.AddShader(&fs);
3488 VkViewport view_port = {};
3489 m_viewports.push_back(view_port);
3490 pipe.SetViewport(m_viewports);
3491 VkRect2D rect = {};
3492 m_scissors.push_back(rect);
3493 pipe.SetScissor(m_scissors);
3494
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003495 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003496 VkPipelineLayout pl;
3497 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3498 ASSERT_VK_SUCCESS(err);
3499 pipe.CreateVKPipeline(pl, rp);
3500
Tony Barbour552f6c02016-12-21 14:34:07 -07003501 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003502
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003503 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3504 nullptr,
3505 rp,
3506 fb,
3507 {{
3508 0, 0,
3509 },
3510 {32, 32}},
3511 0,
3512 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003513
3514 // subtest 1: bind in the wrong subpass
3515 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3516 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003518 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3519 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3520 m_errorMonitor->VerifyFound();
3521
3522 vkCmdEndRenderPass(m_commandBuffer->handle());
3523
3524 // subtest 2: bind in correct subpass, then transition to next subpass
3525 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3526 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3527 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003529 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3530 m_errorMonitor->VerifyFound();
3531
3532 vkCmdEndRenderPass(m_commandBuffer->handle());
3533
Tony Barbour552f6c02016-12-21 14:34:07 -07003534 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003535
3536 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3537 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3538 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3539}
3540
Tony Barbour4e919972016-08-09 13:27:40 -06003541TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003542 TEST_DESCRIPTION(
3543 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3544 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003545 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3547
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3549 "Cannot execute a render pass with renderArea "
3550 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003551
3552 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3553 m_renderPassBeginInfo.renderArea.extent.width = 257;
3554 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003555 m_commandBuffer->BeginCommandBuffer();
3556 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003557 m_errorMonitor->VerifyFound();
3558}
3559
3560TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003561 TEST_DESCRIPTION(
3562 "Generate INDEPENDENT_BLEND by disabling independent "
3563 "blend and then specifying different blend states for two "
3564 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003565 VkPhysicalDeviceFeatures features = {};
3566 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003567 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003568
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3570 "Invalid Pipeline CreateInfo: If independent blend feature not "
3571 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003572
Cody Northropc31a84f2016-08-22 10:41:47 -06003573 VkDescriptorSetObj descriptorSet(m_device);
3574 descriptorSet.AppendDummy();
3575 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003576
Cody Northropc31a84f2016-08-22 10:41:47 -06003577 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003578 // Create a renderPass with two color attachments
3579 VkAttachmentReference attachments[2] = {};
3580 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003581 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003582 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3583
3584 VkSubpassDescription subpass = {};
3585 subpass.pColorAttachments = attachments;
3586 subpass.colorAttachmentCount = 2;
3587
3588 VkRenderPassCreateInfo rpci = {};
3589 rpci.subpassCount = 1;
3590 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003591 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003592
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 VkAttachmentDescription attach_desc[2] = {};
3594 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3595 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3596 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3597 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3598 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3599 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3600 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3601 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003602
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3605
3606 VkRenderPass renderpass;
3607 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003608 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003609 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003610
Cody Northropc31a84f2016-08-22 10:41:47 -06003611 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3612 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3613 att_state1.blendEnable = VK_TRUE;
3614 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3615 att_state2.blendEnable = VK_FALSE;
3616 pipeline.AddColorAttachment(0, &att_state1);
3617 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003618 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003619 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003620 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003621}
3622
Mike Weiblen40b160e2017-02-06 19:21:52 -07003623// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3624TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3625 TEST_DESCRIPTION(
3626 "Create a graphics pipeline that is incompatible with the requirements "
3627 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003628 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003629
3630 VkDescriptorSetObj ds_obj(m_device);
3631 ds_obj.AppendDummy();
3632 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3633
3634 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3635
3636 VkPipelineColorBlendAttachmentState att_state1 = {};
3637 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3638 att_state1.blendEnable = VK_TRUE;
3639
3640 VkRenderpassObj rp_obj(m_device);
3641
3642 {
3643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3644 VkPipelineObj pipeline(m_device);
3645 pipeline.AddShader(&vs_obj);
3646 pipeline.AddColorAttachment(0, &att_state1);
3647
3648 VkGraphicsPipelineCreateInfo info = {};
3649 pipeline.InitGraphicsPipelineCreateInfo(&info);
3650 info.pColorBlendState = nullptr;
3651
3652 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3653 m_errorMonitor->VerifyFound();
3654 }
3655}
3656
Cort Stratton7547f772017-05-04 15:18:52 -07003657TEST_F(VkLayerTest, CreateRenderPassAttachments) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003658 TEST_DESCRIPTION(
Cort Stratton7547f772017-05-04 15:18:52 -07003659 "Ensure that CreateRenderPass produces the expected validation errors "
3660 "when a subpass's attachments violate the valid usage conditions.");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003661
Tony Barbour1fa09702017-03-16 12:09:08 -06003662 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003663
Cort Stratton7547f772017-05-04 15:18:52 -07003664 std::vector<VkAttachmentDescription> attachments = {
3665 // input attachments
3666 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3667 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_GENERAL,
3668 VK_IMAGE_LAYOUT_GENERAL},
3669 // color attachments
3670 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3671 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3672 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3673 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3674 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3675 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3676 // depth attachment
3677 {0, VK_FORMAT_D24_UNORM_S8_UINT, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3678 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
3679 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
3680 // resolve attachment
3681 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3682 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3683 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3684 // preserve attachments
3685 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3686 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3687 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3688 };
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003689
Cort Stratton7547f772017-05-04 15:18:52 -07003690 std::vector<VkAttachmentReference> input = {
3691 {0, VK_IMAGE_LAYOUT_GENERAL},
3692 };
3693 std::vector<VkAttachmentReference> color = {
3694 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3695 };
3696 VkAttachmentReference depth = {3, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
3697 std::vector<VkAttachmentReference> resolve = {
3698 {4, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3699 };
3700 std::vector<uint32_t> preserve = {5};
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003701
Cort Stratton7547f772017-05-04 15:18:52 -07003702 VkSubpassDescription subpass = {0,
3703 VK_PIPELINE_BIND_POINT_GRAPHICS,
3704 (uint32_t)input.size(),
3705 input.data(),
3706 (uint32_t)color.size(),
3707 color.data(),
3708 resolve.data(),
3709 &depth,
3710 (uint32_t)preserve.size(),
3711 preserve.data()};
3712
3713 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3714 nullptr,
3715 0,
3716 (uint32_t)attachments.size(),
3717 attachments.data(),
3718 1,
3719 &subpass,
3720 0,
3721 nullptr};
3722
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003723 VkRenderPass rp;
Cort Stratton7547f772017-05-04 15:18:52 -07003724 VkResult err;
3725 // Test too many color attachments
3726 {
3727 std::vector<VkAttachmentReference> too_many_colors(m_device->props.limits.maxColorAttachments + 1, color[0]);
3728 subpass.colorAttachmentCount = (uint32_t)too_many_colors.size();
3729 subpass.pColorAttachments = too_many_colors.data();
3730 subpass.pResolveAttachments = NULL;
3731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00348);
3732 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3733 m_errorMonitor->VerifyFound();
3734 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3735 subpass.colorAttachmentCount = (uint32_t)color.size();
3736 subpass.pColorAttachments = color.data();
3737 subpass.pResolveAttachments = resolve.data();
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003738 }
Cort Stratton7547f772017-05-04 15:18:52 -07003739 // Test sample count mismatch between color buffers
3740 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3742 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003743 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003744 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003745 attachments[subpass.pColorAttachments[1].attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3746 // Test sample count mismatch between color buffers and depth buffer
3747 attachments[subpass.pDepthStencilAttachment->attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3749 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003750 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003751 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003752 attachments[subpass.pDepthStencilAttachment->attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3753 // Test resolve attachment with UNUSED color attachment
3754 color[0].attachment = VK_ATTACHMENT_UNUSED;
3755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00350);
3756 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003757 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003758 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003759 color[0].attachment = 1;
3760 // Test resolve from a single-sampled color attachment
3761 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3762 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_1_BIT; // avoid mismatch (00337)
3763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00351);
3764 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3765 m_errorMonitor->VerifyFound();
3766 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3767 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3768 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3769 // Test resolve to a multi-sampled resolve attachment
3770 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00352);
3772 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3773 m_errorMonitor->VerifyFound();
3774 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3775 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3776 // Test with color/resolve format mismatch
3777 attachments[subpass.pColorAttachments[0].attachment].format = VK_FORMAT_R8G8B8A8_SRGB;
3778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00353);
3779 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3780 m_errorMonitor->VerifyFound();
3781 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3782 attachments[subpass.pColorAttachments[0].attachment].format = attachments[subpass.pResolveAttachments[0].attachment].format;
3783 // Test for UNUSED preserve attachments
3784 preserve[0] = VK_ATTACHMENT_UNUSED;
3785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00356);
3786 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3787 m_errorMonitor->VerifyFound();
3788 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3789 preserve[0] = 5;
3790 // Test for preserve attachments used elsewhere in the subpass
3791 color[0].attachment = preserve[0];
3792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00357);
3793 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3794 m_errorMonitor->VerifyFound();
3795 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3796 color[0].attachment = 1;
3797 // test for layout mismatch between input attachment and color attachment
3798 input[0].attachment = color[0].attachment;
3799 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3801 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3802 m_errorMonitor->VerifyFound();
3803 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3804 input[0].attachment = 0;
3805 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3806 // test for layout mismatch between input attachment and depth attachment
3807 input[0].attachment = depth.attachment;
3808 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3810 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3811 m_errorMonitor->VerifyFound();
3812 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3813 input[0].attachment = 0;
3814 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3815 // Test for attachment used first as input with loadOp=CLEAR
3816 {
3817 std::vector<VkSubpassDescription> subpasses = {subpass, subpass, subpass};
3818 subpasses[0].inputAttachmentCount = 0;
3819 subpasses[1].inputAttachmentCount = 0;
3820 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3821 VkRenderPassCreateInfo rpci_multipass = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3822 nullptr,
3823 0,
3824 (uint32_t)attachments.size(),
3825 attachments.data(),
3826 (uint32_t)subpasses.size(),
3827 subpasses.data(),
3828 0,
3829 nullptr};
3830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00349);
3831 err = vkCreateRenderPass(m_device->device(), &rpci_multipass, nullptr, &rp);
3832 m_errorMonitor->VerifyFound();
3833 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3834 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3835 }
Chris Forbes3f128ef2016-06-29 14:58:53 +12003836}
3837
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003838TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003839 TEST_DESCRIPTION(
3840 "Hit errors when attempting to create a framebuffer :\n"
3841 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3842 " 2. Use a color image as depthStencil attachment\n"
3843 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3844 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3845 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3846 " 6. Framebuffer attachment where dimensions don't match\n"
Cort Stratton8133ec22017-04-27 16:25:03 +02003847 " 7. Framebuffer attachment where dimensions don't match\n"
3848 " 8. Framebuffer attachment w/o identity swizzle\n"
3849 " 9. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003850
Tony Barbour1fa09702017-03-16 12:09:08 -06003851 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3853
Cort Stratton8133ec22017-04-27 16:25:03 +02003854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00404);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003855
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003856 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003857 VkAttachmentReference attach = {};
3858 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3859 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003860 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003861 VkRenderPassCreateInfo rpci = {};
3862 rpci.subpassCount = 1;
3863 rpci.pSubpasses = &subpass;
3864 rpci.attachmentCount = 1;
3865 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003866 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003867 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003868 rpci.pAttachments = &attach_desc;
3869 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3870 VkRenderPass rp;
3871 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3872 ASSERT_VK_SUCCESS(err);
3873
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003874 VkImageView ivs[2];
3875 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3876 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003877 VkFramebufferCreateInfo fb_info = {};
3878 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3879 fb_info.pNext = NULL;
3880 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003881 // Set mis-matching attachmentCount
3882 fb_info.attachmentCount = 2;
3883 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003884 fb_info.width = 100;
3885 fb_info.height = 100;
3886 fb_info.layers = 1;
3887
3888 VkFramebuffer fb;
3889 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3890
3891 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 if (err == VK_SUCCESS) {
3893 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3894 }
3895 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003896
3897 // Create a renderPass with a depth-stencil attachment created with
3898 // IMAGE_USAGE_COLOR_ATTACHMENT
3899 // Add our color attachment to pDepthStencilAttachment
3900 subpass.pDepthStencilAttachment = &attach;
3901 subpass.pColorAttachments = NULL;
3902 VkRenderPass rp_ds;
3903 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3904 ASSERT_VK_SUCCESS(err);
3905 // Set correct attachment count, but attachment has COLOR usage bit set
3906 fb_info.attachmentCount = 1;
3907 fb_info.renderPass = rp_ds;
3908
Cort Stratton8133ec22017-04-27 16:25:03 +02003909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00406);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003910 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3911
3912 m_errorMonitor->VerifyFound();
3913 if (err == VK_SUCCESS) {
3914 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3915 }
3916 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003917
3918 // Create new renderpass with alternate attachment format from fb
3919 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3920 subpass.pDepthStencilAttachment = NULL;
3921 subpass.pColorAttachments = &attach;
3922 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3923 ASSERT_VK_SUCCESS(err);
3924
3925 // Cause error due to mis-matched formats between rp & fb
3926 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3927 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00408);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003929 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3930
3931 m_errorMonitor->VerifyFound();
3932 if (err == VK_SUCCESS) {
3933 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3934 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003935 vkDestroyRenderPass(m_device->device(), rp, NULL);
3936
3937 // Create new renderpass with alternate sample count from fb
3938 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3939 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3940 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3941 ASSERT_VK_SUCCESS(err);
3942
3943 // Cause error due to mis-matched sample count between rp & fb
3944 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00409);
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003946 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3947
3948 m_errorMonitor->VerifyFound();
3949 if (err == VK_SUCCESS) {
3950 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3951 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003952
3953 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003954
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003955 {
3956 // Create an image with 2 mip levels.
3957 VkImageObj image(m_device);
3958 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3959 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003960
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003961 // Create a image view with two mip levels.
3962 VkImageView view;
3963 VkImageViewCreateInfo ivci = {};
3964 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3965 ivci.image = image.handle();
3966 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3967 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3968 ivci.subresourceRange.layerCount = 1;
3969 ivci.subresourceRange.baseMipLevel = 0;
3970 // Set level count to 2 (only 1 is allowed for FB attachment)
3971 ivci.subresourceRange.levelCount = 2;
3972 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3973 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3974 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003975
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003976 // Re-create renderpass to have matching sample count
3977 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3978 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3979 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003981 fb_info.renderPass = rp;
3982 fb_info.pAttachments = &view;
Cort Stratton8133ec22017-04-27 16:25:03 +02003983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00411);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003984 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3985
3986 m_errorMonitor->VerifyFound();
3987 if (err == VK_SUCCESS) {
3988 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3989 }
3990 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003991 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003992
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003993 // Update view to original color buffer and grow FB dimensions too big
3994 fb_info.pAttachments = ivs;
3995 fb_info.height = 1024;
3996 fb_info.width = 1024;
3997 fb_info.layers = 2;
Cort Stratton8133ec22017-04-27 16:25:03 +02003998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003999 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4000
4001 m_errorMonitor->VerifyFound();
4002 if (err == VK_SUCCESS) {
4003 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4004 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004005
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004006 {
4007 // Create an image with one mip level.
4008 VkImageObj image(m_device);
4009 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4010 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004011
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004012 // Create view attachment with non-identity swizzle
4013 VkImageView view;
4014 VkImageViewCreateInfo ivci = {};
4015 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4016 ivci.image = image.handle();
4017 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4018 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4019 ivci.subresourceRange.layerCount = 1;
4020 ivci.subresourceRange.baseMipLevel = 0;
4021 ivci.subresourceRange.levelCount = 1;
4022 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4023 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4024 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4025 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4026 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4027 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4028 ASSERT_VK_SUCCESS(err);
4029
4030 fb_info.pAttachments = &view;
4031 fb_info.height = 100;
4032 fb_info.width = 100;
4033 fb_info.layers = 1;
4034
Cort Stratton8133ec22017-04-27 16:25:03 +02004035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00412);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004036 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4037
4038 m_errorMonitor->VerifyFound();
4039 if (err == VK_SUCCESS) {
4040 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4041 }
4042 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004043 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004044
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004045 // reset attachment to color attachment
4046 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004047
4048 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004049 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004050 fb_info.height = 100;
4051 fb_info.layers = 1;
4052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Cort Stratton8133ec22017-04-27 16:25:03 +02004053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004054 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004055 m_errorMonitor->VerifyFound();
4056 if (err == VK_SUCCESS) {
4057 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4058 }
4059 // and width=0
4060 fb_info.width = 0;
4061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02806);
4062 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004063 m_errorMonitor->VerifyFound();
4064 if (err == VK_SUCCESS) {
4065 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4066 }
4067
4068 // Request fb that exceeds max height
4069 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004070 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004071 fb_info.layers = 1;
4072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Cort Stratton8133ec22017-04-27 16:25:03 +02004073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004074 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004075 m_errorMonitor->VerifyFound();
4076 if (err == VK_SUCCESS) {
4077 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4078 }
4079 // and height=0
4080 fb_info.height = 0;
4081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02807);
4082 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004083 m_errorMonitor->VerifyFound();
4084 if (err == VK_SUCCESS) {
4085 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4086 }
4087
4088 // Request fb that exceeds max layers
4089 fb_info.width = 100;
4090 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004091 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Cort Stratton8133ec22017-04-27 16:25:03 +02004093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004094 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004095 m_errorMonitor->VerifyFound();
4096 if (err == VK_SUCCESS) {
4097 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4098 }
4099 // and layers=0
4100 fb_info.layers = 0;
4101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02808);
4102 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinski33826372017-04-13 11:10:11 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Mark Lobodzinski33826372017-04-13 11:10:11 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinski33826372017-04-13 11:10:11 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005060 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005194 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005195 subpass.pColorAttachments = &attach;
5196 VkRenderPassCreateInfo rpci = {};
5197 rpci.subpassCount = 1;
5198 rpci.pSubpasses = &subpass;
5199 rpci.attachmentCount = 1;
5200 VkAttachmentDescription attach_desc = {};
5201 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5202 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5203 rpci.pAttachments = &attach_desc;
5204 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5205 VkRenderPass rp;
5206 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5207 ASSERT_VK_SUCCESS(err);
5208
5209 // Create a pipeline that uses the given renderpass
5210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5212
5213 VkPipelineLayout pipeline_layout;
5214 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5215 ASSERT_VK_SUCCESS(err);
5216
5217 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5218 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005220 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005221 vp_state_ci.pViewports = &vp;
5222 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005223 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 vp_state_ci.pScissors = &scissors;
5225
5226 VkPipelineShaderStageCreateInfo shaderStages[2];
5227 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5228
5229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005230 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005231 // but add it to be able to run on more devices
5232 shaderStages[0] = vs.GetStageCreateInfo();
5233 shaderStages[1] = fs.GetStageCreateInfo();
5234
5235 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5236 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5237
5238 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5239 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5240 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5241
5242 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5243 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5244 rs_ci.rasterizerDiscardEnable = true;
5245 rs_ci.lineWidth = 1.0f;
5246
5247 VkPipelineColorBlendAttachmentState att = {};
5248 att.blendEnable = VK_FALSE;
5249 att.colorWriteMask = 0xf;
5250
5251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5253 cb_ci.attachmentCount = 1;
5254 cb_ci.pAttachments = &att;
5255
5256 VkGraphicsPipelineCreateInfo gp_ci = {};
5257 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5258 gp_ci.stageCount = 2;
5259 gp_ci.pStages = shaderStages;
5260 gp_ci.pVertexInputState = &vi_ci;
5261 gp_ci.pInputAssemblyState = &ia_ci;
5262 gp_ci.pViewportState = &vp_state_ci;
5263 gp_ci.pRasterizationState = &rs_ci;
5264 gp_ci.pColorBlendState = &cb_ci;
5265 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5266 gp_ci.layout = pipeline_layout;
5267 gp_ci.renderPass = rp;
5268
5269 VkPipelineCacheCreateInfo pc_ci = {};
5270 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5271
Dave Houlton756e6742017-03-23 14:33:22 -06005272 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 VkPipeline pipeline;
5274 VkPipelineCache pipe_cache;
5275 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5276 ASSERT_VK_SUCCESS(err);
5277
5278 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5279 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005280
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005281 // Bind pipeline to cmd buffer, will also bind renderpass
5282 m_commandBuffer->BeginCommandBuffer();
5283 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5284 m_commandBuffer->EndCommandBuffer();
5285
5286 VkSubmitInfo submit_info = {};
5287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5288 submit_info.commandBufferCount = 1;
5289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5290 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005291 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005292
5293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5294 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5295 m_errorMonitor->VerifyFound();
5296
5297 // Wait for queue to complete so we can safely destroy everything
5298 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005299 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005300 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005301 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5302 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5303 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5304 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5305}
5306
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005307TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005308 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005310
5311 VkImage image;
5312 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5313 VkImageCreateInfo image_create_info = {};
5314 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5315 image_create_info.pNext = NULL;
5316 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5317 image_create_info.format = tex_format;
5318 image_create_info.extent.width = 32;
5319 image_create_info.extent.height = 32;
5320 image_create_info.extent.depth = 1;
5321 image_create_info.mipLevels = 1;
5322 image_create_info.arrayLayers = 1;
5323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5324 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005326 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005327 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005328 ASSERT_VK_SUCCESS(err);
5329 // Have to bind memory to image before recording cmd in cmd buffer using it
5330 VkMemoryRequirements mem_reqs;
5331 VkDeviceMemory image_mem;
5332 bool pass;
5333 VkMemoryAllocateInfo mem_alloc = {};
5334 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5335 mem_alloc.pNext = NULL;
5336 mem_alloc.memoryTypeIndex = 0;
5337 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5338 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005339 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340 ASSERT_TRUE(pass);
5341 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5342 ASSERT_VK_SUCCESS(err);
5343
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005344 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005346 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005347
5348 m_commandBuffer->BeginCommandBuffer();
5349 VkClearColorValue ccv;
5350 ccv.float32[0] = 1.0f;
5351 ccv.float32[1] = 1.0f;
5352 ccv.float32[2] = 1.0f;
5353 ccv.float32[3] = 1.0f;
5354 VkImageSubresourceRange isr = {};
5355 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5356 isr.baseArrayLayer = 0;
5357 isr.baseMipLevel = 0;
5358 isr.layerCount = 1;
5359 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005360 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005361 m_commandBuffer->EndCommandBuffer();
5362
5363 m_errorMonitor->VerifyFound();
5364 vkDestroyImage(m_device->device(), image, NULL);
5365 vkFreeMemory(m_device->device(), image_mem, nullptr);
5366}
5367
5368TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005371
5372 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005373 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005374 VK_IMAGE_TILING_OPTIMAL, 0);
5375 ASSERT_TRUE(image.initialized());
5376
5377 VkBuffer buffer;
5378 VkDeviceMemory mem;
5379 VkMemoryRequirements mem_reqs;
5380
5381 VkBufferCreateInfo buf_info = {};
5382 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005383 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005384 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005385 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5386 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5387 ASSERT_VK_SUCCESS(err);
5388
5389 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5390
5391 VkMemoryAllocateInfo alloc_info = {};
5392 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005393 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005394 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005395 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005396 if (!pass) {
5397 vkDestroyBuffer(m_device->device(), buffer, NULL);
5398 return;
5399 }
5400 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5401 ASSERT_VK_SUCCESS(err);
5402
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005403 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005405 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005406 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005407 region.bufferRowLength = 16;
5408 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005409 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5410
5411 region.imageSubresource.layerCount = 1;
5412 region.imageExtent.height = 4;
5413 region.imageExtent.width = 4;
5414 region.imageExtent.depth = 1;
5415 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005416 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5417 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005418 m_commandBuffer->EndCommandBuffer();
5419
5420 m_errorMonitor->VerifyFound();
5421
5422 vkDestroyBuffer(m_device->device(), buffer, NULL);
5423 vkFreeMemory(m_device->handle(), mem, NULL);
5424}
5425
Tobin Ehlis85940f52016-07-07 16:57:21 -06005426TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005427 TEST_DESCRIPTION(
5428 "Attempt to draw with a command buffer that is invalid "
5429 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005431
5432 VkEvent event;
5433 VkEventCreateInfo evci = {};
5434 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5435 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5436 ASSERT_VK_SUCCESS(result);
5437
5438 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005439 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005440 m_commandBuffer->EndCommandBuffer();
5441
Mark Lobodzinski33826372017-04-13 11:10:11 -06005442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005443 // Destroy event dependency prior to submit to cause ERROR
5444 vkDestroyEvent(m_device->device(), event, NULL);
5445
5446 VkSubmitInfo submit_info = {};
5447 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5448 submit_info.commandBufferCount = 1;
5449 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5450 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5451
5452 m_errorMonitor->VerifyFound();
5453}
5454
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005455TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005456 TEST_DESCRIPTION(
5457 "Attempt to draw with a command buffer that is invalid "
5458 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005459 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005460
5461 VkQueryPool query_pool;
5462 VkQueryPoolCreateInfo qpci{};
5463 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5464 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5465 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005466 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005467 ASSERT_VK_SUCCESS(result);
5468
5469 m_commandBuffer->BeginCommandBuffer();
5470 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5471 m_commandBuffer->EndCommandBuffer();
5472
Mark Lobodzinski33826372017-04-13 11:10:11 -06005473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005474 // Destroy query pool dependency prior to submit to cause ERROR
5475 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5476
5477 VkSubmitInfo submit_info = {};
5478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5479 submit_info.commandBufferCount = 1;
5480 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5482
5483 m_errorMonitor->VerifyFound();
5484}
5485
Tobin Ehlis24130d92016-07-08 15:50:53 -06005486TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005487 TEST_DESCRIPTION(
5488 "Attempt to draw with a command buffer that is invalid "
5489 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005490 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5492
5493 VkResult err;
5494
5495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5497
5498 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005500 ASSERT_VK_SUCCESS(err);
5501
5502 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5503 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5504 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005505 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005506 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005507 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005508 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005510
5511 VkPipelineShaderStageCreateInfo shaderStages[2];
5512 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5513
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005514 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005515 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005516 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005517 shaderStages[0] = vs.GetStageCreateInfo();
5518 shaderStages[1] = fs.GetStageCreateInfo();
5519
5520 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5521 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5522
5523 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5524 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5525 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5526
5527 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5528 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005529 rs_ci.rasterizerDiscardEnable = true;
5530 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005531
5532 VkPipelineColorBlendAttachmentState att = {};
5533 att.blendEnable = VK_FALSE;
5534 att.colorWriteMask = 0xf;
5535
5536 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5537 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5538 cb_ci.attachmentCount = 1;
5539 cb_ci.pAttachments = &att;
5540
5541 VkGraphicsPipelineCreateInfo gp_ci = {};
5542 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5543 gp_ci.stageCount = 2;
5544 gp_ci.pStages = shaderStages;
5545 gp_ci.pVertexInputState = &vi_ci;
5546 gp_ci.pInputAssemblyState = &ia_ci;
5547 gp_ci.pViewportState = &vp_state_ci;
5548 gp_ci.pRasterizationState = &rs_ci;
5549 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005550 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5551 gp_ci.layout = pipeline_layout;
5552 gp_ci.renderPass = renderPass();
5553
5554 VkPipelineCacheCreateInfo pc_ci = {};
5555 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5556
5557 VkPipeline pipeline;
5558 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005559 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005560 ASSERT_VK_SUCCESS(err);
5561
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005562 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005563 ASSERT_VK_SUCCESS(err);
5564
5565 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005566 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567 m_commandBuffer->EndCommandBuffer();
5568 // Now destroy pipeline in order to cause error when submitting
5569 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5570
Mark Lobodzinski33826372017-04-13 11:10:11 -06005571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005572
5573 VkSubmitInfo submit_info = {};
5574 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5575 submit_info.commandBufferCount = 1;
5576 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5578
5579 m_errorMonitor->VerifyFound();
5580 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5581 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5582}
5583
Tobin Ehlis31289162016-08-17 14:57:58 -06005584TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005585 TEST_DESCRIPTION(
5586 "Attempt to draw with a command buffer that is invalid "
5587 "due to a bound descriptor set with a buffer dependency "
5588 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005590 ASSERT_NO_FATAL_FAILURE(InitViewport());
5591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5592
5593 VkDescriptorPoolSize ds_type_count = {};
5594 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5595 ds_type_count.descriptorCount = 1;
5596
5597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5599 ds_pool_ci.pNext = NULL;
5600 ds_pool_ci.maxSets = 1;
5601 ds_pool_ci.poolSizeCount = 1;
5602 ds_pool_ci.pPoolSizes = &ds_type_count;
5603
5604 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSetLayoutBinding dsl_binding = {};
5609 dsl_binding.binding = 0;
5610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5611 dsl_binding.descriptorCount = 1;
5612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5613 dsl_binding.pImmutableSamplers = NULL;
5614
5615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5617 ds_layout_ci.pNext = NULL;
5618 ds_layout_ci.bindingCount = 1;
5619 ds_layout_ci.pBindings = &dsl_binding;
5620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSet descriptorSet;
5625 VkDescriptorSetAllocateInfo alloc_info = {};
5626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5627 alloc_info.descriptorSetCount = 1;
5628 alloc_info.descriptorPool = ds_pool;
5629 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5635 pipeline_layout_ci.pNext = NULL;
5636 pipeline_layout_ci.setLayoutCount = 1;
5637 pipeline_layout_ci.pSetLayouts = &ds_layout;
5638
5639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005641 ASSERT_VK_SUCCESS(err);
5642
5643 // Create a buffer to update the descriptor with
5644 uint32_t qfi = 0;
5645 VkBufferCreateInfo buffCI = {};
5646 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5647 buffCI.size = 1024;
5648 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5649 buffCI.queueFamilyIndexCount = 1;
5650 buffCI.pQueueFamilyIndices = &qfi;
5651
5652 VkBuffer buffer;
5653 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5654 ASSERT_VK_SUCCESS(err);
5655 // Allocate memory and bind to buffer so we can make it to the appropriate
5656 // error
5657 VkMemoryAllocateInfo mem_alloc = {};
5658 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5659 mem_alloc.pNext = NULL;
5660 mem_alloc.allocationSize = 1024;
5661 mem_alloc.memoryTypeIndex = 0;
5662
5663 VkMemoryRequirements memReqs;
5664 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005665 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005666 if (!pass) {
5667 vkDestroyBuffer(m_device->device(), buffer, NULL);
5668 return;
5669 }
5670
5671 VkDeviceMemory mem;
5672 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5673 ASSERT_VK_SUCCESS(err);
5674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5675 ASSERT_VK_SUCCESS(err);
5676 // Correctly update descriptor to avoid "NOT_UPDATED" error
5677 VkDescriptorBufferInfo buffInfo = {};
5678 buffInfo.buffer = buffer;
5679 buffInfo.offset = 0;
5680 buffInfo.range = 1024;
5681
5682 VkWriteDescriptorSet descriptor_write;
5683 memset(&descriptor_write, 0, sizeof(descriptor_write));
5684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5685 descriptor_write.dstSet = descriptorSet;
5686 descriptor_write.dstBinding = 0;
5687 descriptor_write.descriptorCount = 1;
5688 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5689 descriptor_write.pBufferInfo = &buffInfo;
5690
5691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5692
5693 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005694 char const *vsSource =
5695 "#version 450\n"
5696 "\n"
5697 "out gl_PerVertex { \n"
5698 " vec4 gl_Position;\n"
5699 "};\n"
5700 "void main(){\n"
5701 " gl_Position = vec4(1);\n"
5702 "}\n";
5703 char const *fsSource =
5704 "#version 450\n"
5705 "\n"
5706 "layout(location=0) out vec4 x;\n"
5707 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5708 "void main(){\n"
5709 " x = vec4(bar.y);\n"
5710 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5713 VkPipelineObj pipe(m_device);
5714 pipe.AddShader(&vs);
5715 pipe.AddShader(&fs);
5716 pipe.AddColorAttachment();
5717 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5718
Tony Barbour552f6c02016-12-21 14:34:07 -07005719 m_commandBuffer->BeginCommandBuffer();
5720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005721 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5722 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5723 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005724
5725 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5726 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5727
Tobin Ehlis31289162016-08-17 14:57:58 -06005728 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005729 m_commandBuffer->EndRenderPass();
5730 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005732 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5733 vkDestroyBuffer(m_device->device(), buffer, NULL);
5734 // Attempt to submit cmd buffer
5735 VkSubmitInfo submit_info = {};
5736 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5737 submit_info.commandBufferCount = 1;
5738 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5740 m_errorMonitor->VerifyFound();
5741 // Cleanup
5742 vkFreeMemory(m_device->device(), mem, NULL);
5743
5744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5747}
5748
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005749TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005750 TEST_DESCRIPTION(
5751 "Attempt to draw with a command buffer that is invalid "
5752 "due to a bound descriptor sets with a combined image "
5753 "sampler having their image, sampler, and descriptor set "
5754 "each respectively destroyed and then attempting to "
5755 "submit associated cmd buffers. Attempt to destroy a "
5756 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005757 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005758 ASSERT_NO_FATAL_FAILURE(InitViewport());
5759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5760
5761 VkDescriptorPoolSize ds_type_count = {};
5762 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5763 ds_type_count.descriptorCount = 1;
5764
5765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5767 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005768 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005769 ds_pool_ci.maxSets = 1;
5770 ds_pool_ci.poolSizeCount = 1;
5771 ds_pool_ci.pPoolSizes = &ds_type_count;
5772
5773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005775 ASSERT_VK_SUCCESS(err);
5776
5777 VkDescriptorSetLayoutBinding dsl_binding = {};
5778 dsl_binding.binding = 0;
5779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5780 dsl_binding.descriptorCount = 1;
5781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5782 dsl_binding.pImmutableSamplers = NULL;
5783
5784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5786 ds_layout_ci.pNext = NULL;
5787 ds_layout_ci.bindingCount = 1;
5788 ds_layout_ci.pBindings = &dsl_binding;
5789 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 ASSERT_VK_SUCCESS(err);
5792
5793 VkDescriptorSet descriptorSet;
5794 VkDescriptorSetAllocateInfo alloc_info = {};
5795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5796 alloc_info.descriptorSetCount = 1;
5797 alloc_info.descriptorPool = ds_pool;
5798 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_VK_SUCCESS(err);
5801
5802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5804 pipeline_layout_ci.pNext = NULL;
5805 pipeline_layout_ci.setLayoutCount = 1;
5806 pipeline_layout_ci.pSetLayouts = &ds_layout;
5807
5808 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005810 ASSERT_VK_SUCCESS(err);
5811
5812 // Create images to update the descriptor with
5813 VkImage image;
5814 VkImage image2;
5815 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5816 const int32_t tex_width = 32;
5817 const int32_t tex_height = 32;
5818 VkImageCreateInfo image_create_info = {};
5819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5820 image_create_info.pNext = NULL;
5821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5822 image_create_info.format = tex_format;
5823 image_create_info.extent.width = tex_width;
5824 image_create_info.extent.height = tex_height;
5825 image_create_info.extent.depth = 1;
5826 image_create_info.mipLevels = 1;
5827 image_create_info.arrayLayers = 1;
5828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5831 image_create_info.flags = 0;
5832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5833 ASSERT_VK_SUCCESS(err);
5834 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5835 ASSERT_VK_SUCCESS(err);
5836
5837 VkMemoryRequirements memory_reqs;
5838 VkDeviceMemory image_memory;
5839 bool pass;
5840 VkMemoryAllocateInfo memory_info = {};
5841 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5842 memory_info.pNext = NULL;
5843 memory_info.allocationSize = 0;
5844 memory_info.memoryTypeIndex = 0;
5845 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5846 // Allocate enough memory for both images
5847 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005848 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005849 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005850 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005851 ASSERT_VK_SUCCESS(err);
5852 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5853 ASSERT_VK_SUCCESS(err);
5854 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005856 ASSERT_VK_SUCCESS(err);
5857
5858 VkImageViewCreateInfo image_view_create_info = {};
5859 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5860 image_view_create_info.image = image;
5861 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5862 image_view_create_info.format = tex_format;
5863 image_view_create_info.subresourceRange.layerCount = 1;
5864 image_view_create_info.subresourceRange.baseMipLevel = 0;
5865 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005866 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005867
5868 VkImageView view;
5869 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005870 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005871 ASSERT_VK_SUCCESS(err);
5872 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005874 ASSERT_VK_SUCCESS(err);
5875 // Create Samplers
5876 VkSamplerCreateInfo sampler_ci = {};
5877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5878 sampler_ci.pNext = NULL;
5879 sampler_ci.magFilter = VK_FILTER_NEAREST;
5880 sampler_ci.minFilter = VK_FILTER_NEAREST;
5881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5885 sampler_ci.mipLodBias = 1.0;
5886 sampler_ci.anisotropyEnable = VK_FALSE;
5887 sampler_ci.maxAnisotropy = 1;
5888 sampler_ci.compareEnable = VK_FALSE;
5889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5890 sampler_ci.minLod = 1.0;
5891 sampler_ci.maxLod = 1.0;
5892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5894 VkSampler sampler;
5895 VkSampler sampler2;
5896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5897 ASSERT_VK_SUCCESS(err);
5898 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5899 ASSERT_VK_SUCCESS(err);
5900 // Update descriptor with image and sampler
5901 VkDescriptorImageInfo img_info = {};
5902 img_info.sampler = sampler;
5903 img_info.imageView = view;
5904 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5905
5906 VkWriteDescriptorSet descriptor_write;
5907 memset(&descriptor_write, 0, sizeof(descriptor_write));
5908 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5909 descriptor_write.dstSet = descriptorSet;
5910 descriptor_write.dstBinding = 0;
5911 descriptor_write.descriptorCount = 1;
5912 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5913 descriptor_write.pImageInfo = &img_info;
5914
5915 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5916
5917 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005918 char const *vsSource =
5919 "#version 450\n"
5920 "\n"
5921 "out gl_PerVertex { \n"
5922 " vec4 gl_Position;\n"
5923 "};\n"
5924 "void main(){\n"
5925 " gl_Position = vec4(1);\n"
5926 "}\n";
5927 char const *fsSource =
5928 "#version 450\n"
5929 "\n"
5930 "layout(set=0, binding=0) uniform sampler2D s;\n"
5931 "layout(location=0) out vec4 x;\n"
5932 "void main(){\n"
5933 " x = texture(s, vec2(1));\n"
5934 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5937 VkPipelineObj pipe(m_device);
5938 pipe.AddShader(&vs);
5939 pipe.AddShader(&fs);
5940 pipe.AddColorAttachment();
5941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5942
5943 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005945 m_commandBuffer->BeginCommandBuffer();
5946 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005947 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5948 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5949 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005950 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5951 VkRect2D scissor = {{0, 0}, {16, 16}};
5952 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5953 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005954 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005955 m_commandBuffer->EndRenderPass();
5956 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005957 // Destroy sampler invalidates the cmd buffer, causing error on submit
5958 vkDestroySampler(m_device->device(), sampler, NULL);
5959 // Attempt to submit cmd buffer
5960 VkSubmitInfo submit_info = {};
5961 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5962 submit_info.commandBufferCount = 1;
5963 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5965 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005966
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005967 // Now re-update descriptor with valid sampler and delete image
5968 img_info.sampler = sampler2;
5969 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005970
5971 VkCommandBufferBeginInfo info = {};
5972 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5973 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5974
Mark Lobodzinski33826372017-04-13 11:10:11 -06005975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005976 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005977 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005978 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5979 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5980 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005981 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5982 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005983 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005984 m_commandBuffer->EndRenderPass();
5985 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005986 // Destroy image invalidates the cmd buffer, causing error on submit
5987 vkDestroyImage(m_device->device(), image, NULL);
5988 // Attempt to submit cmd buffer
5989 submit_info = {};
5990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5991 submit_info.commandBufferCount = 1;
5992 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5994 m_errorMonitor->VerifyFound();
5995 // Now update descriptor to be valid, but then free descriptor
5996 img_info.imageView = view2;
5997 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005998 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005999 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006000 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6001 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6002 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006003 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6004 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006005 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006006 m_commandBuffer->EndRenderPass();
6007 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006009
6010 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006012 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006013 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006014
6015 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006016 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006017 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006018 m_errorMonitor->SetUnexpectedError(
6019 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6020 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006021 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006022 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6023
6024 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006030 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6031 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006032
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006033 // Cleanup
6034 vkFreeMemory(m_device->device(), image_memory, NULL);
6035 vkDestroySampler(m_device->device(), sampler2, NULL);
6036 vkDestroyImage(m_device->device(), image2, NULL);
6037 vkDestroyImageView(m_device->device(), view, NULL);
6038 vkDestroyImageView(m_device->device(), view2, NULL);
6039 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6042}
6043
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006044TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6045 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6046 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6047 ASSERT_NO_FATAL_FAILURE(InitViewport());
6048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6049
6050 VkDescriptorPoolSize ds_type_count = {};
6051 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6052 ds_type_count.descriptorCount = 1;
6053
6054 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6055 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6056 ds_pool_ci.pNext = NULL;
6057 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6058 ds_pool_ci.maxSets = 1;
6059 ds_pool_ci.poolSizeCount = 1;
6060 ds_pool_ci.pPoolSizes = &ds_type_count;
6061
6062 VkDescriptorPool ds_pool;
6063 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6064 ASSERT_VK_SUCCESS(err);
6065
6066 VkDescriptorSetLayoutBinding dsl_binding = {};
6067 dsl_binding.binding = 0;
6068 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6069 dsl_binding.descriptorCount = 1;
6070 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6071 dsl_binding.pImmutableSamplers = NULL;
6072
6073 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6074 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6075 ds_layout_ci.pNext = NULL;
6076 ds_layout_ci.bindingCount = 1;
6077 ds_layout_ci.pBindings = &dsl_binding;
6078 VkDescriptorSetLayout ds_layout;
6079 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6080 ASSERT_VK_SUCCESS(err);
6081
6082 VkDescriptorSet descriptorSet;
6083 VkDescriptorSetAllocateInfo alloc_info = {};
6084 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6085 alloc_info.descriptorSetCount = 1;
6086 alloc_info.descriptorPool = ds_pool;
6087 alloc_info.pSetLayouts = &ds_layout;
6088 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6089 ASSERT_VK_SUCCESS(err);
6090
6091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6093 pipeline_layout_ci.pNext = NULL;
6094 pipeline_layout_ci.setLayoutCount = 1;
6095 pipeline_layout_ci.pSetLayouts = &ds_layout;
6096
6097 VkPipelineLayout pipeline_layout;
6098 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6099 ASSERT_VK_SUCCESS(err);
6100
6101 // Create images to update the descriptor with
6102 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6103 VkImageObj image(m_device);
6104 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6105 0);
6106 ASSERT_TRUE(image.initialized());
6107
6108 VkImageViewCreateInfo image_view_create_info = {};
6109 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6110 image_view_create_info.image = image.handle();
6111 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6112 image_view_create_info.format = format;
6113 image_view_create_info.subresourceRange.layerCount = 1;
6114 image_view_create_info.subresourceRange.baseMipLevel = 0;
6115 image_view_create_info.subresourceRange.levelCount = 1;
6116 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6117
6118 VkImageView view;
6119 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6120 ASSERT_VK_SUCCESS(err);
6121 // Create Sampler
6122 VkSamplerCreateInfo sampler_ci = {};
6123 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6124 sampler_ci.pNext = NULL;
6125 sampler_ci.magFilter = VK_FILTER_NEAREST;
6126 sampler_ci.minFilter = VK_FILTER_NEAREST;
6127 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6128 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6129 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6130 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6131 sampler_ci.mipLodBias = 1.0;
6132 sampler_ci.anisotropyEnable = VK_FALSE;
6133 sampler_ci.maxAnisotropy = 1;
6134 sampler_ci.compareEnable = VK_FALSE;
6135 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6136 sampler_ci.minLod = 1.0;
6137 sampler_ci.maxLod = 1.0;
6138 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6139 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6140 VkSampler sampler;
6141 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6142 ASSERT_VK_SUCCESS(err);
6143 // Update descriptor with image and sampler
6144 VkDescriptorImageInfo img_info = {};
6145 img_info.sampler = sampler;
6146 img_info.imageView = view;
6147 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6148 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6149
6150 VkWriteDescriptorSet descriptor_write;
6151 memset(&descriptor_write, 0, sizeof(descriptor_write));
6152 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6153 descriptor_write.dstSet = descriptorSet;
6154 descriptor_write.dstBinding = 0;
6155 descriptor_write.descriptorCount = 1;
6156 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6157 descriptor_write.pImageInfo = &img_info;
6158
6159 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6160
6161 // Create PSO to be used for draw-time errors below
6162 char const *vsSource =
6163 "#version 450\n"
6164 "\n"
6165 "out gl_PerVertex { \n"
6166 " vec4 gl_Position;\n"
6167 "};\n"
6168 "void main(){\n"
6169 " gl_Position = vec4(1);\n"
6170 "}\n";
6171 char const *fsSource =
6172 "#version 450\n"
6173 "\n"
6174 "layout(set=0, binding=0) uniform sampler2D s;\n"
6175 "layout(location=0) out vec4 x;\n"
6176 "void main(){\n"
6177 " x = texture(s, vec2(1));\n"
6178 "}\n";
6179 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6180 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6181 VkPipelineObj pipe(m_device);
6182 pipe.AddShader(&vs);
6183 pipe.AddShader(&fs);
6184 pipe.AddColorAttachment();
6185 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6186
6187 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6188 cmd_buf.BeginCommandBuffer();
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006189 // record layout different than actual descriptor layout of SHADER_RO
6190 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski95512b72017-05-10 12:21:30 -06006191 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006192 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6193 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6194 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6195 VkRect2D scissor = {{0, 0}, {16, 16}};
6196 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6197 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6198 // At draw time the update layout will mis-match the actual layout
6199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6200 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6201 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6202 m_errorMonitor->SetDesiredFailureMsg(
6203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6204 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6205 cmd_buf.Draw(1, 0, 0, 0);
6206 m_errorMonitor->VerifyFound();
6207 cmd_buf.EndRenderPass();
6208 cmd_buf.EndCommandBuffer();
6209 // Submit cmd buffer
6210 VkSubmitInfo submit_info = {};
6211 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6212 submit_info.commandBufferCount = 1;
6213 submit_info.pCommandBuffers = &cmd_buf.handle();
6214 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6215 vkQueueWaitIdle(m_device->m_queue);
6216 // Cleanup
6217 vkDestroySampler(m_device->device(), sampler, NULL);
6218 vkDestroyImageView(m_device->device(), view, NULL);
6219 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6221 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6222}
6223
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006224TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6225 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006226 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006227 ASSERT_NO_FATAL_FAILURE(InitViewport());
6228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6229
6230 VkDescriptorPoolSize ds_type_count = {};
6231 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6232 ds_type_count.descriptorCount = 1;
6233
6234 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6235 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6236 ds_pool_ci.pNext = NULL;
6237 ds_pool_ci.maxSets = 1;
6238 ds_pool_ci.poolSizeCount = 1;
6239 ds_pool_ci.pPoolSizes = &ds_type_count;
6240
6241 VkDescriptorPool ds_pool;
6242 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6243 ASSERT_VK_SUCCESS(err);
6244
6245 VkDescriptorSetLayoutBinding dsl_binding = {};
6246 dsl_binding.binding = 0;
6247 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6248 dsl_binding.descriptorCount = 1;
6249 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6250 dsl_binding.pImmutableSamplers = NULL;
6251
6252 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6253 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6254 ds_layout_ci.pNext = NULL;
6255 ds_layout_ci.bindingCount = 1;
6256 ds_layout_ci.pBindings = &dsl_binding;
6257 VkDescriptorSetLayout ds_layout;
6258 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6259 ASSERT_VK_SUCCESS(err);
6260
6261 VkDescriptorSet descriptor_set;
6262 VkDescriptorSetAllocateInfo alloc_info = {};
6263 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6264 alloc_info.descriptorSetCount = 1;
6265 alloc_info.descriptorPool = ds_pool;
6266 alloc_info.pSetLayouts = &ds_layout;
6267 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6268 ASSERT_VK_SUCCESS(err);
6269
6270 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6271 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6272 pipeline_layout_ci.pNext = NULL;
6273 pipeline_layout_ci.setLayoutCount = 1;
6274 pipeline_layout_ci.pSetLayouts = &ds_layout;
6275
6276 VkPipelineLayout pipeline_layout;
6277 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6278 ASSERT_VK_SUCCESS(err);
6279
6280 // Create image to update the descriptor with
6281 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006282 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006283 ASSERT_TRUE(image.initialized());
6284
6285 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6286 // Create Sampler
6287 VkSamplerCreateInfo sampler_ci = {};
6288 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6289 sampler_ci.pNext = NULL;
6290 sampler_ci.magFilter = VK_FILTER_NEAREST;
6291 sampler_ci.minFilter = VK_FILTER_NEAREST;
6292 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6293 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6294 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6295 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6296 sampler_ci.mipLodBias = 1.0;
6297 sampler_ci.anisotropyEnable = VK_FALSE;
6298 sampler_ci.maxAnisotropy = 1;
6299 sampler_ci.compareEnable = VK_FALSE;
6300 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6301 sampler_ci.minLod = 1.0;
6302 sampler_ci.maxLod = 1.0;
6303 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6304 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6305 VkSampler sampler;
6306 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6307 ASSERT_VK_SUCCESS(err);
6308 // Update descriptor with image and sampler
6309 VkDescriptorImageInfo img_info = {};
6310 img_info.sampler = sampler;
6311 img_info.imageView = view;
6312 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6313
6314 VkWriteDescriptorSet descriptor_write;
6315 memset(&descriptor_write, 0, sizeof(descriptor_write));
6316 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6317 descriptor_write.dstSet = descriptor_set;
6318 descriptor_write.dstBinding = 0;
6319 descriptor_write.descriptorCount = 1;
6320 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6321 descriptor_write.pImageInfo = &img_info;
6322
6323 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6324
6325 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006326 char const *vsSource =
6327 "#version 450\n"
6328 "\n"
6329 "out gl_PerVertex { \n"
6330 " vec4 gl_Position;\n"
6331 "};\n"
6332 "void main(){\n"
6333 " gl_Position = vec4(1);\n"
6334 "}\n";
6335 char const *fsSource =
6336 "#version 450\n"
6337 "\n"
6338 "layout(set=0, binding=0) uniform sampler2D s;\n"
6339 "layout(location=0) out vec4 x;\n"
6340 "void main(){\n"
6341 " x = texture(s, vec2(1));\n"
6342 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006343 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6344 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6345 VkPipelineObj pipe(m_device);
6346 pipe.AddShader(&vs);
6347 pipe.AddShader(&fs);
6348 pipe.AddColorAttachment();
6349 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6350
Tony Barbour552f6c02016-12-21 14:34:07 -07006351 m_commandBuffer->BeginCommandBuffer();
6352 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006353 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6354 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6355 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006356
6357 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6358 VkRect2D scissor = {{0, 0}, {16, 16}};
6359 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6360 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6361
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006362 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006363 m_commandBuffer->EndRenderPass();
6364 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006365 // Submit cmd buffer to put pool in-flight
6366 VkSubmitInfo submit_info = {};
6367 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6368 submit_info.commandBufferCount = 1;
6369 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6370 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6371 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006373 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6374 m_errorMonitor->VerifyFound();
6375 vkQueueWaitIdle(m_device->m_queue);
6376 // Cleanup
6377 vkDestroySampler(m_device->device(), sampler, NULL);
6378 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006380 m_errorMonitor->SetUnexpectedError(
6381 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006382 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006383 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006384 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006385}
6386
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006387TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6388 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006389 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006390 ASSERT_NO_FATAL_FAILURE(InitViewport());
6391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6392
6393 VkDescriptorPoolSize ds_type_count = {};
6394 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6395 ds_type_count.descriptorCount = 1;
6396
6397 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6398 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6399 ds_pool_ci.pNext = NULL;
6400 ds_pool_ci.maxSets = 1;
6401 ds_pool_ci.poolSizeCount = 1;
6402 ds_pool_ci.pPoolSizes = &ds_type_count;
6403
6404 VkDescriptorPool ds_pool;
6405 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6406 ASSERT_VK_SUCCESS(err);
6407
6408 VkDescriptorSetLayoutBinding dsl_binding = {};
6409 dsl_binding.binding = 0;
6410 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6411 dsl_binding.descriptorCount = 1;
6412 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6413 dsl_binding.pImmutableSamplers = NULL;
6414
6415 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6416 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6417 ds_layout_ci.pNext = NULL;
6418 ds_layout_ci.bindingCount = 1;
6419 ds_layout_ci.pBindings = &dsl_binding;
6420 VkDescriptorSetLayout ds_layout;
6421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6422 ASSERT_VK_SUCCESS(err);
6423
6424 VkDescriptorSet descriptorSet;
6425 VkDescriptorSetAllocateInfo alloc_info = {};
6426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6427 alloc_info.descriptorSetCount = 1;
6428 alloc_info.descriptorPool = ds_pool;
6429 alloc_info.pSetLayouts = &ds_layout;
6430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6431 ASSERT_VK_SUCCESS(err);
6432
6433 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6434 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6435 pipeline_layout_ci.pNext = NULL;
6436 pipeline_layout_ci.setLayoutCount = 1;
6437 pipeline_layout_ci.pSetLayouts = &ds_layout;
6438
6439 VkPipelineLayout pipeline_layout;
6440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6441 ASSERT_VK_SUCCESS(err);
6442
6443 // Create images to update the descriptor with
6444 VkImage image;
6445 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6446 const int32_t tex_width = 32;
6447 const int32_t tex_height = 32;
6448 VkImageCreateInfo image_create_info = {};
6449 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6450 image_create_info.pNext = NULL;
6451 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6452 image_create_info.format = tex_format;
6453 image_create_info.extent.width = tex_width;
6454 image_create_info.extent.height = tex_height;
6455 image_create_info.extent.depth = 1;
6456 image_create_info.mipLevels = 1;
6457 image_create_info.arrayLayers = 1;
6458 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6459 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6460 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6461 image_create_info.flags = 0;
6462 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6463 ASSERT_VK_SUCCESS(err);
6464 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6465 VkMemoryRequirements memory_reqs;
6466 VkDeviceMemory image_memory;
6467 bool pass;
6468 VkMemoryAllocateInfo memory_info = {};
6469 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6470 memory_info.pNext = NULL;
6471 memory_info.allocationSize = 0;
6472 memory_info.memoryTypeIndex = 0;
6473 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6474 // Allocate enough memory for image
6475 memory_info.allocationSize = memory_reqs.size;
6476 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6477 ASSERT_TRUE(pass);
6478 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6479 ASSERT_VK_SUCCESS(err);
6480 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6481 ASSERT_VK_SUCCESS(err);
6482
6483 VkImageViewCreateInfo image_view_create_info = {};
6484 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6485 image_view_create_info.image = image;
6486 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6487 image_view_create_info.format = tex_format;
6488 image_view_create_info.subresourceRange.layerCount = 1;
6489 image_view_create_info.subresourceRange.baseMipLevel = 0;
6490 image_view_create_info.subresourceRange.levelCount = 1;
6491 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6492
6493 VkImageView view;
6494 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6495 ASSERT_VK_SUCCESS(err);
6496 // Create Samplers
6497 VkSamplerCreateInfo sampler_ci = {};
6498 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6499 sampler_ci.pNext = NULL;
6500 sampler_ci.magFilter = VK_FILTER_NEAREST;
6501 sampler_ci.minFilter = VK_FILTER_NEAREST;
6502 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6503 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6504 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6505 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6506 sampler_ci.mipLodBias = 1.0;
6507 sampler_ci.anisotropyEnable = VK_FALSE;
6508 sampler_ci.maxAnisotropy = 1;
6509 sampler_ci.compareEnable = VK_FALSE;
6510 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6511 sampler_ci.minLod = 1.0;
6512 sampler_ci.maxLod = 1.0;
6513 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6514 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6515 VkSampler sampler;
6516 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6517 ASSERT_VK_SUCCESS(err);
6518 // Update descriptor with image and sampler
6519 VkDescriptorImageInfo img_info = {};
6520 img_info.sampler = sampler;
6521 img_info.imageView = view;
6522 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6523
6524 VkWriteDescriptorSet descriptor_write;
6525 memset(&descriptor_write, 0, sizeof(descriptor_write));
6526 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6527 descriptor_write.dstSet = descriptorSet;
6528 descriptor_write.dstBinding = 0;
6529 descriptor_write.descriptorCount = 1;
6530 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6531 descriptor_write.pImageInfo = &img_info;
6532 // Break memory binding and attempt update
6533 vkFreeMemory(m_device->device(), image_memory, nullptr);
6534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006535 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6537 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6538 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6539 m_errorMonitor->VerifyFound();
6540 // Cleanup
6541 vkDestroyImage(m_device->device(), image, NULL);
6542 vkDestroySampler(m_device->device(), sampler, NULL);
6543 vkDestroyImageView(m_device->device(), view, NULL);
6544 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6545 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6547}
6548
Karl Schultz6addd812016-02-02 17:17:23 -07006549TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006550 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6551 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006552 // Create a valid cmd buffer
6553 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006554 uint64_t fake_pipeline_handle = 0xbaad6001;
6555 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006556 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6558
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006560 m_commandBuffer->BeginCommandBuffer();
6561 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006562 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006563 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006564
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006565 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006567 Draw(1, 0, 0, 0);
6568 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006569
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006570 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006572 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006573 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6574 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006575}
6576
Karl Schultz6addd812016-02-02 17:17:23 -07006577TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006578 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006579 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006582
Tony Barbour1fa09702017-03-16 12:09:08 -06006583 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006584 ASSERT_NO_FATAL_FAILURE(InitViewport());
6585 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006586 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6588 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006589
6590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6592 ds_pool_ci.pNext = NULL;
6593 ds_pool_ci.maxSets = 1;
6594 ds_pool_ci.poolSizeCount = 1;
6595 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006596
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006597 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006598 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006599 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006600
Tony Barboureb254902015-07-15 12:50:33 -06006601 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006602 dsl_binding.binding = 0;
6603 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6604 dsl_binding.descriptorCount = 1;
6605 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6606 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006607
Tony Barboureb254902015-07-15 12:50:33 -06006608 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006609 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6610 ds_layout_ci.pNext = NULL;
6611 ds_layout_ci.bindingCount = 1;
6612 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006613 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006614 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006615 ASSERT_VK_SUCCESS(err);
6616
6617 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006618 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006619 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006620 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006621 alloc_info.descriptorPool = ds_pool;
6622 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006624 ASSERT_VK_SUCCESS(err);
6625
Tony Barboureb254902015-07-15 12:50:33 -06006626 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6628 pipeline_layout_ci.pNext = NULL;
6629 pipeline_layout_ci.setLayoutCount = 1;
6630 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006631
6632 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006634 ASSERT_VK_SUCCESS(err);
6635
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006636 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006637 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006638 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006639 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006640
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006641 VkPipelineObj pipe(m_device);
6642 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006643 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006644 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006645 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006646
Tony Barbour552f6c02016-12-21 14:34:07 -07006647 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006648 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6649 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6650 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006651
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006652 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006653
Chia-I Wuf7458c52015-10-26 21:10:41 +08006654 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6655 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6656 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006657}
6658
Karl Schultz6addd812016-02-02 17:17:23 -07006659TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006660 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006661 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006662
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006664
Tony Barbour1fa09702017-03-16 12:09:08 -06006665 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006666 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006667 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6668 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006669
6670 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006671 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6672 ds_pool_ci.pNext = NULL;
6673 ds_pool_ci.maxSets = 1;
6674 ds_pool_ci.poolSizeCount = 1;
6675 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006676
6677 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006679 ASSERT_VK_SUCCESS(err);
6680
6681 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006682 dsl_binding.binding = 0;
6683 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6684 dsl_binding.descriptorCount = 1;
6685 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6686 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006687
6688 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006689 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6690 ds_layout_ci.pNext = NULL;
6691 ds_layout_ci.bindingCount = 1;
6692 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006693 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006694 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006695 ASSERT_VK_SUCCESS(err);
6696
6697 VkDescriptorSet descriptorSet;
6698 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006700 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006701 alloc_info.descriptorPool = ds_pool;
6702 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006704 ASSERT_VK_SUCCESS(err);
6705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006706 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006707 VkWriteDescriptorSet descriptor_write;
6708 memset(&descriptor_write, 0, sizeof(descriptor_write));
6709 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6710 descriptor_write.dstSet = descriptorSet;
6711 descriptor_write.dstBinding = 0;
6712 descriptor_write.descriptorCount = 1;
6713 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6714 descriptor_write.pTexelBufferView = &view;
6715
6716 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6717
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006718 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006719
6720 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6721 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6722}
6723
Mark Youngd339ba32016-05-30 13:28:35 -06006724TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006725 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006726
6727 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006729 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006730
Tony Barbour1fa09702017-03-16 12:09:08 -06006731 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006732
6733 // Create a buffer with no bound memory and then attempt to create
6734 // a buffer view.
6735 VkBufferCreateInfo buff_ci = {};
6736 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006737 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006738 buff_ci.size = 256;
6739 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6740 VkBuffer buffer;
6741 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6742 ASSERT_VK_SUCCESS(err);
6743
6744 VkBufferViewCreateInfo buff_view_ci = {};
6745 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6746 buff_view_ci.buffer = buffer;
6747 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6748 buff_view_ci.range = VK_WHOLE_SIZE;
6749 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006750 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006751
6752 m_errorMonitor->VerifyFound();
6753 vkDestroyBuffer(m_device->device(), buffer, NULL);
6754 // If last error is success, it still created the view, so delete it.
6755 if (err == VK_SUCCESS) {
6756 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6757 }
6758}
6759
Karl Schultz6addd812016-02-02 17:17:23 -07006760TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6761 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6762 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006763 // 1. No dynamicOffset supplied
6764 // 2. Too many dynamicOffsets supplied
6765 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006766 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6768 " requires 1 dynamicOffsets, but only "
6769 "0 dynamicOffsets are left in "
6770 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006771
Tony Barbour1fa09702017-03-16 12:09:08 -06006772 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006773 ASSERT_NO_FATAL_FAILURE(InitViewport());
6774 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6775
6776 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006777 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6778 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006779
6780 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006781 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6782 ds_pool_ci.pNext = NULL;
6783 ds_pool_ci.maxSets = 1;
6784 ds_pool_ci.poolSizeCount = 1;
6785 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006786
6787 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006788 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006789 ASSERT_VK_SUCCESS(err);
6790
6791 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006792 dsl_binding.binding = 0;
6793 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6794 dsl_binding.descriptorCount = 1;
6795 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6796 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006797
6798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6800 ds_layout_ci.pNext = NULL;
6801 ds_layout_ci.bindingCount = 1;
6802 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006803 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006805 ASSERT_VK_SUCCESS(err);
6806
6807 VkDescriptorSet descriptorSet;
6808 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006809 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006810 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006811 alloc_info.descriptorPool = ds_pool;
6812 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006813 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006814 ASSERT_VK_SUCCESS(err);
6815
6816 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6818 pipeline_layout_ci.pNext = NULL;
6819 pipeline_layout_ci.setLayoutCount = 1;
6820 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006821
6822 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006823 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006824 ASSERT_VK_SUCCESS(err);
6825
6826 // Create a buffer to update the descriptor with
6827 uint32_t qfi = 0;
6828 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006829 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6830 buffCI.size = 1024;
6831 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6832 buffCI.queueFamilyIndexCount = 1;
6833 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006834
6835 VkBuffer dyub;
6836 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6837 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006838 // Allocate memory and bind to buffer so we can make it to the appropriate
6839 // error
6840 VkMemoryAllocateInfo mem_alloc = {};
6841 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6842 mem_alloc.pNext = NULL;
6843 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006844 mem_alloc.memoryTypeIndex = 0;
6845
6846 VkMemoryRequirements memReqs;
6847 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006848 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006849 if (!pass) {
6850 vkDestroyBuffer(m_device->device(), dyub, NULL);
6851 return;
6852 }
6853
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006854 VkDeviceMemory mem;
6855 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6856 ASSERT_VK_SUCCESS(err);
6857 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6858 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006859 // Correctly update descriptor to avoid "NOT_UPDATED" error
6860 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006861 buffInfo.buffer = dyub;
6862 buffInfo.offset = 0;
6863 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006864
6865 VkWriteDescriptorSet descriptor_write;
6866 memset(&descriptor_write, 0, sizeof(descriptor_write));
6867 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6868 descriptor_write.dstSet = descriptorSet;
6869 descriptor_write.dstBinding = 0;
6870 descriptor_write.descriptorCount = 1;
6871 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6872 descriptor_write.pBufferInfo = &buffInfo;
6873
6874 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6875
Tony Barbour552f6c02016-12-21 14:34:07 -07006876 m_commandBuffer->BeginCommandBuffer();
6877 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006878 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6879 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006880 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006881 uint32_t pDynOff[2] = {512, 756};
6882 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6884 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6885 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6886 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006887 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006888 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6890 " dynamic offset 512 combined with "
6891 "offset 0 and range 1024 that "
6892 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006893 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006894 char const *vsSource =
6895 "#version 450\n"
6896 "\n"
6897 "out gl_PerVertex { \n"
6898 " vec4 gl_Position;\n"
6899 "};\n"
6900 "void main(){\n"
6901 " gl_Position = vec4(1);\n"
6902 "}\n";
6903 char const *fsSource =
6904 "#version 450\n"
6905 "\n"
6906 "layout(location=0) out vec4 x;\n"
6907 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6908 "void main(){\n"
6909 " x = vec4(bar.y);\n"
6910 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006911 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6912 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6913 VkPipelineObj pipe(m_device);
6914 pipe.AddShader(&vs);
6915 pipe.AddShader(&fs);
6916 pipe.AddColorAttachment();
6917 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6918
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006919 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6920 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6921 VkRect2D scissor = {{0, 0}, {16, 16}};
6922 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6923
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006924 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006925 // This update should succeed, but offset size of 512 will overstep buffer
6926 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6928 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006929 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006930 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006931
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006932 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006933 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006934
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006935 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006936 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006937 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6938}
6939
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006940TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006941 TEST_DESCRIPTION(
6942 "Attempt to update a descriptor with a non-sparse buffer "
6943 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006944 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006946 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6948 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006949
Tony Barbour1fa09702017-03-16 12:09:08 -06006950 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006951 ASSERT_NO_FATAL_FAILURE(InitViewport());
6952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6953
6954 VkDescriptorPoolSize ds_type_count = {};
6955 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6956 ds_type_count.descriptorCount = 1;
6957
6958 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6959 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6960 ds_pool_ci.pNext = NULL;
6961 ds_pool_ci.maxSets = 1;
6962 ds_pool_ci.poolSizeCount = 1;
6963 ds_pool_ci.pPoolSizes = &ds_type_count;
6964
6965 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006966 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006967 ASSERT_VK_SUCCESS(err);
6968
6969 VkDescriptorSetLayoutBinding dsl_binding = {};
6970 dsl_binding.binding = 0;
6971 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6972 dsl_binding.descriptorCount = 1;
6973 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6974 dsl_binding.pImmutableSamplers = NULL;
6975
6976 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6977 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6978 ds_layout_ci.pNext = NULL;
6979 ds_layout_ci.bindingCount = 1;
6980 ds_layout_ci.pBindings = &dsl_binding;
6981 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006982 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006983 ASSERT_VK_SUCCESS(err);
6984
6985 VkDescriptorSet descriptorSet;
6986 VkDescriptorSetAllocateInfo alloc_info = {};
6987 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6988 alloc_info.descriptorSetCount = 1;
6989 alloc_info.descriptorPool = ds_pool;
6990 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006991 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006992 ASSERT_VK_SUCCESS(err);
6993
6994 // Create a buffer to update the descriptor with
6995 uint32_t qfi = 0;
6996 VkBufferCreateInfo buffCI = {};
6997 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6998 buffCI.size = 1024;
6999 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7000 buffCI.queueFamilyIndexCount = 1;
7001 buffCI.pQueueFamilyIndices = &qfi;
7002
7003 VkBuffer dyub;
7004 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7005 ASSERT_VK_SUCCESS(err);
7006
7007 // Attempt to update descriptor without binding memory to it
7008 VkDescriptorBufferInfo buffInfo = {};
7009 buffInfo.buffer = dyub;
7010 buffInfo.offset = 0;
7011 buffInfo.range = 1024;
7012
7013 VkWriteDescriptorSet descriptor_write;
7014 memset(&descriptor_write, 0, sizeof(descriptor_write));
7015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7016 descriptor_write.dstSet = descriptorSet;
7017 descriptor_write.dstBinding = 0;
7018 descriptor_write.descriptorCount = 1;
7019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7020 descriptor_write.pBufferInfo = &buffInfo;
7021
7022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7023 m_errorMonitor->VerifyFound();
7024
7025 vkDestroyBuffer(m_device->device(), dyub, NULL);
7026 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7027 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7028}
7029
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007030TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007031 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007032 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007033 ASSERT_NO_FATAL_FAILURE(InitViewport());
7034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7035
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007036 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007037 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007038 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7039 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7040 pipeline_layout_ci.pushConstantRangeCount = 1;
7041 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7042
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007043 //
7044 // Check for invalid push constant ranges in pipeline layouts.
7045 //
7046 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007047 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007048 char const *msg;
7049 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007050
Karl Schultzc81037d2016-05-12 08:11:23 -06007051 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7052 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7053 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7054 "vkCreatePipelineLayout() call has push constants index 0 with "
7055 "size 0."},
7056 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7057 "vkCreatePipelineLayout() call has push constants index 0 with "
7058 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007059 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007060 "vkCreatePipelineLayout() call has push constants index 0 with "
7061 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007062 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007063 "vkCreatePipelineLayout() call has push constants index 0 with "
7064 "size 0."},
7065 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7066 "vkCreatePipelineLayout() call has push constants index 0 with "
7067 "offset 1. Offset must"},
7068 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7069 "vkCreatePipelineLayout() call has push constants index 0 "
7070 "with offset "},
7071 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7072 "vkCreatePipelineLayout() call has push constants "
7073 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007074 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007075 "vkCreatePipelineLayout() call has push constants index 0 "
7076 "with offset "},
7077 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7078 "vkCreatePipelineLayout() call has push "
7079 "constants index 0 with offset "},
7080 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7081 "vkCreatePipelineLayout() call has push "
7082 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007083 }};
7084
7085 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007086 for (const auto &iter : range_tests) {
7087 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7089 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007090 m_errorMonitor->VerifyFound();
7091 if (VK_SUCCESS == err) {
7092 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7093 }
7094 }
7095
7096 // Check for invalid stage flag
7097 pc_range.offset = 0;
7098 pc_range.size = 16;
7099 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007100 m_errorMonitor->SetDesiredFailureMsg(
7101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7102 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007103 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007104 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007105 if (VK_SUCCESS == err) {
7106 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7107 }
7108
Karl Schultzc59b72d2017-02-24 15:45:05 -07007109 // Check for duplicate stage flags in a list of push constant ranges.
7110 // A shader can only have one push constant block and that block is mapped
7111 // to the push constant range that has that shader's stage flag set.
7112 // The shader's stage flag can only appear once in all the ranges, so the
7113 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007114 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007115 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007116 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007117 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007118 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007119 // Overlapping ranges are OK, but a stage flag can appear only once.
7120 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7121 {
7122 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7123 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7124 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7125 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007126 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007127 {
7128 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7129 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7130 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7131 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7132 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7133 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7134 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7135 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7136 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7137 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7138 }},
7139 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7140 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7141 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7142 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7143 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7144 {
7145 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7146 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7147 }},
7148 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7149 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7150 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7151 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7152 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7153 {
7154 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7155 }},
7156 },
7157 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007158
Karl Schultzc59b72d2017-02-24 15:45:05 -07007159 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007160 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007161 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007163 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007164 m_errorMonitor->VerifyFound();
7165 if (VK_SUCCESS == err) {
7166 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7167 }
7168 }
7169
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007170 //
7171 // CmdPushConstants tests
7172 //
7173
Karl Schultzc59b72d2017-02-24 15:45:05 -07007174 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007175 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007176 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007177 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007178 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007179 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007181 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007182
7183 const uint8_t dummy_values[100] = {};
7184
7185 m_commandBuffer->BeginCommandBuffer();
7186 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007187
7188 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007189 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007191 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007192 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007193
Karl Schultzc59b72d2017-02-24 15:45:05 -07007194 m_errorMonitor->ExpectSuccess();
7195 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7196 m_errorMonitor->VerifyNotFound();
7197 m_errorMonitor->ExpectSuccess();
7198 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7199 m_errorMonitor->VerifyNotFound();
7200 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7201 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7202 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7203 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7204 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7205 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7206 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007207 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007208 for (const auto &iter : cmd_range_tests) {
7209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7210 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7211 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007212 m_errorMonitor->VerifyFound();
7213 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007214
Tony Barbour552f6c02016-12-21 14:34:07 -07007215 m_commandBuffer->EndRenderPass();
7216 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007217 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007218}
7219
Karl Schultz6addd812016-02-02 17:17:23 -07007220TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007221 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007222 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007223
Tony Barbour1fa09702017-03-16 12:09:08 -06007224 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007225 ASSERT_NO_FATAL_FAILURE(InitViewport());
7226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7227
7228 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7229 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007230 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7231 ds_type_count[0].descriptorCount = 10;
7232 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7233 ds_type_count[1].descriptorCount = 2;
7234 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7235 ds_type_count[2].descriptorCount = 2;
7236 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7237 ds_type_count[3].descriptorCount = 5;
7238 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7239 // type
7240 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7241 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7242 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007243
7244 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007245 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7246 ds_pool_ci.pNext = NULL;
7247 ds_pool_ci.maxSets = 5;
7248 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7249 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007250
7251 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007252 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007253 ASSERT_VK_SUCCESS(err);
7254
7255 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7256 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007257 dsl_binding[0].binding = 0;
7258 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7259 dsl_binding[0].descriptorCount = 5;
7260 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7261 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007262
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007263 // Create layout identical to set0 layout but w/ different stageFlags
7264 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007265 dsl_fs_stage_only.binding = 0;
7266 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7267 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007268 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7269 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007270 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007271 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007272 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7273 ds_layout_ci.pNext = NULL;
7274 ds_layout_ci.bindingCount = 1;
7275 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007276 static const uint32_t NUM_LAYOUTS = 4;
7277 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007278 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007279 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7280 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007281 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007282 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007283 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007284 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007285 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007286 dsl_binding[0].binding = 0;
7287 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007288 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007289 dsl_binding[1].binding = 1;
7290 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7291 dsl_binding[1].descriptorCount = 2;
7292 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7293 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007294 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007295 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007296 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007297 ASSERT_VK_SUCCESS(err);
7298 dsl_binding[0].binding = 0;
7299 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007300 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007301 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007302 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007303 ASSERT_VK_SUCCESS(err);
7304 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007305 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007306 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007307 ASSERT_VK_SUCCESS(err);
7308
7309 static const uint32_t NUM_SETS = 4;
7310 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7311 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007312 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007313 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007314 alloc_info.descriptorPool = ds_pool;
7315 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007316 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007317 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007318 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007319 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007320 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007321 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007322 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007323
7324 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007325 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7326 pipeline_layout_ci.pNext = NULL;
7327 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7328 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007329
7330 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007331 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007332 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007333 // Create pipelineLayout with only one setLayout
7334 pipeline_layout_ci.setLayoutCount = 1;
7335 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007336 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007337 ASSERT_VK_SUCCESS(err);
7338 // Create pipelineLayout with 2 descriptor setLayout at index 0
7339 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7340 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007341 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 ASSERT_VK_SUCCESS(err);
7343 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7344 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7345 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007346 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007347 ASSERT_VK_SUCCESS(err);
7348 // Create pipelineLayout with UB type, but stageFlags for FS only
7349 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7350 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007351 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007352 ASSERT_VK_SUCCESS(err);
7353 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7354 VkDescriptorSetLayout pl_bad_s0[2] = {};
7355 pl_bad_s0[0] = ds_layout_fs_only;
7356 pl_bad_s0[1] = ds_layout[1];
7357 pipeline_layout_ci.setLayoutCount = 2;
7358 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7359 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007360 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007361 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007362
Tobin Ehlis88452832015-12-03 09:40:56 -07007363 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007364 char const *vsSource =
7365 "#version 450\n"
7366 "\n"
7367 "out gl_PerVertex {\n"
7368 " vec4 gl_Position;\n"
7369 "};\n"
7370 "void main(){\n"
7371 " gl_Position = vec4(1);\n"
7372 "}\n";
7373 char const *fsSource =
7374 "#version 450\n"
7375 "\n"
7376 "layout(location=0) out vec4 x;\n"
7377 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7378 "void main(){\n"
7379 " x = vec4(bar.y);\n"
7380 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007381 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007383 VkPipelineObj pipe(m_device);
7384 pipe.AddShader(&vs);
7385 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007386 pipe.AddColorAttachment();
7387 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007388
Tony Barbour552f6c02016-12-21 14:34:07 -07007389 m_commandBuffer->BeginCommandBuffer();
7390 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007391
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007392 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007393 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7394 // of PSO
7395 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7396 // cmd_pipeline.c
7397 // due to the fact that cmd_alloc_dset_data() has not been called in
7398 // cmd_bind_graphics_pipeline()
7399 // TODO : Want to cause various binding incompatibility issues here to test
7400 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007401 // First cause various verify_layout_compatibility() fails
7402 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007403 // verify_set_layout_compatibility fail cases:
7404 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007406 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7407 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007408 m_errorMonitor->VerifyFound();
7409
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007410 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7412 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7413 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007414 m_errorMonitor->VerifyFound();
7415
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007416 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007417 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7418 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7420 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7421 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007422 m_errorMonitor->VerifyFound();
7423
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007424 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7425 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7427 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7428 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007429 m_errorMonitor->VerifyFound();
7430
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007431 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7432 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7434 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7435 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7436 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007437 m_errorMonitor->VerifyFound();
7438
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 // Cause INFO messages due to disturbing previously bound Sets
7440 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007441 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7442 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007443 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7445 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7446 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007447 m_errorMonitor->VerifyFound();
7448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007449 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7450 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007451 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7453 " newly bound as set #0 so set #1 and "
7454 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7456 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007457 m_errorMonitor->VerifyFound();
7458
Tobin Ehlis10fad692016-07-07 12:00:36 -06007459 // Now that we're done actively using the pipelineLayout that gfx pipeline
7460 // was created with, we should be able to delete it. Do that now to verify
7461 // that validation obeys pipelineLayout lifetime
7462 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7463
Tobin Ehlis88452832015-12-03 09:40:56 -07007464 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007465 // 1. Error due to not binding required set (we actually use same code as
7466 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007467 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7468 &descriptorSet[0], 0, NULL);
7469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7470 &descriptorSet[1], 0, NULL);
7471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007472
7473 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7474 VkRect2D scissor = {{0, 0}, {16, 16}};
7475 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7476 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7477
Tobin Ehlis88452832015-12-03 09:40:56 -07007478 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007479 m_errorMonitor->VerifyFound();
7480
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007481 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007482 // 2. Error due to bound set not being compatible with PSO's
7483 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007484 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7485 &descriptorSet[0], 0, NULL);
7486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007487 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007488 m_errorMonitor->VerifyFound();
7489
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007490 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007491 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007492 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7493 }
7494 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007495 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7497}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007498
Karl Schultz6addd812016-02-02 17:17:23 -07007499TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7501 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007502
Tony Barbour1fa09702017-03-16 12:09:08 -06007503 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007504 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007505 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007506 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007508 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007509}
7510
Karl Schultz6addd812016-02-02 17:17:23 -07007511TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7512 VkResult err;
7513 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007514
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007516
Tony Barbour1fa09702017-03-16 12:09:08 -06007517 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007518
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007519 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007520 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007521 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007522 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007523 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007524 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007525
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007526 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007527 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007528
7529 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007530 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007531 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7532
7533 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007534 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007535 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007536 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007537 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007538
7539 // The error should be caught by validation of the BeginCommandBuffer call
7540 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007542 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007543 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007544}
7545
Chris Forbes9480ae92017-05-17 17:14:34 -07007546TEST_F(VkLayerTest, SecondaryCommandBufferRerecorded) {
7547 ASSERT_NO_FATAL_FAILURE(Init());
7548
7549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dummy");
7550
7551 // A pool we can reset in.
7552 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_,
7553 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
7554 VkCommandBufferObj secondary(m_device, &pool,
7555 VK_COMMAND_BUFFER_LEVEL_SECONDARY);
7556
7557 secondary.begin();
7558 secondary.end();
7559
7560 m_commandBuffer->begin();
7561 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
7562
7563 // rerecording of secondary
7564 secondary.reset(); // masks our ability to catch this!
7565 secondary.begin();
7566 secondary.end();
7567
7568 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
7569 m_commandBuffer->end();
7570
7571 // submit
7572 m_commandBuffer->QueueCommandBuffer(false);
7573 m_errorMonitor->VerifyFound();
7574}
7575
Karl Schultz6addd812016-02-02 17:17:23 -07007576TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007577 // Cause error due to Begin while recording CB
7578 // Then cause 2 errors for attempting to reset CB w/o having
7579 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7580 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007582
Tony Barbour1fa09702017-03-16 12:09:08 -06007583 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007584
7585 // Calls AllocateCommandBuffers
7586 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7587
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007588 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007589 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007590 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7591 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007592 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7593 cmd_buf_info.pNext = NULL;
7594 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007595 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007596
7597 // Begin CB to transition to recording state
7598 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7599 // Can't re-begin. This should trigger error
7600 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007601 m_errorMonitor->VerifyFound();
7602
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007604 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007605 // Reset attempt will trigger error due to incorrect CommandPool state
7606 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007607 m_errorMonitor->VerifyFound();
7608
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007610 // Transition CB to RECORDED state
7611 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7612 // Now attempting to Begin will implicitly reset, which triggers error
7613 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007614 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007615}
7616
Karl Schultz6addd812016-02-02 17:17:23 -07007617TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007618 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007619 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007620
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7622 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007623
Tony Barbour1fa09702017-03-16 12:09:08 -06007624 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007626
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007627 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007628 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7629 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007630
7631 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007632 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7633 ds_pool_ci.pNext = NULL;
7634 ds_pool_ci.maxSets = 1;
7635 ds_pool_ci.poolSizeCount = 1;
7636 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007637
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007638 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007639 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007640 ASSERT_VK_SUCCESS(err);
7641
Tony Barboureb254902015-07-15 12:50:33 -06007642 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007643 dsl_binding.binding = 0;
7644 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7645 dsl_binding.descriptorCount = 1;
7646 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7647 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007648
Tony Barboureb254902015-07-15 12:50:33 -06007649 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007650 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7651 ds_layout_ci.pNext = NULL;
7652 ds_layout_ci.bindingCount = 1;
7653 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007654
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007655 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007656 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007657 ASSERT_VK_SUCCESS(err);
7658
7659 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007660 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007662 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007663 alloc_info.descriptorPool = ds_pool;
7664 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007666 ASSERT_VK_SUCCESS(err);
7667
Tony Barboureb254902015-07-15 12:50:33 -06007668 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007669 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7670 pipeline_layout_ci.setLayoutCount = 1;
7671 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007672
7673 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007674 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007675 ASSERT_VK_SUCCESS(err);
7676
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007677 VkViewport vp = {}; // Just need dummy vp to point to
7678 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007679
7680 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007681 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7682 vp_state_ci.scissorCount = 1;
7683 vp_state_ci.pScissors = &sc;
7684 vp_state_ci.viewportCount = 1;
7685 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007686
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007687 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7688 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7689 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7690 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7691 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7692 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007693 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007694 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007695 rs_state_ci.lineWidth = 1.0f;
7696
7697 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7698 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7699 vi_ci.pNext = nullptr;
7700 vi_ci.vertexBindingDescriptionCount = 0;
7701 vi_ci.pVertexBindingDescriptions = nullptr;
7702 vi_ci.vertexAttributeDescriptionCount = 0;
7703 vi_ci.pVertexAttributeDescriptions = nullptr;
7704
7705 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7706 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7707 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7708
7709 VkPipelineShaderStageCreateInfo shaderStages[2];
7710 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7711
7712 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7713 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007714 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007715 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007716
Tony Barboureb254902015-07-15 12:50:33 -06007717 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007718 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7719 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007720 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007721 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7722 gp_ci.layout = pipeline_layout;
7723 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007724 gp_ci.pVertexInputState = &vi_ci;
7725 gp_ci.pInputAssemblyState = &ia_ci;
7726
7727 gp_ci.stageCount = 1;
7728 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007729
7730 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007731 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7732 pc_ci.initialDataSize = 0;
7733 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007734
7735 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007736 VkPipelineCache pipelineCache;
7737
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007738 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007739 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007740 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007741 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007742
Chia-I Wuf7458c52015-10-26 21:10:41 +08007743 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007747}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007748
Tobin Ehlis912df022015-09-17 08:46:18 -06007749/*// TODO : This test should be good, but needs Tess support in compiler to run
7750TEST_F(VkLayerTest, InvalidPatchControlPoints)
7751{
7752 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007753 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007754
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007756 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7757primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007758
Tony Barbour1fa09702017-03-16 12:09:08 -06007759 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007761
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007762 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007763 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007764 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007765
7766 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7767 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7768 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007769 ds_pool_ci.poolSizeCount = 1;
7770 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007771
7772 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007773 err = vkCreateDescriptorPool(m_device->device(),
7774VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007775 ASSERT_VK_SUCCESS(err);
7776
7777 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007778 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007780 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7782 dsl_binding.pImmutableSamplers = NULL;
7783
7784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007785 ds_layout_ci.sType =
7786VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007787 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007788 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007789 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007790
7791 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007792 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7793&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007794 ASSERT_VK_SUCCESS(err);
7795
7796 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007797 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7798VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007799 ASSERT_VK_SUCCESS(err);
7800
7801 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007802 pipeline_layout_ci.sType =
7803VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007804 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007805 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007806 pipeline_layout_ci.pSetLayouts = &ds_layout;
7807
7808 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7810&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007811 ASSERT_VK_SUCCESS(err);
7812
7813 VkPipelineShaderStageCreateInfo shaderStages[3];
7814 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7815
Karl Schultz6addd812016-02-02 17:17:23 -07007816 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7817this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007818 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007819 VkShaderObj
7820tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7821this);
7822 VkShaderObj
7823te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7824this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007825
Karl Schultz6addd812016-02-02 17:17:23 -07007826 shaderStages[0].sType =
7827VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007828 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007829 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007830 shaderStages[1].sType =
7831VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007832 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007833 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007834 shaderStages[2].sType =
7835VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007836 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007837 shaderStages[2].shader = te.handle();
7838
7839 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007840 iaCI.sType =
7841VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007842 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007843
7844 VkPipelineTessellationStateCreateInfo tsCI = {};
7845 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7846 tsCI.patchControlPoints = 0; // This will cause an error
7847
7848 VkGraphicsPipelineCreateInfo gp_ci = {};
7849 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7850 gp_ci.pNext = NULL;
7851 gp_ci.stageCount = 3;
7852 gp_ci.pStages = shaderStages;
7853 gp_ci.pVertexInputState = NULL;
7854 gp_ci.pInputAssemblyState = &iaCI;
7855 gp_ci.pTessellationState = &tsCI;
7856 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007857 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007858 gp_ci.pMultisampleState = NULL;
7859 gp_ci.pDepthStencilState = NULL;
7860 gp_ci.pColorBlendState = NULL;
7861 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7862 gp_ci.layout = pipeline_layout;
7863 gp_ci.renderPass = renderPass();
7864
7865 VkPipelineCacheCreateInfo pc_ci = {};
7866 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7867 pc_ci.pNext = NULL;
7868 pc_ci.initialSize = 0;
7869 pc_ci.initialData = 0;
7870 pc_ci.maxSize = 0;
7871
7872 VkPipeline pipeline;
7873 VkPipelineCache pipelineCache;
7874
Karl Schultz6addd812016-02-02 17:17:23 -07007875 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7876&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007877 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007878 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7879&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007880
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007881 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007882
Chia-I Wuf7458c52015-10-26 21:10:41 +08007883 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7884 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7885 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7886 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007887}
7888*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007889
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007890TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007891 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007892
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007893 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007894
Tony Barbour1fa09702017-03-16 12:09:08 -06007895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007897
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007898 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007899 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7900 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007901
7902 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007903 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7904 ds_pool_ci.maxSets = 1;
7905 ds_pool_ci.poolSizeCount = 1;
7906 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007907
7908 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007909 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910 ASSERT_VK_SUCCESS(err);
7911
7912 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007913 dsl_binding.binding = 0;
7914 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7915 dsl_binding.descriptorCount = 1;
7916 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007917
7918 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007919 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7920 ds_layout_ci.bindingCount = 1;
7921 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007922
7923 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007924 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007925 ASSERT_VK_SUCCESS(err);
7926
7927 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007928 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007929 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007930 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007931 alloc_info.descriptorPool = ds_pool;
7932 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007933 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007934 ASSERT_VK_SUCCESS(err);
7935
7936 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007937 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7938 pipeline_layout_ci.setLayoutCount = 1;
7939 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007940
7941 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007942 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007943 ASSERT_VK_SUCCESS(err);
7944
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007945 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007947 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007948 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007949 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007950 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007951
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007952 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7953 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7954 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7955 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7956 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7957 rs_state_ci.depthClampEnable = VK_FALSE;
7958 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7959 rs_state_ci.depthBiasEnable = VK_FALSE;
7960
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007961 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7962 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7963 vi_ci.pNext = nullptr;
7964 vi_ci.vertexBindingDescriptionCount = 0;
7965 vi_ci.pVertexBindingDescriptions = nullptr;
7966 vi_ci.vertexAttributeDescriptionCount = 0;
7967 vi_ci.pVertexAttributeDescriptions = nullptr;
7968
7969 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7970 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7971 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7972
7973 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7974 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7975 pipe_ms_state_ci.pNext = NULL;
7976 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7977 pipe_ms_state_ci.sampleShadingEnable = 0;
7978 pipe_ms_state_ci.minSampleShading = 1.0;
7979 pipe_ms_state_ci.pSampleMask = NULL;
7980
Cody Northropeb3a6c12015-10-05 14:44:45 -06007981 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007982 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007983
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007984 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007985 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007986 shaderStages[0] = vs.GetStageCreateInfo();
7987 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007988
7989 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007990 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7991 gp_ci.stageCount = 2;
7992 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007993 gp_ci.pVertexInputState = &vi_ci;
7994 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007995 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007996 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007997 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007998 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7999 gp_ci.layout = pipeline_layout;
8000 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008001
8002 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008003 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008004
8005 VkPipeline pipeline;
8006 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008007 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008008 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008009
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008010 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008011 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008012
8013 // Check case where multiViewport is disabled and viewport count is not 1
8014 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8017 vp_state_ci.scissorCount = 0;
8018 vp_state_ci.viewportCount = 0;
8019 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8020 m_errorMonitor->VerifyFound();
8021 } else {
8022 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008023 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008024 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008025 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008026
8027 // Check is that viewportcount and scissorcount match
8028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8029 vp_state_ci.scissorCount = 1;
8030 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8031 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8032 m_errorMonitor->VerifyFound();
8033
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008034 // Check case where multiViewport is enabled and viewport count is greater than max
8035 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8038 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8039 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8040 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8041 m_errorMonitor->VerifyFound();
8042 }
8043 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008044
Chia-I Wuf7458c52015-10-26 21:10:41 +08008045 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8046 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8047 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8048 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008049}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008050
8051// 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
8052// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008053TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008054 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008055
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008056 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8057
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008059
Tony Barbour1fa09702017-03-16 12:09:08 -06008060 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008062
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008063 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008064 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8065 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008066
8067 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008068 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8069 ds_pool_ci.maxSets = 1;
8070 ds_pool_ci.poolSizeCount = 1;
8071 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008072
8073 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008074 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008075 ASSERT_VK_SUCCESS(err);
8076
8077 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008078 dsl_binding.binding = 0;
8079 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8080 dsl_binding.descriptorCount = 1;
8081 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008082
8083 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008084 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8085 ds_layout_ci.bindingCount = 1;
8086 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008087
8088 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008089 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008090 ASSERT_VK_SUCCESS(err);
8091
8092 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008093 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008094 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008095 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008096 alloc_info.descriptorPool = ds_pool;
8097 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008098 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008099 ASSERT_VK_SUCCESS(err);
8100
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008101 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8102 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8103 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8104
8105 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8106 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8107 vi_ci.pNext = nullptr;
8108 vi_ci.vertexBindingDescriptionCount = 0;
8109 vi_ci.pVertexBindingDescriptions = nullptr;
8110 vi_ci.vertexAttributeDescriptionCount = 0;
8111 vi_ci.pVertexAttributeDescriptions = nullptr;
8112
8113 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8114 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8115 pipe_ms_state_ci.pNext = NULL;
8116 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8117 pipe_ms_state_ci.sampleShadingEnable = 0;
8118 pipe_ms_state_ci.minSampleShading = 1.0;
8119 pipe_ms_state_ci.pSampleMask = NULL;
8120
Tobin Ehlise68360f2015-10-01 11:15:13 -06008121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8123 pipeline_layout_ci.setLayoutCount = 1;
8124 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008125
8126 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008127 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008128 ASSERT_VK_SUCCESS(err);
8129
8130 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8131 // Set scissor as dynamic to avoid second error
8132 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008133 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8134 dyn_state_ci.dynamicStateCount = 1;
8135 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008136
Cody Northropeb3a6c12015-10-05 14:44:45 -06008137 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008138 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008139
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008140 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008141 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8142 // 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 +08008143 shaderStages[0] = vs.GetStageCreateInfo();
8144 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008145
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008146 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8147 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8148 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8149 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8150 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8151 rs_state_ci.depthClampEnable = VK_FALSE;
8152 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8153 rs_state_ci.depthBiasEnable = VK_FALSE;
8154
Tobin Ehlise68360f2015-10-01 11:15:13 -06008155 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008156 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8157 gp_ci.stageCount = 2;
8158 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008159 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008160 // Not setting VP state w/o dynamic vp state should cause validation error
8161 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008162 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008163 gp_ci.pVertexInputState = &vi_ci;
8164 gp_ci.pInputAssemblyState = &ia_ci;
8165 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008166 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8167 gp_ci.layout = pipeline_layout;
8168 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008169
8170 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008171 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008172
8173 VkPipeline pipeline;
8174 VkPipelineCache pipelineCache;
8175
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008176 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008177 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008178 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008179
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008180 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008181
Chia-I Wuf7458c52015-10-26 21:10:41 +08008182 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8183 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8184 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8185 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008186}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008187
8188// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8189// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008190TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8191 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008192
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008194
Tony Barbour1fa09702017-03-16 12:09:08 -06008195 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008196
8197 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008198 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008199 return;
8200 }
8201
Tobin Ehlise68360f2015-10-01 11:15:13 -06008202 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008203
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008204 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008205 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8206 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008207
8208 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008209 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8210 ds_pool_ci.maxSets = 1;
8211 ds_pool_ci.poolSizeCount = 1;
8212 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008213
8214 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008215 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008216 ASSERT_VK_SUCCESS(err);
8217
8218 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008219 dsl_binding.binding = 0;
8220 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8221 dsl_binding.descriptorCount = 1;
8222 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008223
8224 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008225 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8226 ds_layout_ci.bindingCount = 1;
8227 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008228
8229 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008230 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008231 ASSERT_VK_SUCCESS(err);
8232
8233 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008234 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008235 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008236 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008237 alloc_info.descriptorPool = ds_pool;
8238 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008239 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008240 ASSERT_VK_SUCCESS(err);
8241
8242 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008243 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8244 pipeline_layout_ci.setLayoutCount = 1;
8245 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008246
8247 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008248 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008249 ASSERT_VK_SUCCESS(err);
8250
8251 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008252 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8253 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008254 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008255 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008256 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008257
8258 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8259 // Set scissor as dynamic to avoid that error
8260 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008261 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8262 dyn_state_ci.dynamicStateCount = 1;
8263 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008264
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008265 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8266 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8267 pipe_ms_state_ci.pNext = NULL;
8268 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8269 pipe_ms_state_ci.sampleShadingEnable = 0;
8270 pipe_ms_state_ci.minSampleShading = 1.0;
8271 pipe_ms_state_ci.pSampleMask = NULL;
8272
Cody Northropeb3a6c12015-10-05 14:44:45 -06008273 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008274 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008275
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008276 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008277 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8278 // 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 +08008279 shaderStages[0] = vs.GetStageCreateInfo();
8280 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008281
Cody Northropf6622dc2015-10-06 10:33:21 -06008282 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8283 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8284 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008285 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008286 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008287 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008288 vi_ci.pVertexAttributeDescriptions = nullptr;
8289
8290 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8291 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8292 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8293
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008294 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008295 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008296 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008297 rs_ci.pNext = nullptr;
8298
Mark Youngc89c6312016-03-31 16:03:20 -06008299 VkPipelineColorBlendAttachmentState att = {};
8300 att.blendEnable = VK_FALSE;
8301 att.colorWriteMask = 0xf;
8302
Cody Northropf6622dc2015-10-06 10:33:21 -06008303 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8304 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8305 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008306 cb_ci.attachmentCount = 1;
8307 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008308
Tobin Ehlise68360f2015-10-01 11:15:13 -06008309 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008310 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8311 gp_ci.stageCount = 2;
8312 gp_ci.pStages = shaderStages;
8313 gp_ci.pVertexInputState = &vi_ci;
8314 gp_ci.pInputAssemblyState = &ia_ci;
8315 gp_ci.pViewportState = &vp_state_ci;
8316 gp_ci.pRasterizationState = &rs_ci;
8317 gp_ci.pColorBlendState = &cb_ci;
8318 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008319 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008320 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8321 gp_ci.layout = pipeline_layout;
8322 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008323
8324 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008325 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008326
8327 VkPipeline pipeline;
8328 VkPipelineCache pipelineCache;
8329
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008330 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008331 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008332 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008333
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008334 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008335
Tobin Ehlisd332f282015-10-02 11:00:56 -06008336 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008337 // First need to successfully create the PSO from above by setting
8338 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008339 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 -07008340
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008341 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008342 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008343 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008344 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008345 m_commandBuffer->BeginCommandBuffer();
8346 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008347 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008348 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008349 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008350 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008351 Draw(1, 0, 0, 0);
8352
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008353 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008354
8355 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8356 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8357 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8358 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008359 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008360}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008361
8362// 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 -07008363// viewportCount
8364TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8365 VkResult err;
8366
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008368
Tony Barbour1fa09702017-03-16 12:09:08 -06008369 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008370
8371 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008372 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008373 return;
8374 }
8375
Karl Schultz6addd812016-02-02 17:17:23 -07008376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8377
8378 VkDescriptorPoolSize ds_type_count = {};
8379 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8380 ds_type_count.descriptorCount = 1;
8381
8382 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8383 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8384 ds_pool_ci.maxSets = 1;
8385 ds_pool_ci.poolSizeCount = 1;
8386 ds_pool_ci.pPoolSizes = &ds_type_count;
8387
8388 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008389 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008390 ASSERT_VK_SUCCESS(err);
8391
8392 VkDescriptorSetLayoutBinding dsl_binding = {};
8393 dsl_binding.binding = 0;
8394 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8395 dsl_binding.descriptorCount = 1;
8396 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8397
8398 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8399 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8400 ds_layout_ci.bindingCount = 1;
8401 ds_layout_ci.pBindings = &dsl_binding;
8402
8403 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008404 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008405 ASSERT_VK_SUCCESS(err);
8406
8407 VkDescriptorSet descriptorSet;
8408 VkDescriptorSetAllocateInfo alloc_info = {};
8409 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8410 alloc_info.descriptorSetCount = 1;
8411 alloc_info.descriptorPool = ds_pool;
8412 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008413 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008414 ASSERT_VK_SUCCESS(err);
8415
8416 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8417 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8418 pipeline_layout_ci.setLayoutCount = 1;
8419 pipeline_layout_ci.pSetLayouts = &ds_layout;
8420
8421 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008422 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008423 ASSERT_VK_SUCCESS(err);
8424
8425 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8426 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8427 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008428 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008429 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008430 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008431
8432 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8433 // Set scissor as dynamic to avoid that error
8434 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8435 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8436 dyn_state_ci.dynamicStateCount = 1;
8437 dyn_state_ci.pDynamicStates = &vp_state;
8438
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008439 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8440 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8441 pipe_ms_state_ci.pNext = NULL;
8442 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8443 pipe_ms_state_ci.sampleShadingEnable = 0;
8444 pipe_ms_state_ci.minSampleShading = 1.0;
8445 pipe_ms_state_ci.pSampleMask = NULL;
8446
Karl Schultz6addd812016-02-02 17:17:23 -07008447 VkPipelineShaderStageCreateInfo shaderStages[2];
8448 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8449
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008450 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008451 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8452 // 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 -07008453 shaderStages[0] = vs.GetStageCreateInfo();
8454 shaderStages[1] = fs.GetStageCreateInfo();
8455
8456 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8457 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8458 vi_ci.pNext = nullptr;
8459 vi_ci.vertexBindingDescriptionCount = 0;
8460 vi_ci.pVertexBindingDescriptions = nullptr;
8461 vi_ci.vertexAttributeDescriptionCount = 0;
8462 vi_ci.pVertexAttributeDescriptions = nullptr;
8463
8464 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8465 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8466 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8467
8468 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8469 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008470 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008471 rs_ci.pNext = nullptr;
8472
Mark Youngc89c6312016-03-31 16:03:20 -06008473 VkPipelineColorBlendAttachmentState att = {};
8474 att.blendEnable = VK_FALSE;
8475 att.colorWriteMask = 0xf;
8476
Karl Schultz6addd812016-02-02 17:17:23 -07008477 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8478 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8479 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008480 cb_ci.attachmentCount = 1;
8481 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008482
8483 VkGraphicsPipelineCreateInfo gp_ci = {};
8484 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8485 gp_ci.stageCount = 2;
8486 gp_ci.pStages = shaderStages;
8487 gp_ci.pVertexInputState = &vi_ci;
8488 gp_ci.pInputAssemblyState = &ia_ci;
8489 gp_ci.pViewportState = &vp_state_ci;
8490 gp_ci.pRasterizationState = &rs_ci;
8491 gp_ci.pColorBlendState = &cb_ci;
8492 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008493 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008494 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8495 gp_ci.layout = pipeline_layout;
8496 gp_ci.renderPass = renderPass();
8497
8498 VkPipelineCacheCreateInfo pc_ci = {};
8499 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8500
8501 VkPipeline pipeline;
8502 VkPipelineCache pipelineCache;
8503
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008504 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008505 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008506 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008508 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008509
8510 // Now hit second fail case where we set scissor w/ different count than PSO
8511 // First need to successfully create the PSO from above by setting
8512 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8514 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008515
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008516 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008517 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008519 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008520 m_commandBuffer->BeginCommandBuffer();
8521 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008522 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008523 VkViewport viewports[1] = {};
8524 viewports[0].width = 8;
8525 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008526 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008527 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008528 Draw(1, 0, 0, 0);
8529
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008530 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008531
Chia-I Wuf7458c52015-10-26 21:10:41 +08008532 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8533 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8534 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8535 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008536 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008537}
8538
Mark Young7394fdd2016-03-31 14:56:43 -06008539TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8540 VkResult err;
8541
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008543
Tony Barbour1fa09702017-03-16 12:09:08 -06008544 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8546
8547 VkDescriptorPoolSize ds_type_count = {};
8548 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8549 ds_type_count.descriptorCount = 1;
8550
8551 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8552 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8553 ds_pool_ci.maxSets = 1;
8554 ds_pool_ci.poolSizeCount = 1;
8555 ds_pool_ci.pPoolSizes = &ds_type_count;
8556
8557 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008558 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008559 ASSERT_VK_SUCCESS(err);
8560
8561 VkDescriptorSetLayoutBinding dsl_binding = {};
8562 dsl_binding.binding = 0;
8563 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8564 dsl_binding.descriptorCount = 1;
8565 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8566
8567 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8568 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8569 ds_layout_ci.bindingCount = 1;
8570 ds_layout_ci.pBindings = &dsl_binding;
8571
8572 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008573 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008574 ASSERT_VK_SUCCESS(err);
8575
8576 VkDescriptorSet descriptorSet;
8577 VkDescriptorSetAllocateInfo alloc_info = {};
8578 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8579 alloc_info.descriptorSetCount = 1;
8580 alloc_info.descriptorPool = ds_pool;
8581 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008582 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008583 ASSERT_VK_SUCCESS(err);
8584
8585 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8586 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8587 pipeline_layout_ci.setLayoutCount = 1;
8588 pipeline_layout_ci.pSetLayouts = &ds_layout;
8589
8590 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008591 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008592 ASSERT_VK_SUCCESS(err);
8593
8594 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8595 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8596 vp_state_ci.scissorCount = 1;
8597 vp_state_ci.pScissors = NULL;
8598 vp_state_ci.viewportCount = 1;
8599 vp_state_ci.pViewports = NULL;
8600
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008601 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008602 // Set scissor as dynamic to avoid that error
8603 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8604 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8605 dyn_state_ci.dynamicStateCount = 2;
8606 dyn_state_ci.pDynamicStates = dynamic_states;
8607
8608 VkPipelineShaderStageCreateInfo shaderStages[2];
8609 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8610
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008611 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8612 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008613 this); // TODO - We shouldn't need a fragment shader
8614 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008615 shaderStages[0] = vs.GetStageCreateInfo();
8616 shaderStages[1] = fs.GetStageCreateInfo();
8617
8618 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8619 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8620 vi_ci.pNext = nullptr;
8621 vi_ci.vertexBindingDescriptionCount = 0;
8622 vi_ci.pVertexBindingDescriptions = nullptr;
8623 vi_ci.vertexAttributeDescriptionCount = 0;
8624 vi_ci.pVertexAttributeDescriptions = nullptr;
8625
8626 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8627 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8628 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8629
8630 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8631 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8632 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008633 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008634
Mark Young47107952016-05-02 15:59:55 -06008635 // Check too low (line width of -1.0f).
8636 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008637
8638 VkPipelineColorBlendAttachmentState att = {};
8639 att.blendEnable = VK_FALSE;
8640 att.colorWriteMask = 0xf;
8641
8642 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8643 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8644 cb_ci.pNext = nullptr;
8645 cb_ci.attachmentCount = 1;
8646 cb_ci.pAttachments = &att;
8647
8648 VkGraphicsPipelineCreateInfo gp_ci = {};
8649 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8650 gp_ci.stageCount = 2;
8651 gp_ci.pStages = shaderStages;
8652 gp_ci.pVertexInputState = &vi_ci;
8653 gp_ci.pInputAssemblyState = &ia_ci;
8654 gp_ci.pViewportState = &vp_state_ci;
8655 gp_ci.pRasterizationState = &rs_ci;
8656 gp_ci.pColorBlendState = &cb_ci;
8657 gp_ci.pDynamicState = &dyn_state_ci;
8658 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8659 gp_ci.layout = pipeline_layout;
8660 gp_ci.renderPass = renderPass();
8661
8662 VkPipelineCacheCreateInfo pc_ci = {};
8663 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8664
8665 VkPipeline pipeline;
8666 VkPipelineCache pipelineCache;
8667
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008668 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008669 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008670 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008671
8672 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008673 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008674
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008676
8677 // Check too high (line width of 65536.0f).
8678 rs_ci.lineWidth = 65536.0f;
8679
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008680 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008681 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008682 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008683
8684 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008685 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008686
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008688
8689 dyn_state_ci.dynamicStateCount = 3;
8690
8691 rs_ci.lineWidth = 1.0f;
8692
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008693 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008694 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008695 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008696 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008697 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008698
8699 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008700 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008701 m_errorMonitor->VerifyFound();
8702
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008704
8705 // Check too high with dynamic setting.
8706 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8707 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008708 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008709
8710 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8711 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8712 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8713 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008714 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008715}
8716
Jeremy Hayes37f0cdd2017-05-04 18:08:49 -06008717TEST_F(VkLayerTest, VALIDATION_ERROR_01407) {
8718 TEST_DESCRIPTION("Test VALIDATION_ERROR_01407: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
8719
8720 ASSERT_NO_FATAL_FAILURE(Init());
8721 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8722
8723 VkPipelineCache pipeline_cache;
8724 {
8725 VkPipelineCacheCreateInfo create_info{};
8726 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8727
8728 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8729 ASSERT_VK_SUCCESS(err);
8730 }
8731
8732 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8733 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8734
8735 VkPipelineShaderStageCreateInfo stages[2]{{}};
8736 stages[0] = vs.GetStageCreateInfo();
8737 stages[1] = fs.GetStageCreateInfo();
8738
8739 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
8740 VkVertexInputBindingDescription vertex_input_binding_description{};
8741 vertex_input_binding_description.binding = m_device->props.limits.maxVertexInputBindings;
8742
8743 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8744 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8745 vertex_input_state.pNext = nullptr;
8746 vertex_input_state.vertexBindingDescriptionCount = 1;
8747 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8748 vertex_input_state.vertexAttributeDescriptionCount = 0;
8749 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8750
8751 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8752 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8753 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8754
8755 VkViewport viewport{};
8756 VkPipelineViewportStateCreateInfo viewport_state{};
8757 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8758 viewport_state.scissorCount = 1;
8759 viewport_state.viewportCount = 1;
8760 viewport_state.pViewports = &viewport;
8761
8762 VkPipelineMultisampleStateCreateInfo multisample_state{};
8763 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8764 multisample_state.pNext = nullptr;
8765 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8766 multisample_state.sampleShadingEnable = 0;
8767 multisample_state.minSampleShading = 1.0;
8768 multisample_state.pSampleMask = nullptr;
8769
8770 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8771 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8772 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8773 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8774 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8775 rasterization_state.depthClampEnable = VK_FALSE;
8776 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8777 rasterization_state.depthBiasEnable = VK_FALSE;
8778
8779 VkPipelineLayout pipeline_layout;
8780 {
8781 VkPipelineLayoutCreateInfo create_info{};
8782 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8783 create_info.setLayoutCount = 0;
8784 create_info.pSetLayouts = nullptr;
8785
8786 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8787 ASSERT_VK_SUCCESS(err);
8788 }
8789
8790 {
8791 VkGraphicsPipelineCreateInfo create_info{};
8792 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8793 create_info.stageCount = 2;
8794 create_info.pStages = stages;
8795 create_info.pVertexInputState = &vertex_input_state;
8796 create_info.pInputAssemblyState = &input_assembly_state;
8797 create_info.pViewportState = &viewport_state;
8798 create_info.pMultisampleState = &multisample_state;
8799 create_info.pRasterizationState = &rasterization_state;
8800 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8801 create_info.layout = pipeline_layout;
8802 create_info.renderPass = renderPass();
8803
8804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01407);
8805 VkPipeline pipeline;
8806 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8807 m_errorMonitor->VerifyFound();
8808 }
8809
8810 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8811 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8812}
8813
8814TEST_F(VkLayerTest, VALIDATION_ERROR_01408) {
8815 TEST_DESCRIPTION(
8816 "Test VALIDATION_ERROR_01408: stride must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride");
8817
8818 ASSERT_NO_FATAL_FAILURE(Init());
8819 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8820
8821 VkPipelineCache pipeline_cache;
8822 {
8823 VkPipelineCacheCreateInfo create_info{};
8824 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8825
8826 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8827 ASSERT_VK_SUCCESS(err);
8828 }
8829
8830 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8831 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8832
8833 VkPipelineShaderStageCreateInfo stages[2]{{}};
8834 stages[0] = vs.GetStageCreateInfo();
8835 stages[1] = fs.GetStageCreateInfo();
8836
8837 // Test when stride is greater than VkPhysicalDeviceLimits::maxVertexInputBindingStride.
8838 VkVertexInputBindingDescription vertex_input_binding_description{};
8839 vertex_input_binding_description.stride = m_device->props.limits.maxVertexInputBindingStride + 1;
8840
8841 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8842 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8843 vertex_input_state.pNext = nullptr;
8844 vertex_input_state.vertexBindingDescriptionCount = 1;
8845 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8846 vertex_input_state.vertexAttributeDescriptionCount = 0;
8847 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8848
8849 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8850 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8851 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8852
8853 VkViewport viewport{};
8854 VkPipelineViewportStateCreateInfo viewport_state{};
8855 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8856 viewport_state.scissorCount = 1;
8857 viewport_state.viewportCount = 1;
8858 viewport_state.pViewports = &viewport;
8859
8860 VkPipelineMultisampleStateCreateInfo multisample_state{};
8861 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8862 multisample_state.pNext = nullptr;
8863 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8864 multisample_state.sampleShadingEnable = 0;
8865 multisample_state.minSampleShading = 1.0;
8866 multisample_state.pSampleMask = nullptr;
8867
8868 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8869 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8870 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8871 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8872 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8873 rasterization_state.depthClampEnable = VK_FALSE;
8874 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8875 rasterization_state.depthBiasEnable = VK_FALSE;
8876
8877 VkPipelineLayout pipeline_layout;
8878 {
8879 VkPipelineLayoutCreateInfo create_info{};
8880 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8881 create_info.setLayoutCount = 0;
8882 create_info.pSetLayouts = nullptr;
8883
8884 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8885 ASSERT_VK_SUCCESS(err);
8886 }
8887
8888 {
8889 VkGraphicsPipelineCreateInfo create_info{};
8890 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8891 create_info.stageCount = 2;
8892 create_info.pStages = stages;
8893 create_info.pVertexInputState = &vertex_input_state;
8894 create_info.pInputAssemblyState = &input_assembly_state;
8895 create_info.pViewportState = &viewport_state;
8896 create_info.pMultisampleState = &multisample_state;
8897 create_info.pRasterizationState = &rasterization_state;
8898 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8899 create_info.layout = pipeline_layout;
8900 create_info.renderPass = renderPass();
8901
8902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01408);
8903 VkPipeline pipeline;
8904 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8905 m_errorMonitor->VerifyFound();
8906 }
8907
8908 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8909 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8910}
8911
Jeremy Hayes091e1ab2017-05-04 18:10:28 -06008912TEST_F(VkLayerTest, VALIDATION_ERROR_01410) {
8913 TEST_DESCRIPTION("Test VALIDATION_ERROR_01410: location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes");
8914
8915 ASSERT_NO_FATAL_FAILURE(Init());
8916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8917
8918 VkPipelineCache pipeline_cache;
8919 {
8920 VkPipelineCacheCreateInfo create_info{};
8921 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8922
8923 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8924 ASSERT_VK_SUCCESS(err);
8925 }
8926
8927 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8928 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8929
8930 VkPipelineShaderStageCreateInfo stages[2]{{}};
8931 stages[0] = vs.GetStageCreateInfo();
8932 stages[1] = fs.GetStageCreateInfo();
8933
8934 // Test when location is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes.
8935 VkVertexInputAttributeDescription vertex_input_attribute_description{};
8936 vertex_input_attribute_description.location = m_device->props.limits.maxVertexInputAttributes;
8937
8938 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8939 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8940 vertex_input_state.pNext = nullptr;
8941 vertex_input_state.vertexBindingDescriptionCount = 0;
8942 vertex_input_state.pVertexBindingDescriptions = nullptr;
8943 vertex_input_state.vertexAttributeDescriptionCount = 1;
8944 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
8945
8946 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8947 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8948 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8949
8950 VkViewport viewport{};
8951 VkPipelineViewportStateCreateInfo viewport_state{};
8952 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8953 viewport_state.scissorCount = 1;
8954 viewport_state.viewportCount = 1;
8955 viewport_state.pViewports = &viewport;
8956
8957 VkPipelineMultisampleStateCreateInfo multisample_state{};
8958 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8959 multisample_state.pNext = nullptr;
8960 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8961 multisample_state.sampleShadingEnable = 0;
8962 multisample_state.minSampleShading = 1.0;
8963 multisample_state.pSampleMask = nullptr;
8964
8965 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8966 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8967 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8968 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8969 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8970 rasterization_state.depthClampEnable = VK_FALSE;
8971 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8972 rasterization_state.depthBiasEnable = VK_FALSE;
8973
8974 VkPipelineLayout pipeline_layout;
8975 {
8976 VkPipelineLayoutCreateInfo create_info{};
8977 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8978 create_info.setLayoutCount = 0;
8979 create_info.pSetLayouts = nullptr;
8980
8981 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8982 ASSERT_VK_SUCCESS(err);
8983 }
8984
8985 {
8986 VkGraphicsPipelineCreateInfo create_info{};
8987 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8988 create_info.stageCount = 2;
8989 create_info.pStages = stages;
8990 create_info.pVertexInputState = &vertex_input_state;
8991 create_info.pInputAssemblyState = &input_assembly_state;
8992 create_info.pViewportState = &viewport_state;
8993 create_info.pMultisampleState = &multisample_state;
8994 create_info.pRasterizationState = &rasterization_state;
8995 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8996 create_info.layout = pipeline_layout;
8997 create_info.renderPass = renderPass();
8998
8999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01410);
9000 VkPipeline pipeline;
9001 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9002 m_errorMonitor->VerifyFound();
9003 }
9004
9005 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9006 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9007}
9008
9009TEST_F(VkLayerTest, VALIDATION_ERROR_01411) {
9010 TEST_DESCRIPTION("Test VALIDATION_ERROR_01411: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
9011
9012 ASSERT_NO_FATAL_FAILURE(Init());
9013 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9014
9015 VkPipelineCache pipeline_cache;
9016 {
9017 VkPipelineCacheCreateInfo create_info{};
9018 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9019
9020 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
9021 ASSERT_VK_SUCCESS(err);
9022 }
9023
9024 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9025 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9026
9027 VkPipelineShaderStageCreateInfo stages[2]{{}};
9028 stages[0] = vs.GetStageCreateInfo();
9029 stages[1] = fs.GetStageCreateInfo();
9030
9031 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
9032 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9033 vertex_input_attribute_description.binding = m_device->props.limits.maxVertexInputBindings;
9034
9035 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9036 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9037 vertex_input_state.pNext = nullptr;
9038 vertex_input_state.vertexBindingDescriptionCount = 0;
9039 vertex_input_state.pVertexBindingDescriptions = nullptr;
9040 vertex_input_state.vertexAttributeDescriptionCount = 1;
9041 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9042
9043 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9044 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9045 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9046
9047 VkViewport viewport{};
9048 VkPipelineViewportStateCreateInfo viewport_state{};
9049 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9050 viewport_state.scissorCount = 1;
9051 viewport_state.viewportCount = 1;
9052 viewport_state.pViewports = &viewport;
9053
9054 VkPipelineMultisampleStateCreateInfo multisample_state{};
9055 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9056 multisample_state.pNext = nullptr;
9057 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9058 multisample_state.sampleShadingEnable = 0;
9059 multisample_state.minSampleShading = 1.0;
9060 multisample_state.pSampleMask = nullptr;
9061
9062 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9063 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9064 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9065 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9066 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9067 rasterization_state.depthClampEnable = VK_FALSE;
9068 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9069 rasterization_state.depthBiasEnable = VK_FALSE;
9070
9071 VkPipelineLayout pipeline_layout;
9072 {
9073 VkPipelineLayoutCreateInfo create_info{};
9074 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9075 create_info.setLayoutCount = 0;
9076 create_info.pSetLayouts = nullptr;
9077
9078 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9079 ASSERT_VK_SUCCESS(err);
9080 }
9081
9082 {
9083 VkGraphicsPipelineCreateInfo create_info{};
9084 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9085 create_info.stageCount = 2;
9086 create_info.pStages = stages;
9087 create_info.pVertexInputState = &vertex_input_state;
9088 create_info.pInputAssemblyState = &input_assembly_state;
9089 create_info.pViewportState = &viewport_state;
9090 create_info.pMultisampleState = &multisample_state;
9091 create_info.pRasterizationState = &rasterization_state;
9092 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9093 create_info.layout = pipeline_layout;
9094 create_info.renderPass = renderPass();
9095
9096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01411);
9097 VkPipeline pipeline;
9098 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9099 m_errorMonitor->VerifyFound();
9100 }
9101
9102 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9103 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9104}
9105
9106TEST_F(VkLayerTest, VALIDATION_ERROR_01412) {
9107 TEST_DESCRIPTION(
9108 "Test VALIDATION_ERROR_01412: offset must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributeOffset");
9109
9110 ASSERT_NO_FATAL_FAILURE(Init());
9111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9112
9113 VkPipelineCache pipeline_cache;
9114 {
9115 VkPipelineCacheCreateInfo create_info{};
9116 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9117
9118 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
9119 ASSERT_VK_SUCCESS(err);
9120 }
9121
9122 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9123 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9124
9125 VkPipelineShaderStageCreateInfo stages[2]{{}};
9126 stages[0] = vs.GetStageCreateInfo();
9127 stages[1] = fs.GetStageCreateInfo();
9128
9129 // Test when offset is greater than maximum.
9130 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9131 vertex_input_attribute_description.offset = m_device->props.limits.maxVertexInputAttributeOffset + 1;
9132
9133 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9134 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9135 vertex_input_state.pNext = nullptr;
9136 vertex_input_state.vertexBindingDescriptionCount = 0;
9137 vertex_input_state.pVertexBindingDescriptions = nullptr;
9138 vertex_input_state.vertexAttributeDescriptionCount = 1;
9139 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9140
9141 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9142 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9143 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9144
9145 VkViewport viewport{};
9146 VkPipelineViewportStateCreateInfo viewport_state{};
9147 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9148 viewport_state.scissorCount = 1;
9149 viewport_state.viewportCount = 1;
9150 viewport_state.pViewports = &viewport;
9151
9152 VkPipelineMultisampleStateCreateInfo multisample_state{};
9153 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9154 multisample_state.pNext = nullptr;
9155 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9156 multisample_state.sampleShadingEnable = 0;
9157 multisample_state.minSampleShading = 1.0;
9158 multisample_state.pSampleMask = nullptr;
9159
9160 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9161 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9162 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9163 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9164 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9165 rasterization_state.depthClampEnable = VK_FALSE;
9166 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9167 rasterization_state.depthBiasEnable = VK_FALSE;
9168
9169 VkPipelineLayout pipeline_layout;
9170 {
9171 VkPipelineLayoutCreateInfo create_info{};
9172 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9173 create_info.setLayoutCount = 0;
9174 create_info.pSetLayouts = nullptr;
9175
9176 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9177 ASSERT_VK_SUCCESS(err);
9178 }
9179
9180 {
9181 VkGraphicsPipelineCreateInfo create_info{};
9182 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9183 create_info.stageCount = 2;
9184 create_info.pStages = stages;
9185 create_info.pVertexInputState = &vertex_input_state;
9186 create_info.pInputAssemblyState = &input_assembly_state;
9187 create_info.pViewportState = &viewport_state;
9188 create_info.pMultisampleState = &multisample_state;
9189 create_info.pRasterizationState = &rasterization_state;
9190 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9191 create_info.layout = pipeline_layout;
9192 create_info.renderPass = renderPass();
9193
9194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01412);
9195 VkPipeline pipeline;
9196 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9197 m_errorMonitor->VerifyFound();
9198 }
9199
9200 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9201 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9202}
9203
Karl Schultz6addd812016-02-02 17:17:23 -07009204TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009205 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07009207 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009208
Tony Barbour1fa09702017-03-16 12:09:08 -06009209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009211
Tony Barbour552f6c02016-12-21 14:34:07 -07009212 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009213 // Don't care about RenderPass handle b/c error should be flagged before
9214 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009215 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009217 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009218}
9219
Karl Schultz6addd812016-02-02 17:17:23 -07009220TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009221 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9223 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009224
Tony Barbour1fa09702017-03-16 12:09:08 -06009225 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009227
Tony Barbour552f6c02016-12-21 14:34:07 -07009228 m_commandBuffer->BeginCommandBuffer();
9229 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07009230 // Just create a dummy Renderpass that's non-NULL so we can get to the
9231 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009232 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009233
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009234 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009235}
9236
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009237TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009238 TEST_DESCRIPTION(
9239 "Begin a renderPass where clearValueCount is less than"
9240 "the number of renderPass attachments that use loadOp"
9241 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009242
Tony Barbour1fa09702017-03-16 12:09:08 -06009243 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009244 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9245
9246 // Create a renderPass with a single attachment that uses loadOp CLEAR
9247 VkAttachmentReference attach = {};
9248 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9249 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009250 subpass.colorAttachmentCount = 1;
9251 subpass.pColorAttachments = &attach;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009252 VkRenderPassCreateInfo rpci = {};
9253 rpci.subpassCount = 1;
9254 rpci.pSubpasses = &subpass;
9255 rpci.attachmentCount = 1;
9256 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07009257 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009258 // Set loadOp to CLEAR
9259 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9260 rpci.pAttachments = &attach_desc;
9261 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9262 VkRenderPass rp;
9263 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9264
9265 VkCommandBufferInheritanceInfo hinfo = {};
9266 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9267 hinfo.renderPass = VK_NULL_HANDLE;
9268 hinfo.subpass = 0;
9269 hinfo.framebuffer = VK_NULL_HANDLE;
9270 hinfo.occlusionQueryEnable = VK_FALSE;
9271 hinfo.queryFlags = 0;
9272 hinfo.pipelineStatistics = 0;
9273 VkCommandBufferBeginInfo info = {};
9274 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9275 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9276 info.pInheritanceInfo = &hinfo;
9277
9278 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9279 VkRenderPassBeginInfo rp_begin = {};
9280 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9281 rp_begin.pNext = NULL;
9282 rp_begin.renderPass = renderPass();
9283 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009284 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009285
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009288 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009289
9290 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009291
9292 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009293}
9294
Slawomir Cygan0808f392016-11-28 17:53:23 +01009295TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009296 TEST_DESCRIPTION(
9297 "Begin a renderPass where clearValueCount is greater than"
9298 "the number of renderPass attachments that use loadOp"
9299 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009300
Tony Barbour1fa09702017-03-16 12:09:08 -06009301 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01009302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9303
9304 // Create a renderPass with a single attachment that uses loadOp CLEAR
9305 VkAttachmentReference attach = {};
9306 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9307 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009308 subpass.colorAttachmentCount = 1;
9309 subpass.pColorAttachments = &attach;
Slawomir Cygan0808f392016-11-28 17:53:23 +01009310 VkRenderPassCreateInfo rpci = {};
9311 rpci.subpassCount = 1;
9312 rpci.pSubpasses = &subpass;
9313 rpci.attachmentCount = 1;
9314 VkAttachmentDescription attach_desc = {};
9315 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
9316 // Set loadOp to CLEAR
9317 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9318 rpci.pAttachments = &attach_desc;
9319 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9320 VkRenderPass rp;
9321 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9322
9323 VkCommandBufferBeginInfo info = {};
9324 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9325 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9326
9327 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9328 VkRenderPassBeginInfo rp_begin = {};
9329 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9330 rp_begin.pNext = NULL;
9331 rp_begin.renderPass = renderPass();
9332 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009333 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01009334
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
9336 " has a clearValueCount of"
9337 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009338
9339 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
9340
9341 m_errorMonitor->VerifyFound();
9342
9343 vkDestroyRenderPass(m_device->device(), rp, NULL);
9344}
9345
Cody Northrop3bb4d962016-05-09 16:15:57 -06009346TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06009347 TEST_DESCRIPTION("End a command buffer with an active render pass");
9348
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9350 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06009351
Tony Barbour1fa09702017-03-16 12:09:08 -06009352 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9354
Tony Barbour552f6c02016-12-21 14:34:07 -07009355 m_commandBuffer->BeginCommandBuffer();
9356 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9357 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009358
9359 m_errorMonitor->VerifyFound();
9360
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009361 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9362 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06009363}
9364
Karl Schultz6addd812016-02-02 17:17:23 -07009365TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009366 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9368 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009369
Tony Barbour1fa09702017-03-16 12:09:08 -06009370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009371 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009372
Tony Barbour552f6c02016-12-21 14:34:07 -07009373 m_commandBuffer->BeginCommandBuffer();
9374 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009375
9376 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009377 vk_testing::Buffer dstBuffer;
9378 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009379
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009380 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009381
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009382 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009383}
9384
Karl Schultz6addd812016-02-02 17:17:23 -07009385TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009386 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9388 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009389
Tony Barbour1fa09702017-03-16 12:09:08 -06009390 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009392
Tony Barbour552f6c02016-12-21 14:34:07 -07009393 m_commandBuffer->BeginCommandBuffer();
9394 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009395
9396 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009397 vk_testing::Buffer dstBuffer;
9398 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009399
Karl Schultz6addd812016-02-02 17:17:23 -07009400 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07009401 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
9402 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
9403 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009404
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009405 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009406}
9407
Karl Schultz6addd812016-02-02 17:17:23 -07009408TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009409 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9411 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009412
Tony Barbour1fa09702017-03-16 12:09:08 -06009413 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009414 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009415
Tony Barbour552f6c02016-12-21 14:34:07 -07009416 m_commandBuffer->BeginCommandBuffer();
9417 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009418
Michael Lentine0a369f62016-02-03 16:51:46 -06009419 VkClearColorValue clear_color;
9420 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009421 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9422 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9423 const int32_t tex_width = 32;
9424 const int32_t tex_height = 32;
9425 VkImageCreateInfo image_create_info = {};
9426 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9427 image_create_info.pNext = NULL;
9428 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9429 image_create_info.format = tex_format;
9430 image_create_info.extent.width = tex_width;
9431 image_create_info.extent.height = tex_height;
9432 image_create_info.extent.depth = 1;
9433 image_create_info.mipLevels = 1;
9434 image_create_info.arrayLayers = 1;
9435 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9436 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07009437 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009438
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009439 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009440 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009441
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009442 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009443
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009444 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009445
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009446 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009447}
9448
Karl Schultz6addd812016-02-02 17:17:23 -07009449TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009450 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9452 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009453
Tony Barbour1fa09702017-03-16 12:09:08 -06009454 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009456
Dave Houlton1d2022c2017-03-29 11:43:58 -06009457 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009458 if (!depth_format) {
9459 printf(" No Depth + Stencil format found. Skipped.\n");
9460 return;
9461 }
9462
Tony Barbour552f6c02016-12-21 14:34:07 -07009463 m_commandBuffer->BeginCommandBuffer();
9464 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009465
9466 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009467 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009468 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9469 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07009470 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07009471 image_create_info.extent.width = 64;
9472 image_create_info.extent.height = 64;
9473 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9474 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009475
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009476 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009477 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009478
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009479 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009480
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009481 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9482 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009483
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009484 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009485}
9486
Karl Schultz6addd812016-02-02 17:17:23 -07009487TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009488 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009489 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009490
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9492 "vkCmdClearAttachments(): This call "
9493 "must be issued inside an active "
9494 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009495
Tony Barbour1fa09702017-03-16 12:09:08 -06009496 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009497 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009498
9499 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009500 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009501 ASSERT_VK_SUCCESS(err);
9502
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009503 VkClearAttachment color_attachment;
9504 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9505 color_attachment.clearValue.color.float32[0] = 0;
9506 color_attachment.clearValue.color.float32[1] = 0;
9507 color_attachment.clearValue.color.float32[2] = 0;
9508 color_attachment.clearValue.color.float32[3] = 0;
9509 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009510 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009511 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009512
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009513 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009514}
9515
Chris Forbes3b97e932016-09-07 11:29:24 +12009516TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009517 TEST_DESCRIPTION(
9518 "Test that an error is produced when CmdNextSubpass is "
9519 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009520
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9522 "vkCmdNextSubpass(): Attempted to advance "
9523 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009524
Tony Barbour1fa09702017-03-16 12:09:08 -06009525 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009526 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9527
Tony Barbour552f6c02016-12-21 14:34:07 -07009528 m_commandBuffer->BeginCommandBuffer();
9529 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009530
9531 // error here.
9532 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9533 m_errorMonitor->VerifyFound();
9534
Tony Barbour552f6c02016-12-21 14:34:07 -07009535 m_commandBuffer->EndRenderPass();
9536 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009537}
9538
Chris Forbes6d624702016-09-07 13:57:05 +12009539TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009540 TEST_DESCRIPTION(
9541 "Test that an error is produced when CmdEndRenderPass is "
9542 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009543
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9545 "vkCmdEndRenderPass(): Called before reaching "
9546 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009547
Tony Barbour1fa09702017-03-16 12:09:08 -06009548 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009549 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9550 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009551
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009552 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009553
9554 VkRenderPass rp;
9555 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9556 ASSERT_VK_SUCCESS(err);
9557
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009558 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009559
9560 VkFramebuffer fb;
9561 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9562 ASSERT_VK_SUCCESS(err);
9563
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009564 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009565
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009566 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 +12009567
9568 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9569
9570 // Error here.
9571 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9572 m_errorMonitor->VerifyFound();
9573
9574 // Clean up.
9575 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9576 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9577}
9578
Karl Schultz9e66a292016-04-21 15:57:51 -06009579TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9580 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9582 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009583
Tony Barbour1fa09702017-03-16 12:09:08 -06009584 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009585 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009586
9587 VkBufferMemoryBarrier buf_barrier = {};
9588 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9589 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9590 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9591 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9592 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9593 buf_barrier.buffer = VK_NULL_HANDLE;
9594 buf_barrier.offset = 0;
9595 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009596 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9597 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009598
9599 m_errorMonitor->VerifyFound();
9600}
9601
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009602TEST_F(VkLayerTest, InvalidBarriers) {
9603 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9604
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009606
Tony Barbour1fa09702017-03-16 12:09:08 -06009607 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009608 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009609 if (!depth_format) {
9610 printf(" No Depth + Stencil format found. Skipped.\n");
9611 return;
9612 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9614
9615 VkMemoryBarrier mem_barrier = {};
9616 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9617 mem_barrier.pNext = NULL;
9618 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9619 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009620 m_commandBuffer->BeginCommandBuffer();
9621 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009622 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009623 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009624 &mem_barrier, 0, nullptr, 0, nullptr);
9625 m_errorMonitor->VerifyFound();
9626
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009628 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009629 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 -06009630 ASSERT_TRUE(image.initialized());
9631 VkImageMemoryBarrier img_barrier = {};
9632 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9633 img_barrier.pNext = NULL;
9634 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9635 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009636 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009637 // New layout can't be UNDEFINED
9638 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9639 img_barrier.image = image.handle();
9640 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9641 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9642 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9643 img_barrier.subresourceRange.baseArrayLayer = 0;
9644 img_barrier.subresourceRange.baseMipLevel = 0;
9645 img_barrier.subresourceRange.layerCount = 1;
9646 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009647 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9648 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009649 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009650
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009651 // Transition image to color attachment optimal
9652 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9653 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9654 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9655 nullptr, 0, nullptr, 1, &img_barrier);
9656 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009657
Mark Lobodzinski45daf6e2017-05-10 13:19:02 -06009658 // Try to change layout in a renderpass
9659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02080);
9660 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9661 nullptr, 0, nullptr, 1, &img_barrier);
9662 m_errorMonitor->VerifyFound();
9663
9664 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009666 // baseArrayLayer + layerCount must be <= image's arrayLayers
9667 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009668 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9669 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009670 m_errorMonitor->VerifyFound();
9671 img_barrier.subresourceRange.baseArrayLayer = 0;
9672
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009674 // baseMipLevel + levelCount must be <= image's mipLevels
9675 img_barrier.subresourceRange.baseMipLevel = 1;
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, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009678 m_errorMonitor->VerifyFound();
9679 img_barrier.subresourceRange.baseMipLevel = 0;
9680
Mike Weiblen7053aa32017-01-25 15:21:10 -07009681 // levelCount must be non-zero.
9682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9683 img_barrier.subresourceRange.levelCount = 0;
9684 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9685 nullptr, 0, nullptr, 1, &img_barrier);
9686 m_errorMonitor->VerifyFound();
9687 img_barrier.subresourceRange.levelCount = 1;
9688
9689 // layerCount must be non-zero.
9690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9691 img_barrier.subresourceRange.layerCount = 0;
9692 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9693 nullptr, 0, nullptr, 1, &img_barrier);
9694 m_errorMonitor->VerifyFound();
9695 img_barrier.subresourceRange.layerCount = 1;
9696
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009697 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 -06009698 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009699 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9700 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009701 VkBufferMemoryBarrier buf_barrier = {};
9702 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9703 buf_barrier.pNext = NULL;
9704 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9705 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9706 buf_barrier.buffer = buffer.handle();
9707 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9708 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9709 buf_barrier.offset = 0;
9710 buf_barrier.size = VK_WHOLE_SIZE;
9711 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009712 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9713 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009714 m_errorMonitor->VerifyFound();
9715 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9716
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009718 buf_barrier.offset = 257;
9719 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009720 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9721 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009722 m_errorMonitor->VerifyFound();
9723 buf_barrier.offset = 0;
9724
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009726 buf_barrier.size = 257;
9727 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009728 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9729 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009730 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009731
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009732 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009735 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009736 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009737 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009738 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9739 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009740 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009741
9742 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009743 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009744 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9745 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009746 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009747
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009748 // Having only one of depth or stencil set for DS image is an error
9749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9750 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9751 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9752 nullptr, 0, nullptr, 1, &img_barrier);
9753 m_errorMonitor->VerifyFound();
9754
9755 // Having anything other than DEPTH and STENCIL is an error
9756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009757 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9758 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9759 nullptr, 0, nullptr, 1, &img_barrier);
9760 m_errorMonitor->VerifyFound();
9761
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009762 // Now test depth-only
9763 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009764 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9765 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009766 VkDepthStencilObj d_image(m_device);
9767 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9768 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009769 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009770 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009771 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009772
9773 // DEPTH bit must be set
9774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9775 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009776 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009777 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9778 0, nullptr, 0, nullptr, 1, &img_barrier);
9779 m_errorMonitor->VerifyFound();
9780
9781 // No bits other than DEPTH may be set
9782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9783 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9784 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009785 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9786 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009787 m_errorMonitor->VerifyFound();
9788 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009789
9790 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009791 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9792 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009793 VkDepthStencilObj s_image(m_device);
9794 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9795 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009796 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009797 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009798 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009799 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9801 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009802 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009803 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9804 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009805 m_errorMonitor->VerifyFound();
9806 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009807
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009808 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009809 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009810 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 -06009811 ASSERT_TRUE(c_image.initialized());
9812 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9813 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9814 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009815
9816 // COLOR bit must be set
9817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9818 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009819 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009820 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9821 nullptr, 0, nullptr, 1, &img_barrier);
9822 m_errorMonitor->VerifyFound();
9823
9824 // No bits other than COLOR may be set
9825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9826 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9827 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009828 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9829 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009830 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009831
Mike Weiblene6e01172017-03-07 22:18:40 -07009832 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9833 {
9834 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009835 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 -07009836 ASSERT_TRUE(img_color.initialized());
9837
9838 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009839 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 -07009840 ASSERT_TRUE(img_ds.initialized());
9841
9842 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009843 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 -07009844 ASSERT_TRUE(img_xfer_src.initialized());
9845
9846 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009847 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 -07009848 ASSERT_TRUE(img_xfer_dst.initialized());
9849
9850 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009851 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 -07009852 ASSERT_TRUE(img_sampled.initialized());
9853
9854 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009855 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 -07009856 ASSERT_TRUE(img_input.initialized());
9857
9858 const struct {
9859 VkImageObj &image_obj;
9860 VkImageLayout bad_layout;
9861 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9862 } bad_buffer_layouts[] = {
9863 // clang-format off
9864 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9865 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9866 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9867 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9868 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9869 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9870 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9871 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9872 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9873 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9874 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9875 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9876 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9877 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9878 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9879 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9880 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9881 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9882 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9883 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9884 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9885 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9886 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9887 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9888 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9889 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9890 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9891 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9892 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9893 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9894 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9895 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9896 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9897 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9898 // clang-format on
9899 };
9900 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9901
9902 for (uint32_t i = 0; i < layout_count; ++i) {
9903 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9904 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9905 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9906 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9907 : VK_IMAGE_ASPECT_COLOR_BIT;
9908
9909 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9910 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9912 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9913 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9914 m_errorMonitor->VerifyFound();
9915
9916 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9917 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9919 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9920 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9921 m_errorMonitor->VerifyFound();
9922 }
9923
9924 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9925 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9926 }
9927
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009928 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9929
9930 // Create command pool with incompatible queueflags
9931 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009932 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009933 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009934 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009935 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009936 }
9937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9938
9939 VkCommandPool command_pool;
9940 VkCommandPoolCreateInfo pool_create_info{};
9941 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9942 pool_create_info.queueFamilyIndex = queue_family_index;
9943 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9944 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9945
9946 // Allocate a command buffer
9947 VkCommandBuffer bad_command_buffer;
9948 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9949 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9950 command_buffer_allocate_info.commandPool = command_pool;
9951 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9952 command_buffer_allocate_info.commandBufferCount = 1;
9953 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9954
9955 VkCommandBufferBeginInfo cbbi = {};
9956 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9957 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9958 buf_barrier.offset = 0;
9959 buf_barrier.size = VK_WHOLE_SIZE;
9960 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9961 &buf_barrier, 0, nullptr);
9962 m_errorMonitor->VerifyFound();
9963
9964 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9965 vkEndCommandBuffer(bad_command_buffer);
9966 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009967 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009968 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009969 }
9970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9971 VkEvent event;
9972 VkEventCreateInfo event_create_info{};
9973 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9974 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9975 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9976 nullptr, 0, nullptr);
9977 m_errorMonitor->VerifyFound();
9978
9979 vkEndCommandBuffer(bad_command_buffer);
9980 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009981}
9982
Chris Forbes50223732017-05-01 09:43:35 -07009983TEST_F(VkPositiveLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9984 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ
9985 // in srcAccessMask.
Tony Barbour18ba25c2016-09-29 13:42:40 -06009986
Chris Forbes50223732017-05-01 09:43:35 -07009987 // The required behavior here was a bit unclear in earlier versions of the
9988 // spec, but there is no memory dependency required here, so this should
9989 // work without warnings.
9990
9991 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -06009992 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009993 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009994 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 -07009995 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009996 ASSERT_TRUE(image.initialized());
9997
9998 VkImageMemoryBarrier barrier = {};
9999 VkImageSubresourceRange range;
10000 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tony Barbour18ba25c2016-09-29 13:42:40 -060010001 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
Chris Forbes50223732017-05-01 09:43:35 -070010002 barrier.dstAccessMask = 0;
Tony Barbour18ba25c2016-09-29 13:42:40 -060010003 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10004 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
10005 barrier.image = image.handle();
10006 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10007 range.baseMipLevel = 0;
10008 range.levelCount = 1;
10009 range.baseArrayLayer = 0;
10010 range.layerCount = 1;
10011 barrier.subresourceRange = range;
10012 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
10013 cmdbuf.BeginCommandBuffer();
10014 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
10015 &barrier);
10016 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
10017 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10018 barrier.srcAccessMask = 0;
10019 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
10020 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
10021 &barrier);
10022
Chris Forbes50223732017-05-01 09:43:35 -070010023 m_errorMonitor->VerifyNotFound();
Tony Barbour18ba25c2016-09-29 13:42:40 -060010024}
10025
Karl Schultz6addd812016-02-02 17:17:23 -070010026TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010027 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -060010028 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010029 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010030
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010031 uint32_t const indices[] = {0};
10032 VkBufferCreateInfo buf_info = {};
10033 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10034 buf_info.size = 1024;
10035 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10036 buf_info.queueFamilyIndexCount = 1;
10037 buf_info.pQueueFamilyIndices = indices;
10038
10039 VkBuffer buffer;
10040 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
10041 ASSERT_VK_SUCCESS(err);
10042
10043 VkMemoryRequirements requirements;
10044 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
10045
10046 VkMemoryAllocateInfo alloc_info{};
10047 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10048 alloc_info.pNext = NULL;
10049 alloc_info.memoryTypeIndex = 0;
10050 alloc_info.allocationSize = requirements.size;
10051 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
10052 ASSERT_TRUE(pass);
10053
10054 VkDeviceMemory memory;
10055 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
10056 ASSERT_VK_SUCCESS(err);
10057
10058 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010059 ASSERT_VK_SUCCESS(err);
10060
Tony Barbour552f6c02016-12-21 14:34:07 -070010061 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010062 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010063
Karl Schultz6addd812016-02-02 17:17:23 -070010064 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10065 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010066 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10068 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010069 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010070
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010071 vkFreeMemory(m_device->device(), memory, NULL);
10072 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010073}
10074
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010075TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10076 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -060010077 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10079 VkBufferCreateInfo buffCI = {};
10080 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10081 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010082 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010083 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010084 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010085 uint32_t qfi[2];
10086 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010087 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010088
10089 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010090 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010091
10092 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Petr Kraus97291752017-05-11 01:05:16 +020010094 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (= 777) is not one of the queue "
10095 "families given via VkDeviceQueueCreateInfo structures when the device was created.");
Mark Lobodzinski1f9ebb72017-05-11 15:25:51 -060010096 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010097 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010098
10099 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -070010100 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
10102
10103 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
10104 buffCI.queueFamilyIndexCount = 2;
10105 qfi[0] = 1;
10106 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -070010107 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010108 VkDeviceMemory mem;
10109 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -070010110 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010111
10112 VkMemoryAllocateInfo alloc_info = {};
10113 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10114 alloc_info.allocationSize = 1024;
10115 bool pass = false;
10116 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
10117 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -070010118 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010119 return;
10120 }
10121 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -070010122 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010123
10124 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -070010125 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010126 m_commandBuffer->end();
10127 QueueCommandBuffer(false);
10128 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -070010129 vkDestroyBuffer(m_device->device(), ib2, NULL);
10130 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010131 }
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010132}
10133
Karl Schultz6addd812016-02-02 17:17:23 -070010134TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010135 TEST_DESCRIPTION(
10136 "Attempt vkCmdExecuteCommands with a primary command buffer"
10137 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010138
Tony Barbour1fa09702017-03-16 12:09:08 -060010139 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010140 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010141
Chris Forbesf29a84f2016-10-06 18:39:28 +130010142 // An empty primary command buffer
10143 VkCommandBufferObj cb(m_device, m_commandPool);
10144 cb.BeginCommandBuffer();
10145 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010146
Chris Forbesf29a84f2016-10-06 18:39:28 +130010147 m_commandBuffer->BeginCommandBuffer();
10148 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10149 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010150
Chris Forbesf29a84f2016-10-06 18:39:28 +130010151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
10152 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010153 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070010154
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060010155 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010156}
10157
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010158TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010159 TEST_DESCRIPTION(
10160 "Attempt to update descriptor sets for images and buffers "
10161 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010162 VkResult err;
10163
Tony Barbour1fa09702017-03-16 12:09:08 -060010164 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010165 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10166 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10167 ds_type_count[i].type = VkDescriptorType(i);
10168 ds_type_count[i].descriptorCount = 1;
10169 }
10170 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10171 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10172 ds_pool_ci.pNext = NULL;
10173 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10174 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10175 ds_pool_ci.pPoolSizes = ds_type_count;
10176
10177 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010178 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010179 ASSERT_VK_SUCCESS(err);
10180
10181 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010182 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010183 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10184 dsl_binding[i].binding = 0;
10185 dsl_binding[i].descriptorType = VkDescriptorType(i);
10186 dsl_binding[i].descriptorCount = 1;
10187 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10188 dsl_binding[i].pImmutableSamplers = NULL;
10189 }
10190
10191 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10192 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10193 ds_layout_ci.pNext = NULL;
10194 ds_layout_ci.bindingCount = 1;
10195 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10196 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10197 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010198 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010199 ASSERT_VK_SUCCESS(err);
10200 }
10201 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10202 VkDescriptorSetAllocateInfo alloc_info = {};
10203 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10204 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10205 alloc_info.descriptorPool = ds_pool;
10206 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010207 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010208 ASSERT_VK_SUCCESS(err);
10209
10210 // Create a buffer & bufferView to be used for invalid updates
10211 VkBufferCreateInfo buff_ci = {};
10212 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -070010213 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010214 buff_ci.size = 256;
10215 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -070010216 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010217 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10218 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -070010219
10220 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
10221 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
10222 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
10223 ASSERT_VK_SUCCESS(err);
10224
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010225 VkMemoryRequirements mem_reqs;
10226 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10227 VkMemoryAllocateInfo mem_alloc_info = {};
10228 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10229 mem_alloc_info.pNext = NULL;
10230 mem_alloc_info.memoryTypeIndex = 0;
10231 mem_alloc_info.allocationSize = mem_reqs.size;
10232 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10233 if (!pass) {
10234 vkDestroyBuffer(m_device->device(), buffer, NULL);
10235 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10236 return;
10237 }
10238 VkDeviceMemory mem;
10239 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
10240 ASSERT_VK_SUCCESS(err);
10241 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10242 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010243
10244 VkBufferViewCreateInfo buff_view_ci = {};
10245 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10246 buff_view_ci.buffer = buffer;
10247 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10248 buff_view_ci.range = VK_WHOLE_SIZE;
10249 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010250 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010251 ASSERT_VK_SUCCESS(err);
10252
Tony Barbour415497c2017-01-24 10:06:09 -070010253 // Now get resources / view for storage_texel_buffer
10254 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
10255 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10256 if (!pass) {
10257 vkDestroyBuffer(m_device->device(), buffer, NULL);
10258 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10259 vkFreeMemory(m_device->device(), mem, NULL);
10260 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
10261 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10262 return;
10263 }
10264 VkDeviceMemory storage_texel_buffer_mem;
10265 VkBufferView storage_texel_buffer_view;
10266 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
10267 ASSERT_VK_SUCCESS(err);
10268 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
10269 ASSERT_VK_SUCCESS(err);
10270 buff_view_ci.buffer = storage_texel_buffer;
10271 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
10272 ASSERT_VK_SUCCESS(err);
10273
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010274 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -070010275 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010276 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -070010277 image_ci.format = VK_FORMAT_UNDEFINED;
10278 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
10279 VkFormat format = static_cast<VkFormat>(f);
10280 VkFormatProperties fProps = m_device->format_properties(format);
10281 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10282 image_ci.format = format;
10283 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10284 break;
10285 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10286 image_ci.format = format;
10287 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
10288 break;
10289 }
10290 }
10291 if (image_ci.format == VK_FORMAT_UNDEFINED) {
10292 return;
10293 }
10294
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010295 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10296 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010297 image_ci.extent.width = 64;
10298 image_ci.extent.height = 64;
10299 image_ci.extent.depth = 1;
10300 image_ci.mipLevels = 1;
10301 image_ci.arrayLayers = 1;
10302 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010303 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010304 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010305 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10306 VkImage image;
10307 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10308 ASSERT_VK_SUCCESS(err);
10309 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010310 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010311
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010312 VkMemoryAllocateInfo mem_alloc = {};
10313 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10314 mem_alloc.pNext = NULL;
10315 mem_alloc.allocationSize = 0;
10316 mem_alloc.memoryTypeIndex = 0;
10317 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10318 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010319 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010320 ASSERT_TRUE(pass);
10321 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10322 ASSERT_VK_SUCCESS(err);
10323 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10324 ASSERT_VK_SUCCESS(err);
10325 // Now create view for image
10326 VkImageViewCreateInfo image_view_ci = {};
10327 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10328 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010329 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010330 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10331 image_view_ci.subresourceRange.layerCount = 1;
10332 image_view_ci.subresourceRange.baseArrayLayer = 0;
10333 image_view_ci.subresourceRange.levelCount = 1;
10334 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10335 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010336 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010337 ASSERT_VK_SUCCESS(err);
10338
10339 VkDescriptorBufferInfo buff_info = {};
10340 buff_info.buffer = buffer;
10341 VkDescriptorImageInfo img_info = {};
10342 img_info.imageView = image_view;
10343 VkWriteDescriptorSet descriptor_write = {};
10344 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10345 descriptor_write.dstBinding = 0;
10346 descriptor_write.descriptorCount = 1;
10347 descriptor_write.pTexelBufferView = &buff_view;
10348 descriptor_write.pBufferInfo = &buff_info;
10349 descriptor_write.pImageInfo = &img_info;
10350
10351 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010352 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010353 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
10354 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
10355 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
10356 VALIDATION_ERROR_00943, // STORAGE_IMAGE
10357 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
10358 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
10359 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
10360 VALIDATION_ERROR_00947, // STORAGE_BUFFER
10361 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
10362 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
10363 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010364 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010365 // Start loop at 1 as SAMPLER desc type has no usage bit error
10366 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -070010367 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10368 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
10369 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
10370 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010371 descriptor_write.descriptorType = VkDescriptorType(i);
10372 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010374
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010375 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010376
10377 m_errorMonitor->VerifyFound();
10378 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010379 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10380 descriptor_write.pTexelBufferView = &buff_view;
10381 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010382 }
Tony Barbour415497c2017-01-24 10:06:09 -070010383
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010384 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10385 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010386 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010387 vkDestroyImageView(m_device->device(), image_view, NULL);
10388 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010389 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010390 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010391 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010392 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010393 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010394 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10395}
10396
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010397TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010398 TEST_DESCRIPTION(
10399 "Attempt to update buffer descriptor set that has incorrect "
10400 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010401 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010402 "2. range value of 0\n"
10403 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010404 VkResult err;
10405
Tony Barbour1fa09702017-03-16 12:09:08 -060010406 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010407 VkDescriptorPoolSize ds_type_count = {};
10408 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10409 ds_type_count.descriptorCount = 1;
10410
10411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10413 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010414 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010415 ds_pool_ci.maxSets = 1;
10416 ds_pool_ci.poolSizeCount = 1;
10417 ds_pool_ci.pPoolSizes = &ds_type_count;
10418
10419 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010420 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010421 ASSERT_VK_SUCCESS(err);
10422
10423 // Create layout with single uniform buffer descriptor
10424 VkDescriptorSetLayoutBinding dsl_binding = {};
10425 dsl_binding.binding = 0;
10426 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10427 dsl_binding.descriptorCount = 1;
10428 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10429 dsl_binding.pImmutableSamplers = NULL;
10430
10431 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10432 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10433 ds_layout_ci.pNext = NULL;
10434 ds_layout_ci.bindingCount = 1;
10435 ds_layout_ci.pBindings = &dsl_binding;
10436 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010437 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010438 ASSERT_VK_SUCCESS(err);
10439
10440 VkDescriptorSet descriptor_set = {};
10441 VkDescriptorSetAllocateInfo alloc_info = {};
10442 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10443 alloc_info.descriptorSetCount = 1;
10444 alloc_info.descriptorPool = ds_pool;
10445 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010446 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010447 ASSERT_VK_SUCCESS(err);
10448
10449 // Create a buffer to be used for invalid updates
10450 VkBufferCreateInfo buff_ci = {};
10451 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10452 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010453 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010454 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10455 VkBuffer buffer;
10456 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10457 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010458
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010459 // Have to bind memory to buffer before descriptor update
10460 VkMemoryAllocateInfo mem_alloc = {};
10461 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10462 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010463 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010464 mem_alloc.memoryTypeIndex = 0;
10465
10466 VkMemoryRequirements mem_reqs;
10467 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010468 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010469 if (!pass) {
10470 vkDestroyBuffer(m_device->device(), buffer, NULL);
10471 return;
10472 }
10473
10474 VkDeviceMemory mem;
10475 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10476 ASSERT_VK_SUCCESS(err);
10477 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10478 ASSERT_VK_SUCCESS(err);
10479
10480 VkDescriptorBufferInfo buff_info = {};
10481 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010482 // Cause error due to offset out of range
10483 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010484 buff_info.range = VK_WHOLE_SIZE;
10485 VkWriteDescriptorSet descriptor_write = {};
10486 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10487 descriptor_write.dstBinding = 0;
10488 descriptor_write.descriptorCount = 1;
10489 descriptor_write.pTexelBufferView = nullptr;
10490 descriptor_write.pBufferInfo = &buff_info;
10491 descriptor_write.pImageInfo = nullptr;
10492
10493 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10494 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010496
10497 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10498
10499 m_errorMonitor->VerifyFound();
10500 // Now cause error due to range of 0
10501 buff_info.offset = 0;
10502 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010504
10505 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10506
10507 m_errorMonitor->VerifyFound();
10508 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010509 buff_info.offset = 0;
10510 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010512
10513 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10514
10515 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010516 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010517 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10518 vkDestroyBuffer(m_device->device(), buffer, NULL);
10519 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10520 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10521}
10522
Tobin Ehlis845887e2017-02-02 19:01:44 -070010523TEST_F(VkLayerTest, DSBufferLimitErrors) {
10524 TEST_DESCRIPTION(
10525 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10526 "Test cases include:\n"
10527 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10528 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10529 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10530 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10531 VkResult err;
10532
Tony Barbour1fa09702017-03-16 12:09:08 -060010533 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010534 VkDescriptorPoolSize ds_type_count[2] = {};
10535 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10536 ds_type_count[0].descriptorCount = 1;
10537 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10538 ds_type_count[1].descriptorCount = 1;
10539
10540 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10541 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10542 ds_pool_ci.pNext = NULL;
10543 ds_pool_ci.maxSets = 1;
10544 ds_pool_ci.poolSizeCount = 2;
10545 ds_pool_ci.pPoolSizes = ds_type_count;
10546
10547 VkDescriptorPool ds_pool;
10548 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10549 ASSERT_VK_SUCCESS(err);
10550
10551 // Create layout with single uniform buffer & single storage buffer descriptor
10552 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10553 dsl_binding[0].binding = 0;
10554 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10555 dsl_binding[0].descriptorCount = 1;
10556 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10557 dsl_binding[0].pImmutableSamplers = NULL;
10558 dsl_binding[1].binding = 1;
10559 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10560 dsl_binding[1].descriptorCount = 1;
10561 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10562 dsl_binding[1].pImmutableSamplers = NULL;
10563
10564 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10565 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10566 ds_layout_ci.pNext = NULL;
10567 ds_layout_ci.bindingCount = 2;
10568 ds_layout_ci.pBindings = dsl_binding;
10569 VkDescriptorSetLayout ds_layout;
10570 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10571 ASSERT_VK_SUCCESS(err);
10572
10573 VkDescriptorSet descriptor_set = {};
10574 VkDescriptorSetAllocateInfo alloc_info = {};
10575 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10576 alloc_info.descriptorSetCount = 1;
10577 alloc_info.descriptorPool = ds_pool;
10578 alloc_info.pSetLayouts = &ds_layout;
10579 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10580 ASSERT_VK_SUCCESS(err);
10581
10582 // Create a buffer to be used for invalid updates
10583 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10584 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10585 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10586 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10587 VkBufferCreateInfo ub_ci = {};
10588 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10589 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10590 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10591 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10592 VkBuffer uniform_buffer;
10593 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10594 ASSERT_VK_SUCCESS(err);
10595 VkBufferCreateInfo sb_ci = {};
10596 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10597 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10598 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10599 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10600 VkBuffer storage_buffer;
10601 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10602 ASSERT_VK_SUCCESS(err);
10603 // Have to bind memory to buffer before descriptor update
10604 VkMemoryAllocateInfo mem_alloc = {};
10605 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10606 mem_alloc.pNext = NULL;
10607 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10608 mem_alloc.memoryTypeIndex = 0;
10609
Cort Stratton77a0d592017-02-17 13:14:13 -080010610 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10611 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10612 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10613 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10614 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010615 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010616 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010617 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010618 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10619 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010620 return;
10621 }
10622
10623 VkDeviceMemory mem;
10624 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010625 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010626 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010627 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10628 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10629 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10630 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10631 return;
10632 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010633 ASSERT_VK_SUCCESS(err);
10634 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10635 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010636 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010637 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10638 ASSERT_VK_SUCCESS(err);
10639
10640 VkDescriptorBufferInfo buff_info = {};
10641 buff_info.buffer = uniform_buffer;
10642 buff_info.range = ub_ci.size; // This will exceed limit
10643 VkWriteDescriptorSet descriptor_write = {};
10644 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10645 descriptor_write.dstBinding = 0;
10646 descriptor_write.descriptorCount = 1;
10647 descriptor_write.pTexelBufferView = nullptr;
10648 descriptor_write.pBufferInfo = &buff_info;
10649 descriptor_write.pImageInfo = nullptr;
10650
10651 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10652 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010653 if (max_ub_range != UINT32_MAX) {
10654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10655 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10656 m_errorMonitor->VerifyFound();
10657 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010658 // Reduce size of range to acceptable limit & cause offset error
10659 buff_info.range = max_ub_range;
10660 buff_info.offset = min_ub_align - 1;
10661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10663 m_errorMonitor->VerifyFound();
10664
10665 // Now break storage updates
10666 buff_info.buffer = storage_buffer;
10667 buff_info.range = sb_ci.size; // This will exceed limit
10668 buff_info.offset = 0; // Reset offset for this update
10669
10670 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10671 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010672 if (max_ub_range != UINT32_MAX) {
10673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10674 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10675 m_errorMonitor->VerifyFound();
10676 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010677
10678 // Reduce size of range to acceptable limit & cause offset error
10679 buff_info.range = max_sb_range;
10680 buff_info.offset = min_sb_align - 1;
10681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10682 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10683 m_errorMonitor->VerifyFound();
10684
10685 vkFreeMemory(m_device->device(), mem, NULL);
10686 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10687 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10688 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10689 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10690}
10691
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010692TEST_F(VkLayerTest, DSAspectBitsErrors) {
10693 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10694 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010695 TEST_DESCRIPTION(
10696 "Attempt to update descriptor sets for images "
10697 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010698 VkResult err;
10699
Tony Barbour1fa09702017-03-16 12:09:08 -060010700 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010701 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010702 if (!depth_format) {
10703 printf(" No Depth + Stencil format found. Skipped.\n");
10704 return;
10705 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010706 VkDescriptorPoolSize ds_type_count = {};
10707 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10708 ds_type_count.descriptorCount = 1;
10709
10710 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10711 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10712 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010713 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010714 ds_pool_ci.maxSets = 5;
10715 ds_pool_ci.poolSizeCount = 1;
10716 ds_pool_ci.pPoolSizes = &ds_type_count;
10717
10718 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010719 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010720 ASSERT_VK_SUCCESS(err);
10721
10722 VkDescriptorSetLayoutBinding dsl_binding = {};
10723 dsl_binding.binding = 0;
10724 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10725 dsl_binding.descriptorCount = 1;
10726 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10727 dsl_binding.pImmutableSamplers = NULL;
10728
10729 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10730 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10731 ds_layout_ci.pNext = NULL;
10732 ds_layout_ci.bindingCount = 1;
10733 ds_layout_ci.pBindings = &dsl_binding;
10734 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010735 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010736 ASSERT_VK_SUCCESS(err);
10737
10738 VkDescriptorSet descriptor_set = {};
10739 VkDescriptorSetAllocateInfo alloc_info = {};
10740 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10741 alloc_info.descriptorSetCount = 1;
10742 alloc_info.descriptorPool = ds_pool;
10743 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010744 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010745 ASSERT_VK_SUCCESS(err);
10746
10747 // Create an image to be used for invalid updates
10748 VkImageCreateInfo image_ci = {};
10749 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10750 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010751 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010752 image_ci.extent.width = 64;
10753 image_ci.extent.height = 64;
10754 image_ci.extent.depth = 1;
10755 image_ci.mipLevels = 1;
10756 image_ci.arrayLayers = 1;
10757 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010758 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010759 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10760 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10761 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10762 VkImage image;
10763 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10764 ASSERT_VK_SUCCESS(err);
10765 // Bind memory to image
10766 VkMemoryRequirements mem_reqs;
10767 VkDeviceMemory image_mem;
10768 bool pass;
10769 VkMemoryAllocateInfo mem_alloc = {};
10770 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10771 mem_alloc.pNext = NULL;
10772 mem_alloc.allocationSize = 0;
10773 mem_alloc.memoryTypeIndex = 0;
10774 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10775 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010776 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010777 ASSERT_TRUE(pass);
10778 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10779 ASSERT_VK_SUCCESS(err);
10780 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10781 ASSERT_VK_SUCCESS(err);
10782 // Now create view for image
10783 VkImageViewCreateInfo image_view_ci = {};
10784 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10785 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010786 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010787 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10788 image_view_ci.subresourceRange.layerCount = 1;
10789 image_view_ci.subresourceRange.baseArrayLayer = 0;
10790 image_view_ci.subresourceRange.levelCount = 1;
10791 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010792 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010793
10794 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010795 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010796 ASSERT_VK_SUCCESS(err);
10797
10798 VkDescriptorImageInfo img_info = {};
10799 img_info.imageView = image_view;
10800 VkWriteDescriptorSet descriptor_write = {};
10801 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10802 descriptor_write.dstBinding = 0;
10803 descriptor_write.descriptorCount = 1;
10804 descriptor_write.pTexelBufferView = NULL;
10805 descriptor_write.pBufferInfo = NULL;
10806 descriptor_write.pImageInfo = &img_info;
10807 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10808 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010809 const char *error_msg =
10810 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10811 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010813
10814 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10815
10816 m_errorMonitor->VerifyFound();
10817 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10818 vkDestroyImage(m_device->device(), image, NULL);
10819 vkFreeMemory(m_device->device(), image_mem, NULL);
10820 vkDestroyImageView(m_device->device(), image_view, NULL);
10821 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10822 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10823}
10824
Karl Schultz6addd812016-02-02 17:17:23 -070010825TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010826 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010827 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010828
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10830 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10831 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010832
Tony Barbour1fa09702017-03-16 12:09:08 -060010833 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010834 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010835 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010836 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10837 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010838
10839 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010840 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10841 ds_pool_ci.pNext = NULL;
10842 ds_pool_ci.maxSets = 1;
10843 ds_pool_ci.poolSizeCount = 1;
10844 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010845
Tobin Ehlis3b780662015-05-28 12:11:26 -060010846 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010847 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010848 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010849 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010850 dsl_binding.binding = 0;
10851 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10852 dsl_binding.descriptorCount = 1;
10853 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10854 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010855
Tony Barboureb254902015-07-15 12:50:33 -060010856 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010857 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10858 ds_layout_ci.pNext = NULL;
10859 ds_layout_ci.bindingCount = 1;
10860 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010861
Tobin Ehlis3b780662015-05-28 12:11:26 -060010862 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010863 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010864 ASSERT_VK_SUCCESS(err);
10865
10866 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010867 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010868 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010869 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010870 alloc_info.descriptorPool = ds_pool;
10871 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010872 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010873 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010874
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010875 VkSamplerCreateInfo sampler_ci = {};
10876 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10877 sampler_ci.pNext = NULL;
10878 sampler_ci.magFilter = VK_FILTER_NEAREST;
10879 sampler_ci.minFilter = VK_FILTER_NEAREST;
10880 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10881 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10882 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10883 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10884 sampler_ci.mipLodBias = 1.0;
10885 sampler_ci.anisotropyEnable = VK_FALSE;
10886 sampler_ci.maxAnisotropy = 1;
10887 sampler_ci.compareEnable = VK_FALSE;
10888 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10889 sampler_ci.minLod = 1.0;
10890 sampler_ci.maxLod = 1.0;
10891 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10892 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10893 VkSampler sampler;
10894 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10895 ASSERT_VK_SUCCESS(err);
10896
10897 VkDescriptorImageInfo info = {};
10898 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010899
10900 VkWriteDescriptorSet descriptor_write;
10901 memset(&descriptor_write, 0, sizeof(descriptor_write));
10902 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010903 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010904 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010905 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010906 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010907 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010908
10909 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10910
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010911 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010912
Chia-I Wuf7458c52015-10-26 21:10:41 +080010913 vkDestroySampler(m_device->device(), sampler, NULL);
10914 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10915 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010916}
10917
Karl Schultz6addd812016-02-02 17:17:23 -070010918TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010919 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010920 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010921
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010923
Tony Barbour1fa09702017-03-16 12:09:08 -060010924 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010925 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010926 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010927 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10928 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010929
10930 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010931 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10932 ds_pool_ci.pNext = NULL;
10933 ds_pool_ci.maxSets = 1;
10934 ds_pool_ci.poolSizeCount = 1;
10935 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010936
Tobin Ehlis3b780662015-05-28 12:11:26 -060010937 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010938 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010939 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010940
Tony Barboureb254902015-07-15 12:50:33 -060010941 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010942 dsl_binding.binding = 0;
10943 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10944 dsl_binding.descriptorCount = 1;
10945 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10946 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010947
10948 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010949 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10950 ds_layout_ci.pNext = NULL;
10951 ds_layout_ci.bindingCount = 1;
10952 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010953
Tobin Ehlis3b780662015-05-28 12:11:26 -060010954 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010955 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010956 ASSERT_VK_SUCCESS(err);
10957
10958 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010959 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010960 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010961 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010962 alloc_info.descriptorPool = ds_pool;
10963 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010964 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010965 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010966
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010967 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10968
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010969 // Correctly update descriptor to avoid "NOT_UPDATED" error
10970 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010971 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010972 buff_info.offset = 0;
10973 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010974
10975 VkWriteDescriptorSet descriptor_write;
10976 memset(&descriptor_write, 0, sizeof(descriptor_write));
10977 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010978 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010979 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010980 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010981 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10982 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010983
10984 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10985
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010986 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010987
Chia-I Wuf7458c52015-10-26 21:10:41 +080010988 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10989 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010990}
10991
Karl Schultz6addd812016-02-02 17:17:23 -070010992TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010993 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010994 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010995
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010997
Tony Barbour1fa09702017-03-16 12:09:08 -060010998 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010999 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011000 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011001 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11002 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011003
11004 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011005 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11006 ds_pool_ci.pNext = NULL;
11007 ds_pool_ci.maxSets = 1;
11008 ds_pool_ci.poolSizeCount = 1;
11009 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011010
Tobin Ehlis3b780662015-05-28 12:11:26 -060011011 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011012 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011013 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011014
Tony Barboureb254902015-07-15 12:50:33 -060011015 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011016 dsl_binding.binding = 0;
11017 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11018 dsl_binding.descriptorCount = 1;
11019 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11020 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011021
11022 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011023 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11024 ds_layout_ci.pNext = NULL;
11025 ds_layout_ci.bindingCount = 1;
11026 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011027 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011028 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011029 ASSERT_VK_SUCCESS(err);
11030
11031 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011032 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011033 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011034 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011035 alloc_info.descriptorPool = ds_pool;
11036 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011037 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011038 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011039
Tony Barboureb254902015-07-15 12:50:33 -060011040 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011041 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11042 sampler_ci.pNext = NULL;
11043 sampler_ci.magFilter = VK_FILTER_NEAREST;
11044 sampler_ci.minFilter = VK_FILTER_NEAREST;
11045 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11046 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11047 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11048 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11049 sampler_ci.mipLodBias = 1.0;
11050 sampler_ci.anisotropyEnable = VK_FALSE;
11051 sampler_ci.maxAnisotropy = 1;
11052 sampler_ci.compareEnable = VK_FALSE;
11053 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11054 sampler_ci.minLod = 1.0;
11055 sampler_ci.maxLod = 1.0;
11056 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11057 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011058
Tobin Ehlis3b780662015-05-28 12:11:26 -060011059 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011060 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011061 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011062
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011063 VkDescriptorImageInfo info = {};
11064 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011065
11066 VkWriteDescriptorSet descriptor_write;
11067 memset(&descriptor_write, 0, sizeof(descriptor_write));
11068 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011069 descriptor_write.dstSet = descriptorSet;
11070 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011071 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011072 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011073 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011074 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011075
11076 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11077
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011078 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011079
Chia-I Wuf7458c52015-10-26 21:10:41 +080011080 vkDestroySampler(m_device->device(), sampler, NULL);
11081 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11082 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011083}
11084
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011085TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
11086 // Create layout w/ empty binding and attempt to update it
11087 VkResult err;
11088
Tony Barbour1fa09702017-03-16 12:09:08 -060011089 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011090
11091 VkDescriptorPoolSize ds_type_count = {};
11092 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11093 ds_type_count.descriptorCount = 1;
11094
11095 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11096 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11097 ds_pool_ci.pNext = NULL;
11098 ds_pool_ci.maxSets = 1;
11099 ds_pool_ci.poolSizeCount = 1;
11100 ds_pool_ci.pPoolSizes = &ds_type_count;
11101
11102 VkDescriptorPool ds_pool;
11103 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11104 ASSERT_VK_SUCCESS(err);
11105
11106 VkDescriptorSetLayoutBinding dsl_binding = {};
11107 dsl_binding.binding = 0;
11108 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11109 dsl_binding.descriptorCount = 0;
11110 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11111 dsl_binding.pImmutableSamplers = NULL;
11112
11113 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11114 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11115 ds_layout_ci.pNext = NULL;
11116 ds_layout_ci.bindingCount = 1;
11117 ds_layout_ci.pBindings = &dsl_binding;
11118 VkDescriptorSetLayout ds_layout;
11119 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11120 ASSERT_VK_SUCCESS(err);
11121
11122 VkDescriptorSet descriptor_set;
11123 VkDescriptorSetAllocateInfo alloc_info = {};
11124 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11125 alloc_info.descriptorSetCount = 1;
11126 alloc_info.descriptorPool = ds_pool;
11127 alloc_info.pSetLayouts = &ds_layout;
11128 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11129 ASSERT_VK_SUCCESS(err);
11130
11131 VkSamplerCreateInfo sampler_ci = {};
11132 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11133 sampler_ci.magFilter = VK_FILTER_NEAREST;
11134 sampler_ci.minFilter = VK_FILTER_NEAREST;
11135 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11136 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11137 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11138 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11139 sampler_ci.mipLodBias = 1.0;
11140 sampler_ci.maxAnisotropy = 1;
11141 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11142 sampler_ci.minLod = 1.0;
11143 sampler_ci.maxLod = 1.0;
11144 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11145
11146 VkSampler sampler;
11147 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11148 ASSERT_VK_SUCCESS(err);
11149
11150 VkDescriptorImageInfo info = {};
11151 info.sampler = sampler;
11152
11153 VkWriteDescriptorSet descriptor_write;
11154 memset(&descriptor_write, 0, sizeof(descriptor_write));
11155 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11156 descriptor_write.dstSet = descriptor_set;
11157 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011158 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011159 // This is the wrong type, but empty binding error will be flagged first
11160 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11161 descriptor_write.pImageInfo = &info;
11162
11163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
11164 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11165 m_errorMonitor->VerifyFound();
11166
11167 vkDestroySampler(m_device->device(), sampler, NULL);
11168 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11169 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11170}
11171
Karl Schultz6addd812016-02-02 17:17:23 -070011172TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11173 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11174 // types
11175 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011176
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011177 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 -060011178
Tony Barbour1fa09702017-03-16 12:09:08 -060011179 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011180
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011181 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011182 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11183 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011184
11185 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011186 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11187 ds_pool_ci.pNext = NULL;
11188 ds_pool_ci.maxSets = 1;
11189 ds_pool_ci.poolSizeCount = 1;
11190 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011191
Tobin Ehlis3b780662015-05-28 12:11:26 -060011192 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011193 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011194 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011195 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011196 dsl_binding.binding = 0;
11197 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11198 dsl_binding.descriptorCount = 1;
11199 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11200 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011201
Tony Barboureb254902015-07-15 12:50:33 -060011202 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011203 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11204 ds_layout_ci.pNext = NULL;
11205 ds_layout_ci.bindingCount = 1;
11206 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011207
Tobin Ehlis3b780662015-05-28 12:11:26 -060011208 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011209 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011210 ASSERT_VK_SUCCESS(err);
11211
11212 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011213 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011214 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011215 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011216 alloc_info.descriptorPool = ds_pool;
11217 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011218 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011219 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011220
Tony Barboureb254902015-07-15 12:50:33 -060011221 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011222 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11223 sampler_ci.pNext = NULL;
11224 sampler_ci.magFilter = VK_FILTER_NEAREST;
11225 sampler_ci.minFilter = VK_FILTER_NEAREST;
11226 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11227 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11228 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11229 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11230 sampler_ci.mipLodBias = 1.0;
11231 sampler_ci.anisotropyEnable = VK_FALSE;
11232 sampler_ci.maxAnisotropy = 1;
11233 sampler_ci.compareEnable = VK_FALSE;
11234 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11235 sampler_ci.minLod = 1.0;
11236 sampler_ci.maxLod = 1.0;
11237 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11238 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011239 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011240 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011241 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011242
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011243 VkDescriptorImageInfo info = {};
11244 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011245
11246 VkWriteDescriptorSet descriptor_write;
11247 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011248 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011249 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011250 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011251 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011252 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011253 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011254
11255 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11256
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011257 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011258
Chia-I Wuf7458c52015-10-26 21:10:41 +080011259 vkDestroySampler(m_device->device(), sampler, NULL);
11260 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11261 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011262}
11263
Karl Schultz6addd812016-02-02 17:17:23 -070011264TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011265 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011266 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011267
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011269
Tony Barbour1fa09702017-03-16 12:09:08 -060011270 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011271 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11272 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011273 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011274 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11275 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011276
11277 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011278 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11279 ds_pool_ci.pNext = NULL;
11280 ds_pool_ci.maxSets = 1;
11281 ds_pool_ci.poolSizeCount = 1;
11282 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011283
11284 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011285 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011286 ASSERT_VK_SUCCESS(err);
11287
11288 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011289 dsl_binding.binding = 0;
11290 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11291 dsl_binding.descriptorCount = 1;
11292 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11293 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011294
11295 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011296 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11297 ds_layout_ci.pNext = NULL;
11298 ds_layout_ci.bindingCount = 1;
11299 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011300 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011302 ASSERT_VK_SUCCESS(err);
11303
11304 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011305 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011306 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011307 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011308 alloc_info.descriptorPool = ds_pool;
11309 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011311 ASSERT_VK_SUCCESS(err);
11312
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011313 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011314
11315 VkDescriptorImageInfo descriptor_info;
11316 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11317 descriptor_info.sampler = sampler;
11318
11319 VkWriteDescriptorSet descriptor_write;
11320 memset(&descriptor_write, 0, sizeof(descriptor_write));
11321 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011322 descriptor_write.dstSet = descriptorSet;
11323 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011324 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011325 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11326 descriptor_write.pImageInfo = &descriptor_info;
11327
11328 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11329
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011330 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011331
Chia-I Wuf7458c52015-10-26 21:10:41 +080011332 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11333 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011334}
11335
Karl Schultz6addd812016-02-02 17:17:23 -070011336TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11337 // Create a single combined Image/Sampler descriptor and send it an invalid
11338 // imageView
11339 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011340
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011342
Tony Barbour1fa09702017-03-16 12:09:08 -060011343 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011344 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011345 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11346 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011347
11348 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011349 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11350 ds_pool_ci.pNext = NULL;
11351 ds_pool_ci.maxSets = 1;
11352 ds_pool_ci.poolSizeCount = 1;
11353 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011354
11355 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011356 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011357 ASSERT_VK_SUCCESS(err);
11358
11359 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011360 dsl_binding.binding = 0;
11361 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11362 dsl_binding.descriptorCount = 1;
11363 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11364 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011365
11366 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011367 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11368 ds_layout_ci.pNext = NULL;
11369 ds_layout_ci.bindingCount = 1;
11370 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011371 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011372 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011373 ASSERT_VK_SUCCESS(err);
11374
11375 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011376 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011377 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011378 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011379 alloc_info.descriptorPool = ds_pool;
11380 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011381 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011382 ASSERT_VK_SUCCESS(err);
11383
11384 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011385 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11386 sampler_ci.pNext = NULL;
11387 sampler_ci.magFilter = VK_FILTER_NEAREST;
11388 sampler_ci.minFilter = VK_FILTER_NEAREST;
11389 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11390 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11391 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11392 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11393 sampler_ci.mipLodBias = 1.0;
11394 sampler_ci.anisotropyEnable = VK_FALSE;
11395 sampler_ci.maxAnisotropy = 1;
11396 sampler_ci.compareEnable = VK_FALSE;
11397 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11398 sampler_ci.minLod = 1.0;
11399 sampler_ci.maxLod = 1.0;
11400 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11401 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011402
11403 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011404 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011405 ASSERT_VK_SUCCESS(err);
11406
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011407 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011408
11409 VkDescriptorImageInfo descriptor_info;
11410 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11411 descriptor_info.sampler = sampler;
11412 descriptor_info.imageView = view;
11413
11414 VkWriteDescriptorSet descriptor_write;
11415 memset(&descriptor_write, 0, sizeof(descriptor_write));
11416 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011417 descriptor_write.dstSet = descriptorSet;
11418 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011419 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011420 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11421 descriptor_write.pImageInfo = &descriptor_info;
11422
11423 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11424
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011425 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011426
Chia-I Wuf7458c52015-10-26 21:10:41 +080011427 vkDestroySampler(m_device->device(), sampler, NULL);
11428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11429 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011430}
11431
Karl Schultz6addd812016-02-02 17:17:23 -070011432TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11433 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11434 // into the other
11435 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011436
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11438 " binding #1 with type "
11439 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11440 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011441
Tony Barbour1fa09702017-03-16 12:09:08 -060011442 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011443 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011444 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011445 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11446 ds_type_count[0].descriptorCount = 1;
11447 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11448 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011449
11450 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011451 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11452 ds_pool_ci.pNext = NULL;
11453 ds_pool_ci.maxSets = 1;
11454 ds_pool_ci.poolSizeCount = 2;
11455 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011456
11457 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011458 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011459 ASSERT_VK_SUCCESS(err);
11460 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011461 dsl_binding[0].binding = 0;
11462 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11463 dsl_binding[0].descriptorCount = 1;
11464 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11465 dsl_binding[0].pImmutableSamplers = NULL;
11466 dsl_binding[1].binding = 1;
11467 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11468 dsl_binding[1].descriptorCount = 1;
11469 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11470 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011471
11472 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011473 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11474 ds_layout_ci.pNext = NULL;
11475 ds_layout_ci.bindingCount = 2;
11476 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011477
11478 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011479 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011480 ASSERT_VK_SUCCESS(err);
11481
11482 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011483 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011484 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011485 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011486 alloc_info.descriptorPool = ds_pool;
11487 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011488 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011489 ASSERT_VK_SUCCESS(err);
11490
11491 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011492 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11493 sampler_ci.pNext = NULL;
11494 sampler_ci.magFilter = VK_FILTER_NEAREST;
11495 sampler_ci.minFilter = VK_FILTER_NEAREST;
11496 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11497 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11498 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11499 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11500 sampler_ci.mipLodBias = 1.0;
11501 sampler_ci.anisotropyEnable = VK_FALSE;
11502 sampler_ci.maxAnisotropy = 1;
11503 sampler_ci.compareEnable = VK_FALSE;
11504 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11505 sampler_ci.minLod = 1.0;
11506 sampler_ci.maxLod = 1.0;
11507 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11508 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011509
11510 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011511 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011512 ASSERT_VK_SUCCESS(err);
11513
11514 VkDescriptorImageInfo info = {};
11515 info.sampler = sampler;
11516
11517 VkWriteDescriptorSet descriptor_write;
11518 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11519 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011520 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011521 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011522 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011523 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11524 descriptor_write.pImageInfo = &info;
11525 // This write update should succeed
11526 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11527 // Now perform a copy update that fails due to type mismatch
11528 VkCopyDescriptorSet copy_ds_update;
11529 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11530 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11531 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011532 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011533 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011534 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11535 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011536 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11537
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011538 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011539 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011540 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 -060011541 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11542 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11543 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011544 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011545 copy_ds_update.dstSet = descriptorSet;
11546 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011547 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011548 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11549
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011550 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011551
Tobin Ehlis04356f92015-10-27 16:35:27 -060011552 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11554 " binding#1 with offset index of 1 plus "
11555 "update array offset of 0 and update of "
11556 "5 descriptors oversteps total number "
11557 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011558
Tobin Ehlis04356f92015-10-27 16:35:27 -060011559 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11560 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11561 copy_ds_update.srcSet = descriptorSet;
11562 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011563 copy_ds_update.dstSet = descriptorSet;
11564 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011565 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011566 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11567
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011568 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011569
Chia-I Wuf7458c52015-10-26 21:10:41 +080011570 vkDestroySampler(m_device->device(), sampler, NULL);
11571 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11572 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011573}
11574
Karl Schultz6addd812016-02-02 17:17:23 -070011575TEST_F(VkLayerTest, NumSamplesMismatch) {
11576 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11577 // sampleCount
11578 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011579
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011581
Tony Barbour1fa09702017-03-16 12:09:08 -060011582 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011583 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011584 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011585 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011586 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011587
11588 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011589 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11590 ds_pool_ci.pNext = NULL;
11591 ds_pool_ci.maxSets = 1;
11592 ds_pool_ci.poolSizeCount = 1;
11593 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011594
Tobin Ehlis3b780662015-05-28 12:11:26 -060011595 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011596 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011597 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011598
Tony Barboureb254902015-07-15 12:50:33 -060011599 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011600 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011601 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011602 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011603 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11604 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011605
Tony Barboureb254902015-07-15 12:50:33 -060011606 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11607 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11608 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011609 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011610 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011611
Tobin Ehlis3b780662015-05-28 12:11:26 -060011612 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011613 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011614 ASSERT_VK_SUCCESS(err);
11615
11616 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011617 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011618 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011619 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011620 alloc_info.descriptorPool = ds_pool;
11621 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011622 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011623 ASSERT_VK_SUCCESS(err);
11624
Tony Barboureb254902015-07-15 12:50:33 -060011625 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011626 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011627 pipe_ms_state_ci.pNext = NULL;
11628 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11629 pipe_ms_state_ci.sampleShadingEnable = 0;
11630 pipe_ms_state_ci.minSampleShading = 1.0;
11631 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011632
Tony Barboureb254902015-07-15 12:50:33 -060011633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11635 pipeline_layout_ci.pNext = NULL;
11636 pipeline_layout_ci.setLayoutCount = 1;
11637 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011638
11639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011641 ASSERT_VK_SUCCESS(err);
11642
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011643 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011644 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 -060011645 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011646 VkPipelineObj pipe(m_device);
11647 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011648 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011649 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011650 pipe.SetMSAA(&pipe_ms_state_ci);
11651 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011652
Tony Barbour552f6c02016-12-21 14:34:07 -070011653 m_commandBuffer->BeginCommandBuffer();
11654 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011655 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011656
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011657 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11658 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11659 VkRect2D scissor = {{0, 0}, {16, 16}};
11660 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11661
Mark Young29927482016-05-04 14:38:51 -060011662 // Render triangle (the error should trigger on the attempt to draw).
11663 Draw(3, 1, 0, 0);
11664
11665 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011666 m_commandBuffer->EndRenderPass();
11667 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011668
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011669 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011670
Chia-I Wuf7458c52015-10-26 21:10:41 +080011671 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11672 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11673 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011674}
Mark Young29927482016-05-04 14:38:51 -060011675
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011676TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011677 TEST_DESCRIPTION(
11678 "Hit RenderPass incompatible cases. "
11679 "Initial case is drawing with an active renderpass that's "
11680 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011681 VkResult err;
11682
Tony Barbour1fa09702017-03-16 12:09:08 -060011683 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011684 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11685
11686 VkDescriptorSetLayoutBinding dsl_binding = {};
11687 dsl_binding.binding = 0;
11688 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11689 dsl_binding.descriptorCount = 1;
11690 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11691 dsl_binding.pImmutableSamplers = NULL;
11692
11693 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11694 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11695 ds_layout_ci.pNext = NULL;
11696 ds_layout_ci.bindingCount = 1;
11697 ds_layout_ci.pBindings = &dsl_binding;
11698
11699 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011700 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011701 ASSERT_VK_SUCCESS(err);
11702
11703 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11704 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11705 pipeline_layout_ci.pNext = NULL;
11706 pipeline_layout_ci.setLayoutCount = 1;
11707 pipeline_layout_ci.pSetLayouts = &ds_layout;
11708
11709 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011710 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011711 ASSERT_VK_SUCCESS(err);
11712
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011713 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011714 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 -060011715 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011716 // Create a renderpass that will be incompatible with default renderpass
11717 VkAttachmentReference attach = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011718 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011719 VkAttachmentReference color_att = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011720 color_att.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011721 VkSubpassDescription subpass = {};
11722 subpass.inputAttachmentCount = 1;
11723 subpass.pInputAttachments = &attach;
11724 subpass.colorAttachmentCount = 1;
11725 subpass.pColorAttachments = &color_att;
11726 VkRenderPassCreateInfo rpci = {};
11727 rpci.subpassCount = 1;
11728 rpci.pSubpasses = &subpass;
11729 rpci.attachmentCount = 1;
11730 VkAttachmentDescription attach_desc = {};
11731 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011732 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11733 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011734 rpci.pAttachments = &attach_desc;
11735 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11736 VkRenderPass rp;
11737 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11738 VkPipelineObj pipe(m_device);
11739 pipe.AddShader(&vs);
11740 pipe.AddShader(&fs);
11741 pipe.AddColorAttachment();
11742 VkViewport view_port = {};
11743 m_viewports.push_back(view_port);
11744 pipe.SetViewport(m_viewports);
11745 VkRect2D rect = {};
11746 m_scissors.push_back(rect);
11747 pipe.SetScissor(m_scissors);
11748 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11749
11750 VkCommandBufferInheritanceInfo cbii = {};
11751 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11752 cbii.renderPass = rp;
11753 cbii.subpass = 0;
11754 VkCommandBufferBeginInfo cbbi = {};
11755 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11756 cbbi.pInheritanceInfo = &cbii;
11757 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11758 VkRenderPassBeginInfo rpbi = {};
11759 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11760 rpbi.framebuffer = m_framebuffer;
11761 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011762 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11763 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011764
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011766 // Render triangle (the error should trigger on the attempt to draw).
11767 Draw(3, 1, 0, 0);
11768
11769 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011770 m_commandBuffer->EndRenderPass();
11771 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011772
11773 m_errorMonitor->VerifyFound();
11774
11775 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11776 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11777 vkDestroyRenderPass(m_device->device(), rp, NULL);
11778}
11779
Mark Youngc89c6312016-03-31 16:03:20 -060011780TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11781 // Create Pipeline where the number of blend attachments doesn't match the
11782 // number of color attachments. In this case, we don't add any color
11783 // blend attachments even though we have a color attachment.
11784 VkResult err;
11785
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011787
Tony Barbour1fa09702017-03-16 12:09:08 -060011788 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11790 VkDescriptorPoolSize ds_type_count = {};
11791 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11792 ds_type_count.descriptorCount = 1;
11793
11794 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11795 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11796 ds_pool_ci.pNext = NULL;
11797 ds_pool_ci.maxSets = 1;
11798 ds_pool_ci.poolSizeCount = 1;
11799 ds_pool_ci.pPoolSizes = &ds_type_count;
11800
11801 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011802 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011803 ASSERT_VK_SUCCESS(err);
11804
11805 VkDescriptorSetLayoutBinding dsl_binding = {};
11806 dsl_binding.binding = 0;
11807 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11808 dsl_binding.descriptorCount = 1;
11809 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11810 dsl_binding.pImmutableSamplers = NULL;
11811
11812 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11813 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11814 ds_layout_ci.pNext = NULL;
11815 ds_layout_ci.bindingCount = 1;
11816 ds_layout_ci.pBindings = &dsl_binding;
11817
11818 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011819 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011820 ASSERT_VK_SUCCESS(err);
11821
11822 VkDescriptorSet descriptorSet;
11823 VkDescriptorSetAllocateInfo alloc_info = {};
11824 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11825 alloc_info.descriptorSetCount = 1;
11826 alloc_info.descriptorPool = ds_pool;
11827 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011828 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011829 ASSERT_VK_SUCCESS(err);
11830
11831 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011832 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011833 pipe_ms_state_ci.pNext = NULL;
11834 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11835 pipe_ms_state_ci.sampleShadingEnable = 0;
11836 pipe_ms_state_ci.minSampleShading = 1.0;
11837 pipe_ms_state_ci.pSampleMask = NULL;
11838
11839 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11840 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11841 pipeline_layout_ci.pNext = NULL;
11842 pipeline_layout_ci.setLayoutCount = 1;
11843 pipeline_layout_ci.pSetLayouts = &ds_layout;
11844
11845 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011846 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011847 ASSERT_VK_SUCCESS(err);
11848
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011849 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011850 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 -060011851 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011852 VkPipelineObj pipe(m_device);
11853 pipe.AddShader(&vs);
11854 pipe.AddShader(&fs);
11855 pipe.SetMSAA(&pipe_ms_state_ci);
11856 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011857 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011858
11859 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11860 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11861 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11862}
Mark Young29927482016-05-04 14:38:51 -060011863
Mark Muellerd4914412016-06-13 17:52:06 -060011864TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011865 TEST_DESCRIPTION(
11866 "Points to a wrong colorAttachment index in a VkClearAttachment "
11867 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011868 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011870
11871 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11872 m_errorMonitor->VerifyFound();
11873}
11874
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011875TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011876 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11877 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011878
Tony Barbour1fa09702017-03-16 12:09:08 -060011879 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011880 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011881
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011882 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011883 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11884 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011885
11886 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011887 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11888 ds_pool_ci.pNext = NULL;
11889 ds_pool_ci.maxSets = 1;
11890 ds_pool_ci.poolSizeCount = 1;
11891 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011892
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011893 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011894 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011895 ASSERT_VK_SUCCESS(err);
11896
Tony Barboureb254902015-07-15 12:50:33 -060011897 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011898 dsl_binding.binding = 0;
11899 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11900 dsl_binding.descriptorCount = 1;
11901 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11902 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011903
Tony Barboureb254902015-07-15 12:50:33 -060011904 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011905 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11906 ds_layout_ci.pNext = NULL;
11907 ds_layout_ci.bindingCount = 1;
11908 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011909
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011910 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011911 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011912 ASSERT_VK_SUCCESS(err);
11913
11914 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011915 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011916 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011917 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011918 alloc_info.descriptorPool = ds_pool;
11919 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011920 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011921 ASSERT_VK_SUCCESS(err);
11922
Tony Barboureb254902015-07-15 12:50:33 -060011923 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011924 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011925 pipe_ms_state_ci.pNext = NULL;
11926 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11927 pipe_ms_state_ci.sampleShadingEnable = 0;
11928 pipe_ms_state_ci.minSampleShading = 1.0;
11929 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011930
Tony Barboureb254902015-07-15 12:50:33 -060011931 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011932 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11933 pipeline_layout_ci.pNext = NULL;
11934 pipeline_layout_ci.setLayoutCount = 1;
11935 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011936
11937 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011938 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011939 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011940
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011941 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011942 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011943 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011944 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011945
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011946 VkPipelineObj pipe(m_device);
11947 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011948 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011949 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011950 pipe.SetMSAA(&pipe_ms_state_ci);
11951 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011952
Tony Barbour552f6c02016-12-21 14:34:07 -070011953 m_commandBuffer->BeginCommandBuffer();
11954 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011955
Karl Schultz6addd812016-02-02 17:17:23 -070011956 // Main thing we care about for this test is that the VkImage obj we're
11957 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011958 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011959 VkClearAttachment color_attachment;
11960 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11961 color_attachment.clearValue.color.float32[0] = 1.0;
11962 color_attachment.clearValue.color.float32[1] = 1.0;
11963 color_attachment.clearValue.color.float32[2] = 1.0;
11964 color_attachment.clearValue.color.float32[3] = 1.0;
11965 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011966 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011967
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011968 // Call for full-sized FB Color attachment prior to issuing a Draw
11969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011970 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011971 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011972 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011973
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011974 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11975 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11977 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11978 m_errorMonitor->VerifyFound();
11979
11980 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11981 clear_rect.layerCount = 2;
11982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11983 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011984 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011985
Chia-I Wuf7458c52015-10-26 21:10:41 +080011986 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11987 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11988 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011989}
11990
Karl Schultz6addd812016-02-02 17:17:23 -070011991TEST_F(VkLayerTest, VtxBufferBadIndex) {
11992 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011993
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11995 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011996
Tony Barbour1fa09702017-03-16 12:09:08 -060011997 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011998 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012000
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012001 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012002 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12003 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012004
12005 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012006 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12007 ds_pool_ci.pNext = NULL;
12008 ds_pool_ci.maxSets = 1;
12009 ds_pool_ci.poolSizeCount = 1;
12010 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012011
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012012 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012013 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012014 ASSERT_VK_SUCCESS(err);
12015
Tony Barboureb254902015-07-15 12:50:33 -060012016 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012017 dsl_binding.binding = 0;
12018 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12019 dsl_binding.descriptorCount = 1;
12020 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12021 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012022
Tony Barboureb254902015-07-15 12:50:33 -060012023 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012024 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12025 ds_layout_ci.pNext = NULL;
12026 ds_layout_ci.bindingCount = 1;
12027 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012028
Tobin Ehlis502480b2015-06-24 15:53:07 -060012029 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012030 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012031 ASSERT_VK_SUCCESS(err);
12032
12033 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012034 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012035 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012036 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012037 alloc_info.descriptorPool = ds_pool;
12038 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012039 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012040 ASSERT_VK_SUCCESS(err);
12041
Tony Barboureb254902015-07-15 12:50:33 -060012042 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012043 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012044 pipe_ms_state_ci.pNext = NULL;
12045 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12046 pipe_ms_state_ci.sampleShadingEnable = 0;
12047 pipe_ms_state_ci.minSampleShading = 1.0;
12048 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012049
Tony Barboureb254902015-07-15 12:50:33 -060012050 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012051 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12052 pipeline_layout_ci.pNext = NULL;
12053 pipeline_layout_ci.setLayoutCount = 1;
12054 pipeline_layout_ci.pSetLayouts = &ds_layout;
12055 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012056
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012057 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012058 ASSERT_VK_SUCCESS(err);
12059
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012060 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012061 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 -060012062 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012063 VkPipelineObj pipe(m_device);
12064 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012065 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012066 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012067 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012068 pipe.SetViewport(m_viewports);
12069 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012070 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012071
Tony Barbour552f6c02016-12-21 14:34:07 -070012072 m_commandBuffer->BeginCommandBuffer();
12073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012074 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012075 // Don't care about actual data, just need to get to draw to flag error
12076 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012077 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012078 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012079 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012080
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012081 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012082
Chia-I Wuf7458c52015-10-26 21:10:41 +080012083 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12084 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12085 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012086}
Mark Muellerdfe37552016-07-07 14:47:42 -060012087
Mark Mueller2ee294f2016-08-04 12:59:48 -060012088TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012089 TEST_DESCRIPTION(
12090 "Use an invalid count in a vkEnumeratePhysicalDevices call."
12091 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060012092 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012093
Mark Mueller880fce52016-08-17 15:23:23 -060012094 // The following test fails with recent NVidia drivers.
12095 // By the time core_validation is reached, the NVidia
12096 // driver has sanitized the invalid condition and core_validation
12097 // is not introduced to the failure condition. This is not the case
12098 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012099 // uint32_t count = static_cast<uint32_t>(~0);
12100 // VkPhysicalDevice physical_device;
12101 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12102 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012103
Mark Mueller2ee294f2016-08-04 12:59:48 -060012104 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012105 VkDeviceQueueCreateInfo queue_create_info = {};
12106 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12107 queue_create_info.queueCount = 1;
12108 queue_create_info.pQueuePriorities = &queue_priority;
12109 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12110
12111 VkPhysicalDeviceFeatures features = m_device->phy().features();
12112 VkDevice testDevice;
12113 VkDeviceCreateInfo device_create_info = {};
12114 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12115 device_create_info.queueCreateInfoCount = 1;
12116 device_create_info.pQueueCreateInfos = &queue_create_info;
12117 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012118
Petr Kraus56ed9192017-05-08 23:45:36 +020012119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00054);
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012120 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
12121 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12122 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012123 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12124 m_errorMonitor->VerifyFound();
12125
12126 queue_create_info.queueFamilyIndex = 1;
12127
12128 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12129 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12130 for (unsigned i = 0; i < feature_count; i++) {
12131 if (VK_FALSE == feature_array[i]) {
12132 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012133 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12135 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012136 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
12137 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12138 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12140 "You requested features that are unavailable on this device. You should first "
12141 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012142 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12143 m_errorMonitor->VerifyFound();
12144 break;
12145 }
12146 }
12147}
12148
Tobin Ehlis16edf082016-11-21 12:33:49 -070012149TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
12150 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
12151
Tony Barbour1fa09702017-03-16 12:09:08 -060012152 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070012153
12154 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
12155 std::vector<VkDeviceQueueCreateInfo> queue_info;
12156 queue_info.reserve(queue_props.size());
12157 std::vector<std::vector<float>> queue_priorities;
12158 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
12159 VkDeviceQueueCreateInfo qi{};
12160 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12161 qi.queueFamilyIndex = i;
12162 qi.queueCount = queue_props[i].queueCount;
12163 queue_priorities.emplace_back(qi.queueCount, 0.0f);
12164 qi.pQueuePriorities = queue_priorities[i].data();
12165 queue_info.push_back(qi);
12166 }
12167
12168 std::vector<const char *> device_extension_names;
12169
12170 VkDevice local_device;
12171 VkDeviceCreateInfo device_create_info = {};
12172 auto features = m_device->phy().features();
12173 // Intentionally disable pipeline stats
12174 features.pipelineStatisticsQuery = VK_FALSE;
12175 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12176 device_create_info.pNext = NULL;
12177 device_create_info.queueCreateInfoCount = queue_info.size();
12178 device_create_info.pQueueCreateInfos = queue_info.data();
12179 device_create_info.enabledLayerCount = 0;
12180 device_create_info.ppEnabledLayerNames = NULL;
12181 device_create_info.pEnabledFeatures = &features;
12182 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
12183 ASSERT_VK_SUCCESS(err);
12184
12185 VkQueryPoolCreateInfo qpci{};
12186 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12187 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
12188 qpci.queryCount = 1;
12189 VkQueryPool query_pool;
12190
12191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
12192 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
12193 m_errorMonitor->VerifyFound();
12194
12195 vkDestroyDevice(local_device, nullptr);
12196}
12197
Mark Mueller2ee294f2016-08-04 12:59:48 -060012198TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012199 TEST_DESCRIPTION(
12200 "Use an invalid queue index in a vkCmdWaitEvents call."
12201 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012202
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012203 const char *invalid_queue_index =
12204 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12205 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12206 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012207
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012208 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012209
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012211
Tony Barbour1fa09702017-03-16 12:09:08 -060012212 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012213
12214 VkEvent event;
12215 VkEventCreateInfo event_create_info{};
12216 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12217 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12218
Mark Mueller2ee294f2016-08-04 12:59:48 -060012219 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012220 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012221
Tony Barbour552f6c02016-12-21 14:34:07 -070012222 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012223
12224 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012225 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 -060012226 ASSERT_TRUE(image.initialized());
12227 VkImageMemoryBarrier img_barrier = {};
12228 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12229 img_barrier.pNext = NULL;
12230 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12231 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12232 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12233 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12234 img_barrier.image = image.handle();
12235 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012236
12237 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12238 // that layer validation catches the case when it is not.
12239 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012240 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12241 img_barrier.subresourceRange.baseArrayLayer = 0;
12242 img_barrier.subresourceRange.baseMipLevel = 0;
12243 img_barrier.subresourceRange.layerCount = 1;
12244 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012245 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
12246 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012247 m_errorMonitor->VerifyFound();
12248
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012250
12251 VkQueryPool query_pool;
12252 VkQueryPoolCreateInfo query_pool_create_info = {};
12253 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12254 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12255 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012256 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012257
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012258 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012259 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12260
12261 vkEndCommandBuffer(m_commandBuffer->handle());
12262 m_errorMonitor->VerifyFound();
12263
12264 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12265 vkDestroyEvent(m_device->device(), event, nullptr);
12266}
12267
Mark Muellerdfe37552016-07-07 14:47:42 -060012268TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012269 TEST_DESCRIPTION(
12270 "Submit a command buffer using deleted vertex buffer, "
12271 "delete a buffer twice, use an invalid offset for each "
12272 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060012273
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012274 const char *deleted_buffer_in_command_buffer =
12275 "Cannot submit cmd buffer "
12276 "using deleted buffer ";
12277 const char *invalid_offset_message =
12278 "vkBindBufferMemory(): "
12279 "memoryOffset is 0x";
12280 const char *invalid_storage_buffer_offset_message =
12281 "vkBindBufferMemory(): "
12282 "storage memoryOffset "
12283 "is 0x";
12284 const char *invalid_texel_buffer_offset_message =
12285 "vkBindBufferMemory(): "
12286 "texel memoryOffset "
12287 "is 0x";
12288 const char *invalid_uniform_buffer_offset_message =
12289 "vkBindBufferMemory(): "
12290 "uniform memoryOffset "
12291 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060012292
Tony Barbour1fa09702017-03-16 12:09:08 -060012293 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060012294 ASSERT_NO_FATAL_FAILURE(InitViewport());
12295 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12296
12297 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012298 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060012299 pipe_ms_state_ci.pNext = NULL;
12300 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12301 pipe_ms_state_ci.sampleShadingEnable = 0;
12302 pipe_ms_state_ci.minSampleShading = 1.0;
12303 pipe_ms_state_ci.pSampleMask = nullptr;
12304
12305 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12306 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12307 VkPipelineLayout pipeline_layout;
12308
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012309 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060012310 ASSERT_VK_SUCCESS(err);
12311
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012312 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12313 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060012314 VkPipelineObj pipe(m_device);
12315 pipe.AddShader(&vs);
12316 pipe.AddShader(&fs);
12317 pipe.AddColorAttachment();
12318 pipe.SetMSAA(&pipe_ms_state_ci);
12319 pipe.SetViewport(m_viewports);
12320 pipe.SetScissor(m_scissors);
12321 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12322
Tony Barbour552f6c02016-12-21 14:34:07 -070012323 m_commandBuffer->BeginCommandBuffer();
12324 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012325 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060012326
12327 {
12328 // Create and bind a vertex buffer in a reduced scope, which will cause
12329 // it to be deleted upon leaving this scope
12330 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012331 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060012332 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12333 draw_verticies.AddVertexInputToPipe(pipe);
12334 }
12335
12336 Draw(1, 0, 0, 0);
12337
Tony Barbour552f6c02016-12-21 14:34:07 -070012338 m_commandBuffer->EndRenderPass();
12339 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060012340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060012342 QueueCommandBuffer(false);
12343 m_errorMonitor->VerifyFound();
12344
12345 {
12346 // Create and bind a vertex buffer in a reduced scope, and delete it
12347 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012348 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060012350 buffer_test.TestDoubleDestroy();
12351 }
12352 m_errorMonitor->VerifyFound();
12353
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012354 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012355 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012356 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012358 m_errorMonitor->SetUnexpectedError(
12359 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
12360 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012361 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
12362 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012363 m_errorMonitor->VerifyFound();
12364 }
12365
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012366 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
12367 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012368 // Create and bind a memory buffer with an invalid offset again,
12369 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012371 m_errorMonitor->SetUnexpectedError(
12372 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12373 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012374 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12375 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012376 m_errorMonitor->VerifyFound();
12377 }
12378
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012379 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012380 // Create and bind a memory buffer with an invalid offset again, but
12381 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012383 m_errorMonitor->SetUnexpectedError(
12384 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12385 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012386 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12387 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012388 m_errorMonitor->VerifyFound();
12389 }
12390
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012391 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012392 // Create and bind a memory buffer with an invalid offset again, but
12393 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012395 m_errorMonitor->SetUnexpectedError(
12396 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12397 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012398 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12399 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012400 m_errorMonitor->VerifyFound();
12401 }
12402
12403 {
12404 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012406 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
12407 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012408 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
12409 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012410 m_errorMonitor->VerifyFound();
12411 }
12412
12413 {
12414 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012416 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
12417 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012418 }
12419 m_errorMonitor->VerifyFound();
12420
12421 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12422}
12423
Tony Barbourff1351e2017-05-10 11:14:03 -060012424TEST_F(VkLayerTest, BadVertexBufferOffset) {
12425 TEST_DESCRIPTION("Submit an offset past the end of a vertex buffer");
12426
12427 ASSERT_NO_FATAL_FAILURE(Init());
12428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12429 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Tony Barboure94224e2017-05-11 15:22:43 -060012430 VkConstantBufferObj vbo(m_device, 3, sizeof(float), (const void *)&vbo_data);
Tony Barbourff1351e2017-05-10 11:14:03 -060012431 m_commandBuffer->BeginCommandBuffer();
12432 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
12433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01417);
Tony Barboure94224e2017-05-11 15:22:43 -060012434 BindVertexBuffer(&vbo, (VkDeviceSize)(3 * sizeof(float)), 1); // Offset at the end of the buffer
Tony Barbourff1351e2017-05-10 11:14:03 -060012435 m_errorMonitor->VerifyFound();
12436}
12437
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012438// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12439TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012440 TEST_DESCRIPTION(
12441 "Hit all possible validation checks associated with the "
12442 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12443 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012444 // 3 in ValidateCmdBufImageLayouts
12445 // * -1 Attempt to submit cmd buf w/ deleted image
12446 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12447 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012448
Tony Barbour1fa09702017-03-16 12:09:08 -060012449 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060012450 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070012451 if (!depth_format) {
12452 printf(" No Depth + Stencil format found. Skipped.\n");
12453 return;
12454 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012455 // Create src & dst images to use for copy operations
12456 VkImage src_image;
12457 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080012458 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012459
12460 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12461 const int32_t tex_width = 32;
12462 const int32_t tex_height = 32;
12463
12464 VkImageCreateInfo image_create_info = {};
12465 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12466 image_create_info.pNext = NULL;
12467 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12468 image_create_info.format = tex_format;
12469 image_create_info.extent.width = tex_width;
12470 image_create_info.extent.height = tex_height;
12471 image_create_info.extent.depth = 1;
12472 image_create_info.mipLevels = 1;
12473 image_create_info.arrayLayers = 4;
12474 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12475 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12476 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080012477 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012478 image_create_info.flags = 0;
12479
12480 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12481 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012482 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012483 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12484 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012485 image_create_info.format = VK_FORMAT_D32_SFLOAT;
12486 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
12487 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
12488 ASSERT_VK_SUCCESS(err);
12489
12490 // Allocate memory
12491 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080012492 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080012493 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080012494 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12495 mem_alloc.pNext = NULL;
12496 mem_alloc.allocationSize = 0;
12497 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080012498
12499 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012500 mem_alloc.allocationSize = img_mem_reqs.size;
12501 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012502 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080012503 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080012504 ASSERT_VK_SUCCESS(err);
12505
12506 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012507 mem_alloc.allocationSize = img_mem_reqs.size;
12508 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012509 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012510 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012511 ASSERT_VK_SUCCESS(err);
12512
12513 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012514 mem_alloc.allocationSize = img_mem_reqs.size;
12515 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012516 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012517 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012518 ASSERT_VK_SUCCESS(err);
12519
12520 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12521 ASSERT_VK_SUCCESS(err);
12522 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12523 ASSERT_VK_SUCCESS(err);
12524 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12525 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012526
Tony Barbour552f6c02016-12-21 14:34:07 -070012527 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012528 VkImageCopy copy_region;
12529 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12530 copy_region.srcSubresource.mipLevel = 0;
12531 copy_region.srcSubresource.baseArrayLayer = 0;
12532 copy_region.srcSubresource.layerCount = 1;
12533 copy_region.srcOffset.x = 0;
12534 copy_region.srcOffset.y = 0;
12535 copy_region.srcOffset.z = 0;
12536 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12537 copy_region.dstSubresource.mipLevel = 0;
12538 copy_region.dstSubresource.baseArrayLayer = 0;
12539 copy_region.dstSubresource.layerCount = 1;
12540 copy_region.dstOffset.x = 0;
12541 copy_region.dstOffset.y = 0;
12542 copy_region.dstOffset.z = 0;
12543 copy_region.extent.width = 1;
12544 copy_region.extent.height = 1;
12545 copy_region.extent.depth = 1;
12546
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12548 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12549 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012550
Cort530cf382016-12-08 09:59:47 -080012551 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 -060012552 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012553 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12554 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012555 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12556 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012557 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 -060012558 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012560 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12561 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Mark Lobodzinskic61e1da2017-05-15 16:18:13 -060012562 m_errorMonitor->SetUnexpectedError("is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT");
Cort530cf382016-12-08 09:59:47 -080012563 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 -060012564 m_errorMonitor->VerifyFound();
12565 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012567 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012568 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012569 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012570 "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 -080012571 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 -060012572 m_errorMonitor->VerifyFound();
12573 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12575 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12576 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012577 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 -060012578 m_errorMonitor->VerifyFound();
12579 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012581 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012582 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012583 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012584 "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 -080012585 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 -060012586 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012588 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12589 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012590 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012591 "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 -080012592 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 -060012593 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012594
Cort3b021012016-12-07 12:00:57 -080012595 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12596 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12597 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12598 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12599 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12600 transfer_dst_image_barrier[0].srcAccessMask = 0;
12601 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12602 transfer_dst_image_barrier[0].image = dst_image;
12603 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12604 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12605 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12606 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12607 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12608 transfer_dst_image_barrier[0].image = depth_image;
12609 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12610 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12611 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12612
12613 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012614 VkClearColorValue color_clear_value = {};
12615 VkImageSubresourceRange clear_range;
12616 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12617 clear_range.baseMipLevel = 0;
12618 clear_range.baseArrayLayer = 0;
12619 clear_range.layerCount = 1;
12620 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012621
Cort3b021012016-12-07 12:00:57 -080012622 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12623 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012626 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012627 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012628 // Fail due to provided layout not matching actual current layout for color clear.
12629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012630 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012631 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012632
Cort530cf382016-12-08 09:59:47 -080012633 VkClearDepthStencilValue depth_clear_value = {};
12634 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012635
12636 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12637 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012640 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012641 m_errorMonitor->VerifyFound();
12642 // Fail due to provided layout not matching actual current layout for depth clear.
12643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012644 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012645 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012646
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012647 // Now cause error due to bad image layout transition in PipelineBarrier
12648 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012649 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012650 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012651 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012652 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012653 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12654 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012655 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012657 "you cannot transition the layout of aspect 1 from "
12658 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12659 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012661 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12662 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012663 m_errorMonitor->VerifyFound();
12664
12665 // Finally some layout errors at RenderPass create time
12666 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12667 VkAttachmentReference attach = {};
12668 // perf warning for GENERAL layout w/ non-DS input attachment
12669 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12670 VkSubpassDescription subpass = {};
12671 subpass.inputAttachmentCount = 1;
12672 subpass.pInputAttachments = &attach;
12673 VkRenderPassCreateInfo rpci = {};
12674 rpci.subpassCount = 1;
12675 rpci.pSubpasses = &subpass;
12676 rpci.attachmentCount = 1;
12677 VkAttachmentDescription attach_desc = {};
12678 attach_desc.format = VK_FORMAT_UNDEFINED;
12679 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012680 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012681 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12683 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012684 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12685 m_errorMonitor->VerifyFound();
12686 // error w/ non-general layout
12687 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12688
12689 m_errorMonitor->SetDesiredFailureMsg(
12690 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12691 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12692 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12693 m_errorMonitor->VerifyFound();
12694 subpass.inputAttachmentCount = 0;
12695 subpass.colorAttachmentCount = 1;
12696 subpass.pColorAttachments = &attach;
12697 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12698 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12700 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012701 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12702 m_errorMonitor->VerifyFound();
12703 // error w/ non-color opt or GENERAL layout for color attachment
12704 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12705 m_errorMonitor->SetDesiredFailureMsg(
12706 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12707 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12708 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12709 m_errorMonitor->VerifyFound();
12710 subpass.colorAttachmentCount = 0;
12711 subpass.pDepthStencilAttachment = &attach;
12712 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12713 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12715 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012716 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12717 m_errorMonitor->VerifyFound();
12718 // error w/ non-ds opt or GENERAL layout for color attachment
12719 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12721 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12722 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012723 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12724 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012725 // For this error we need a valid renderpass so create default one
12726 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12727 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012728 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012729 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12730 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12731 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12732 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12733 // Can't do a CLEAR load on READ_ONLY initialLayout
12734 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12735 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12736 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012738 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012739 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12740 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012741
Cort3b021012016-12-07 12:00:57 -080012742 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12743 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12744 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012745 vkDestroyImage(m_device->device(), src_image, NULL);
12746 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012747 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012748}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012749
Tobin Ehlise0936662016-10-11 08:10:51 -060012750TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12751 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12752 VkResult err;
12753
Tony Barbour1fa09702017-03-16 12:09:08 -060012754 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012755
12756 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12757 VkImageTiling tiling;
12758 VkFormatProperties format_properties;
12759 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12760 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12761 tiling = VK_IMAGE_TILING_LINEAR;
12762 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12763 tiling = VK_IMAGE_TILING_OPTIMAL;
12764 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012765 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012766 return;
12767 }
12768
12769 VkDescriptorPoolSize ds_type = {};
12770 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12771 ds_type.descriptorCount = 1;
12772
12773 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12775 ds_pool_ci.maxSets = 1;
12776 ds_pool_ci.poolSizeCount = 1;
12777 ds_pool_ci.pPoolSizes = &ds_type;
12778 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12779
12780 VkDescriptorPool ds_pool;
12781 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12782 ASSERT_VK_SUCCESS(err);
12783
12784 VkDescriptorSetLayoutBinding dsl_binding = {};
12785 dsl_binding.binding = 0;
12786 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12787 dsl_binding.descriptorCount = 1;
12788 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12789 dsl_binding.pImmutableSamplers = NULL;
12790
12791 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12792 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12793 ds_layout_ci.pNext = NULL;
12794 ds_layout_ci.bindingCount = 1;
12795 ds_layout_ci.pBindings = &dsl_binding;
12796
12797 VkDescriptorSetLayout ds_layout;
12798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12799 ASSERT_VK_SUCCESS(err);
12800
12801 VkDescriptorSetAllocateInfo alloc_info = {};
12802 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12803 alloc_info.descriptorSetCount = 1;
12804 alloc_info.descriptorPool = ds_pool;
12805 alloc_info.pSetLayouts = &ds_layout;
12806 VkDescriptorSet descriptor_set;
12807 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12808 ASSERT_VK_SUCCESS(err);
12809
12810 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12811 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12812 pipeline_layout_ci.pNext = NULL;
12813 pipeline_layout_ci.setLayoutCount = 1;
12814 pipeline_layout_ci.pSetLayouts = &ds_layout;
12815 VkPipelineLayout pipeline_layout;
12816 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12817 ASSERT_VK_SUCCESS(err);
12818
12819 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012820 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012821 ASSERT_TRUE(image.initialized());
12822 VkImageView view = image.targetView(tex_format);
12823
12824 VkDescriptorImageInfo image_info = {};
12825 image_info.imageView = view;
12826 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12827
12828 VkWriteDescriptorSet descriptor_write = {};
12829 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12830 descriptor_write.dstSet = descriptor_set;
12831 descriptor_write.dstBinding = 0;
12832 descriptor_write.descriptorCount = 1;
12833 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12834 descriptor_write.pImageInfo = &image_info;
12835
12836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12837 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12838 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12839 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12840 m_errorMonitor->VerifyFound();
12841
12842 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12843 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12844 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12845 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12846}
12847
Mark Mueller93b938f2016-08-18 10:27:40 -060012848TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012849 TEST_DESCRIPTION(
12850 "Use vkCmdExecuteCommands with invalid state "
12851 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012852
Tony Barbour1fa09702017-03-16 12:09:08 -060012853 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12855
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012856 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012857 const char *simultaneous_use_message2 =
12858 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12859 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012860
12861 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012862 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012863 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012864 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12865 command_buffer_allocate_info.commandBufferCount = 1;
12866
12867 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012868 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012869 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12870 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012871 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012872 command_buffer_inheritance_info.renderPass = m_renderPass;
12873 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012874
Mark Mueller93b938f2016-08-18 10:27:40 -060012875 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012876 command_buffer_begin_info.flags =
12877 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012878 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12879
12880 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12881 vkEndCommandBuffer(secondary_command_buffer);
12882
Mark Mueller93b938f2016-08-18 10:27:40 -060012883 VkSubmitInfo submit_info = {};
12884 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12885 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012886 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012887
Mark Mueller4042b652016-09-05 22:52:21 -060012888 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012889 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12891 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012892 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012893 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012894 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12895 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012896
Dave Houltonfbf52152017-01-06 12:55:29 -070012897 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012898 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012899 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012900
Mark Mueller4042b652016-09-05 22:52:21 -060012901 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012902 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012903 m_errorMonitor->SetUnexpectedError(
12904 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12905 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012906 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012907 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012908
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12910 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012911 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012912 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12913 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012914
12915 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012916
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012917 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012918}
12919
Tony Barbour626994c2017-02-08 15:29:37 -070012920TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12921 TEST_DESCRIPTION(
12922 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12923 "errors");
12924 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12925 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 -060012926 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012927
12928 VkCommandBuffer cmd_bufs[2];
12929 VkCommandBufferAllocateInfo alloc_info;
12930 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12931 alloc_info.pNext = NULL;
12932 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012933 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012934 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12935 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12936
12937 VkCommandBufferBeginInfo cb_binfo;
12938 cb_binfo.pNext = NULL;
12939 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12940 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12941 cb_binfo.flags = 0;
12942 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12943 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12944 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12945 vkEndCommandBuffer(cmd_bufs[0]);
12946 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12947
12948 VkSubmitInfo submit_info = {};
12949 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12950 submit_info.commandBufferCount = 2;
12951 submit_info.pCommandBuffers = duplicates;
12952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12953 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12954 m_errorMonitor->VerifyFound();
12955 vkQueueWaitIdle(m_device->m_queue);
12956
12957 // Set one time use and now look for one time submit
12958 duplicates[0] = duplicates[1] = cmd_bufs[1];
12959 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12960 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12961 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12962 vkEndCommandBuffer(cmd_bufs[1]);
12963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12965 m_errorMonitor->VerifyFound();
12966 vkQueueWaitIdle(m_device->m_queue);
12967}
12968
Tobin Ehlisb093da82017-01-19 12:05:27 -070012969TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012970 TEST_DESCRIPTION(
12971 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12972 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012973
Tony Barbour1fa09702017-03-16 12:09:08 -060012974 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12976
12977 std::vector<const char *> device_extension_names;
12978 auto features = m_device->phy().features();
12979 // Make sure gs & ts are disabled
12980 features.geometryShader = false;
12981 features.tessellationShader = false;
12982 // The sacrificial device object
12983 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12984
12985 VkCommandPoolCreateInfo pool_create_info{};
12986 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12987 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12988
12989 VkCommandPool command_pool;
12990 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12991
12992 VkCommandBufferAllocateInfo cmd = {};
12993 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12994 cmd.pNext = NULL;
12995 cmd.commandPool = command_pool;
12996 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12997 cmd.commandBufferCount = 1;
12998
12999 VkCommandBuffer cmd_buffer;
13000 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
13001 ASSERT_VK_SUCCESS(err);
13002
13003 VkEvent event;
13004 VkEventCreateInfo evci = {};
13005 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13006 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
13007 ASSERT_VK_SUCCESS(result);
13008
13009 VkCommandBufferBeginInfo cbbi = {};
13010 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13011 vkBeginCommandBuffer(cmd_buffer, &cbbi);
13012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
13013 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
13014 m_errorMonitor->VerifyFound();
13015
13016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
13017 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
13018 m_errorMonitor->VerifyFound();
13019
13020 vkDestroyEvent(test_device.handle(), event, NULL);
13021 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
13022}
13023
Chris Forbesd70103a2017-04-13 11:34:09 -070013024TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060013025 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060013026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13027
Tony Barbour552f6c02016-12-21 14:34:07 -070013028 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013029
13030 VkEvent event;
13031 VkEventCreateInfo event_create_info = {};
13032 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13033 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013034 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013035
Tony Barbour552f6c02016-12-21 14:34:07 -070013036 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013037 vkDestroyEvent(m_device->device(), event, nullptr);
13038
13039 VkSubmitInfo submit_info = {};
13040 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13041 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013042 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070013043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013044 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13045 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070013046}
Mark Muellerc8d441e2016-08-23 17:36:00 -060013047
Chris Forbesd70103a2017-04-13 11:34:09 -070013048TEST_F(VkLayerTest, InUseDestroyedSignaled) {
13049 TEST_DESCRIPTION(
13050 "Use vkCmdExecuteCommands with invalid state "
13051 "in primary and secondary command buffers. "
13052 "Delete objects that are inuse. Call VkQueueSubmit "
13053 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013054
Chris Forbesd70103a2017-04-13 11:34:09 -070013055 ASSERT_NO_FATAL_FAILURE(Init());
13056 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13057
13058 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013059
Mark Mueller917f6bc2016-08-30 10:57:19 -060013060 VkSemaphoreCreateInfo semaphore_create_info = {};
13061 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13062 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013063 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013064 VkFenceCreateInfo fence_create_info = {};
13065 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13066 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013067 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013068
13069 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013070 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013071 descriptor_pool_type_count.descriptorCount = 1;
13072
13073 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13074 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13075 descriptor_pool_create_info.maxSets = 1;
13076 descriptor_pool_create_info.poolSizeCount = 1;
13077 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013078 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013079
13080 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013081 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013082
13083 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013084 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013085 descriptorset_layout_binding.descriptorCount = 1;
13086 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13087
13088 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013089 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013090 descriptorset_layout_create_info.bindingCount = 1;
13091 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13092
13093 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013094 ASSERT_VK_SUCCESS(
13095 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013096
13097 VkDescriptorSet descriptorset;
13098 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013099 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013100 descriptorset_allocate_info.descriptorSetCount = 1;
13101 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13102 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013103 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013104
Mark Mueller4042b652016-09-05 22:52:21 -060013105 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13106
13107 VkDescriptorBufferInfo buffer_info = {};
13108 buffer_info.buffer = buffer_test.GetBuffer();
13109 buffer_info.offset = 0;
13110 buffer_info.range = 1024;
13111
13112 VkWriteDescriptorSet write_descriptor_set = {};
13113 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13114 write_descriptor_set.dstSet = descriptorset;
13115 write_descriptor_set.descriptorCount = 1;
13116 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13117 write_descriptor_set.pBufferInfo = &buffer_info;
13118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013119 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060013120
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013121 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13122 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013123
13124 VkPipelineObj pipe(m_device);
13125 pipe.AddColorAttachment();
13126 pipe.AddShader(&vs);
13127 pipe.AddShader(&fs);
13128
13129 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013130 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013131 pipeline_layout_create_info.setLayoutCount = 1;
13132 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13133
13134 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013135 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013136
13137 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
13138
Chris Forbesd70103a2017-04-13 11:34:09 -070013139 VkEvent event;
13140 VkEventCreateInfo event_create_info = {};
13141 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13142 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
13143
Tony Barbour552f6c02016-12-21 14:34:07 -070013144 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070013145
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013146 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013147
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013148 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13149 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13150 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013151
Tony Barbour552f6c02016-12-21 14:34:07 -070013152 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013153
Chris Forbesd70103a2017-04-13 11:34:09 -070013154 VkSubmitInfo submit_info = {};
13155 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13156 submit_info.commandBufferCount = 1;
13157 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013158 submit_info.signalSemaphoreCount = 1;
13159 submit_info.pSignalSemaphores = &semaphore;
13160 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013161 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060013162
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013164 vkDestroyEvent(m_device->device(), event, nullptr);
13165 m_errorMonitor->VerifyFound();
13166
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013168 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13169 m_errorMonitor->VerifyFound();
13170
Jeremy Hayes08369882017-02-02 10:31:06 -070013171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013172 vkDestroyFence(m_device->device(), fence, nullptr);
13173 m_errorMonitor->VerifyFound();
13174
Tobin Ehlis122207b2016-09-01 08:50:06 -070013175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013176 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
13177 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013178 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013179 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
13180 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013181 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013182 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
13183 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013184 vkDestroyEvent(m_device->device(), event, nullptr);
13185 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013186 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013187 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13188}
13189
Tobin Ehlis2adda372016-09-01 08:51:06 -070013190TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
13191 TEST_DESCRIPTION("Delete in-use query pool.");
13192
Tony Barbour1fa09702017-03-16 12:09:08 -060013193 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070013194 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13195
13196 VkQueryPool query_pool;
13197 VkQueryPoolCreateInfo query_pool_ci{};
13198 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
13199 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
13200 query_pool_ci.queryCount = 1;
13201 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070013202 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013203 // Reset query pool to create binding with cmd buffer
13204 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
13205
Tony Barbour552f6c02016-12-21 14:34:07 -070013206 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013207
13208 VkSubmitInfo submit_info = {};
13209 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13210 submit_info.commandBufferCount = 1;
13211 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13212 // Submit cmd buffer and then destroy query pool while in-flight
13213 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13214
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070013216 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13217 m_errorMonitor->VerifyFound();
13218
13219 vkQueueWaitIdle(m_device->m_queue);
13220 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013221 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013222 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070013223 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13224}
13225
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013226TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
13227 TEST_DESCRIPTION("Delete in-use pipeline.");
13228
Tony Barbour1fa09702017-03-16 12:09:08 -060013229 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13231
13232 // Empty pipeline layout used for binding PSO
13233 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13234 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13235 pipeline_layout_ci.setLayoutCount = 0;
13236 pipeline_layout_ci.pSetLayouts = NULL;
13237
13238 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013239 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013240 ASSERT_VK_SUCCESS(err);
13241
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013243 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013244 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13245 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013246 // Store pipeline handle so we can actually delete it before test finishes
13247 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013248 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013249 VkPipelineObj pipe(m_device);
13250 pipe.AddShader(&vs);
13251 pipe.AddShader(&fs);
13252 pipe.AddColorAttachment();
13253 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13254 delete_this_pipeline = pipe.handle();
13255
Tony Barbour552f6c02016-12-21 14:34:07 -070013256 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013257 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013258 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013259
Tony Barbour552f6c02016-12-21 14:34:07 -070013260 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013261
13262 VkSubmitInfo submit_info = {};
13263 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13264 submit_info.commandBufferCount = 1;
13265 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13266 // Submit cmd buffer and then pipeline destroyed while in-flight
13267 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013268 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013269 m_errorMonitor->VerifyFound();
13270 // Make sure queue finished and then actually delete pipeline
13271 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013272 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
13273 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013274 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
13275 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
13276}
13277
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013278TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
13279 TEST_DESCRIPTION("Delete in-use imageView.");
13280
Tony Barbour1fa09702017-03-16 12:09:08 -060013281 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013282 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13283
13284 VkDescriptorPoolSize ds_type_count;
13285 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13286 ds_type_count.descriptorCount = 1;
13287
13288 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13289 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13290 ds_pool_ci.maxSets = 1;
13291 ds_pool_ci.poolSizeCount = 1;
13292 ds_pool_ci.pPoolSizes = &ds_type_count;
13293
13294 VkDescriptorPool ds_pool;
13295 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13296 ASSERT_VK_SUCCESS(err);
13297
13298 VkSamplerCreateInfo sampler_ci = {};
13299 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13300 sampler_ci.pNext = NULL;
13301 sampler_ci.magFilter = VK_FILTER_NEAREST;
13302 sampler_ci.minFilter = VK_FILTER_NEAREST;
13303 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13304 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13305 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13306 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13307 sampler_ci.mipLodBias = 1.0;
13308 sampler_ci.anisotropyEnable = VK_FALSE;
13309 sampler_ci.maxAnisotropy = 1;
13310 sampler_ci.compareEnable = VK_FALSE;
13311 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13312 sampler_ci.minLod = 1.0;
13313 sampler_ci.maxLod = 1.0;
13314 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13315 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13316 VkSampler sampler;
13317
13318 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13319 ASSERT_VK_SUCCESS(err);
13320
13321 VkDescriptorSetLayoutBinding layout_binding;
13322 layout_binding.binding = 0;
13323 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13324 layout_binding.descriptorCount = 1;
13325 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13326 layout_binding.pImmutableSamplers = NULL;
13327
13328 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13329 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13330 ds_layout_ci.bindingCount = 1;
13331 ds_layout_ci.pBindings = &layout_binding;
13332 VkDescriptorSetLayout ds_layout;
13333 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13334 ASSERT_VK_SUCCESS(err);
13335
13336 VkDescriptorSetAllocateInfo alloc_info = {};
13337 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13338 alloc_info.descriptorSetCount = 1;
13339 alloc_info.descriptorPool = ds_pool;
13340 alloc_info.pSetLayouts = &ds_layout;
13341 VkDescriptorSet descriptor_set;
13342 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13343 ASSERT_VK_SUCCESS(err);
13344
13345 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13346 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13347 pipeline_layout_ci.pNext = NULL;
13348 pipeline_layout_ci.setLayoutCount = 1;
13349 pipeline_layout_ci.pSetLayouts = &ds_layout;
13350
13351 VkPipelineLayout pipeline_layout;
13352 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13353 ASSERT_VK_SUCCESS(err);
13354
13355 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013356 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 -060013357 ASSERT_TRUE(image.initialized());
13358
13359 VkImageView view;
13360 VkImageViewCreateInfo ivci = {};
13361 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13362 ivci.image = image.handle();
13363 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13364 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13365 ivci.subresourceRange.layerCount = 1;
13366 ivci.subresourceRange.baseMipLevel = 0;
13367 ivci.subresourceRange.levelCount = 1;
13368 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13369
13370 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13371 ASSERT_VK_SUCCESS(err);
13372
13373 VkDescriptorImageInfo image_info{};
13374 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13375 image_info.imageView = view;
13376 image_info.sampler = sampler;
13377
13378 VkWriteDescriptorSet descriptor_write = {};
13379 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13380 descriptor_write.dstSet = descriptor_set;
13381 descriptor_write.dstBinding = 0;
13382 descriptor_write.descriptorCount = 1;
13383 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13384 descriptor_write.pImageInfo = &image_info;
13385
13386 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13387
13388 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013389 char const *vsSource =
13390 "#version 450\n"
13391 "\n"
13392 "out gl_PerVertex { \n"
13393 " vec4 gl_Position;\n"
13394 "};\n"
13395 "void main(){\n"
13396 " gl_Position = vec4(1);\n"
13397 "}\n";
13398 char const *fsSource =
13399 "#version 450\n"
13400 "\n"
13401 "layout(set=0, binding=0) uniform sampler2D s;\n"
13402 "layout(location=0) out vec4 x;\n"
13403 "void main(){\n"
13404 " x = texture(s, vec2(1));\n"
13405 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013406 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13407 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13408 VkPipelineObj pipe(m_device);
13409 pipe.AddShader(&vs);
13410 pipe.AddShader(&fs);
13411 pipe.AddColorAttachment();
13412 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13413
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013415
Tony Barbour552f6c02016-12-21 14:34:07 -070013416 m_commandBuffer->BeginCommandBuffer();
13417 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013418 // Bind pipeline to cmd buffer
13419 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13420 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13421 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070013422
13423 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13424 VkRect2D scissor = {{0, 0}, {16, 16}};
13425 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13426 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13427
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013428 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013429 m_commandBuffer->EndRenderPass();
13430 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013431 // Submit cmd buffer then destroy sampler
13432 VkSubmitInfo submit_info = {};
13433 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13434 submit_info.commandBufferCount = 1;
13435 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13436 // Submit cmd buffer and then destroy imageView while in-flight
13437 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13438
13439 vkDestroyImageView(m_device->device(), view, nullptr);
13440 m_errorMonitor->VerifyFound();
13441 vkQueueWaitIdle(m_device->m_queue);
13442 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013443 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013444 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013445 vkDestroyImageView(m_device->device(), view, NULL);
13446 vkDestroySampler(m_device->device(), sampler, nullptr);
13447 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13448 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13449 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13450}
13451
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013452TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
13453 TEST_DESCRIPTION("Delete in-use bufferView.");
13454
Tony Barbour1fa09702017-03-16 12:09:08 -060013455 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13457
13458 VkDescriptorPoolSize ds_type_count;
13459 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13460 ds_type_count.descriptorCount = 1;
13461
13462 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13463 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13464 ds_pool_ci.maxSets = 1;
13465 ds_pool_ci.poolSizeCount = 1;
13466 ds_pool_ci.pPoolSizes = &ds_type_count;
13467
13468 VkDescriptorPool ds_pool;
13469 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13470 ASSERT_VK_SUCCESS(err);
13471
13472 VkDescriptorSetLayoutBinding layout_binding;
13473 layout_binding.binding = 0;
13474 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13475 layout_binding.descriptorCount = 1;
13476 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13477 layout_binding.pImmutableSamplers = NULL;
13478
13479 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13480 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13481 ds_layout_ci.bindingCount = 1;
13482 ds_layout_ci.pBindings = &layout_binding;
13483 VkDescriptorSetLayout ds_layout;
13484 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13485 ASSERT_VK_SUCCESS(err);
13486
13487 VkDescriptorSetAllocateInfo alloc_info = {};
13488 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13489 alloc_info.descriptorSetCount = 1;
13490 alloc_info.descriptorPool = ds_pool;
13491 alloc_info.pSetLayouts = &ds_layout;
13492 VkDescriptorSet descriptor_set;
13493 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13494 ASSERT_VK_SUCCESS(err);
13495
13496 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13497 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13498 pipeline_layout_ci.pNext = NULL;
13499 pipeline_layout_ci.setLayoutCount = 1;
13500 pipeline_layout_ci.pSetLayouts = &ds_layout;
13501
13502 VkPipelineLayout pipeline_layout;
13503 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13504 ASSERT_VK_SUCCESS(err);
13505
13506 VkBuffer buffer;
13507 uint32_t queue_family_index = 0;
13508 VkBufferCreateInfo buffer_create_info = {};
13509 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13510 buffer_create_info.size = 1024;
13511 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13512 buffer_create_info.queueFamilyIndexCount = 1;
13513 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13514
13515 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13516 ASSERT_VK_SUCCESS(err);
13517
13518 VkMemoryRequirements memory_reqs;
13519 VkDeviceMemory buffer_memory;
13520
13521 VkMemoryAllocateInfo memory_info = {};
13522 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13523 memory_info.allocationSize = 0;
13524 memory_info.memoryTypeIndex = 0;
13525
13526 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13527 memory_info.allocationSize = memory_reqs.size;
13528 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13529 ASSERT_TRUE(pass);
13530
13531 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13532 ASSERT_VK_SUCCESS(err);
13533 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13534 ASSERT_VK_SUCCESS(err);
13535
13536 VkBufferView view;
13537 VkBufferViewCreateInfo bvci = {};
13538 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13539 bvci.buffer = buffer;
13540 bvci.format = VK_FORMAT_R8_UNORM;
13541 bvci.range = VK_WHOLE_SIZE;
13542
13543 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13544 ASSERT_VK_SUCCESS(err);
13545
13546 VkWriteDescriptorSet descriptor_write = {};
13547 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13548 descriptor_write.dstSet = descriptor_set;
13549 descriptor_write.dstBinding = 0;
13550 descriptor_write.descriptorCount = 1;
13551 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13552 descriptor_write.pTexelBufferView = &view;
13553
13554 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13555
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013556 char const *vsSource =
13557 "#version 450\n"
13558 "\n"
13559 "out gl_PerVertex { \n"
13560 " vec4 gl_Position;\n"
13561 "};\n"
13562 "void main(){\n"
13563 " gl_Position = vec4(1);\n"
13564 "}\n";
13565 char const *fsSource =
13566 "#version 450\n"
13567 "\n"
13568 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13569 "layout(location=0) out vec4 x;\n"
13570 "void main(){\n"
13571 " x = imageLoad(s, 0);\n"
13572 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013573 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13574 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13575 VkPipelineObj pipe(m_device);
13576 pipe.AddShader(&vs);
13577 pipe.AddShader(&fs);
13578 pipe.AddColorAttachment();
13579 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13580
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013582
Tony Barbour552f6c02016-12-21 14:34:07 -070013583 m_commandBuffer->BeginCommandBuffer();
13584 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013585 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13586 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13587 VkRect2D scissor = {{0, 0}, {16, 16}};
13588 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13589 // Bind pipeline to cmd buffer
13590 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13591 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13592 &descriptor_set, 0, nullptr);
13593 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013594 m_commandBuffer->EndRenderPass();
13595 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013596
13597 VkSubmitInfo submit_info = {};
13598 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13599 submit_info.commandBufferCount = 1;
13600 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13601 // Submit cmd buffer and then destroy bufferView while in-flight
13602 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13603
13604 vkDestroyBufferView(m_device->device(), view, nullptr);
13605 m_errorMonitor->VerifyFound();
13606 vkQueueWaitIdle(m_device->m_queue);
13607 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013608 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013609 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013610 vkDestroyBufferView(m_device->device(), view, NULL);
13611 vkDestroyBuffer(m_device->device(), buffer, NULL);
13612 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13613 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13614 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13615 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13616}
13617
Tobin Ehlis209532e2016-09-07 13:52:18 -060013618TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13619 TEST_DESCRIPTION("Delete in-use sampler.");
13620
Tony Barbour1fa09702017-03-16 12:09:08 -060013621 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013622 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13623
13624 VkDescriptorPoolSize ds_type_count;
13625 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13626 ds_type_count.descriptorCount = 1;
13627
13628 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13629 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13630 ds_pool_ci.maxSets = 1;
13631 ds_pool_ci.poolSizeCount = 1;
13632 ds_pool_ci.pPoolSizes = &ds_type_count;
13633
13634 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013635 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013636 ASSERT_VK_SUCCESS(err);
13637
13638 VkSamplerCreateInfo sampler_ci = {};
13639 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13640 sampler_ci.pNext = NULL;
13641 sampler_ci.magFilter = VK_FILTER_NEAREST;
13642 sampler_ci.minFilter = VK_FILTER_NEAREST;
13643 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13644 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13645 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13646 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13647 sampler_ci.mipLodBias = 1.0;
13648 sampler_ci.anisotropyEnable = VK_FALSE;
13649 sampler_ci.maxAnisotropy = 1;
13650 sampler_ci.compareEnable = VK_FALSE;
13651 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13652 sampler_ci.minLod = 1.0;
13653 sampler_ci.maxLod = 1.0;
13654 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13655 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13656 VkSampler sampler;
13657
13658 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13659 ASSERT_VK_SUCCESS(err);
13660
13661 VkDescriptorSetLayoutBinding layout_binding;
13662 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013663 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013664 layout_binding.descriptorCount = 1;
13665 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13666 layout_binding.pImmutableSamplers = NULL;
13667
13668 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13669 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13670 ds_layout_ci.bindingCount = 1;
13671 ds_layout_ci.pBindings = &layout_binding;
13672 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013673 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013674 ASSERT_VK_SUCCESS(err);
13675
13676 VkDescriptorSetAllocateInfo alloc_info = {};
13677 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13678 alloc_info.descriptorSetCount = 1;
13679 alloc_info.descriptorPool = ds_pool;
13680 alloc_info.pSetLayouts = &ds_layout;
13681 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013682 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013683 ASSERT_VK_SUCCESS(err);
13684
13685 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13686 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13687 pipeline_layout_ci.pNext = NULL;
13688 pipeline_layout_ci.setLayoutCount = 1;
13689 pipeline_layout_ci.pSetLayouts = &ds_layout;
13690
13691 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013692 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013693 ASSERT_VK_SUCCESS(err);
13694
13695 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013696 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 -060013697 ASSERT_TRUE(image.initialized());
13698
13699 VkImageView view;
13700 VkImageViewCreateInfo ivci = {};
13701 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13702 ivci.image = image.handle();
13703 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13704 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13705 ivci.subresourceRange.layerCount = 1;
13706 ivci.subresourceRange.baseMipLevel = 0;
13707 ivci.subresourceRange.levelCount = 1;
13708 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13709
13710 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13711 ASSERT_VK_SUCCESS(err);
13712
13713 VkDescriptorImageInfo image_info{};
13714 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13715 image_info.imageView = view;
13716 image_info.sampler = sampler;
13717
13718 VkWriteDescriptorSet descriptor_write = {};
13719 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13720 descriptor_write.dstSet = descriptor_set;
13721 descriptor_write.dstBinding = 0;
13722 descriptor_write.descriptorCount = 1;
13723 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13724 descriptor_write.pImageInfo = &image_info;
13725
13726 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13727
13728 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013729 char const *vsSource =
13730 "#version 450\n"
13731 "\n"
13732 "out gl_PerVertex { \n"
13733 " vec4 gl_Position;\n"
13734 "};\n"
13735 "void main(){\n"
13736 " gl_Position = vec4(1);\n"
13737 "}\n";
13738 char const *fsSource =
13739 "#version 450\n"
13740 "\n"
13741 "layout(set=0, binding=0) uniform sampler2D s;\n"
13742 "layout(location=0) out vec4 x;\n"
13743 "void main(){\n"
13744 " x = texture(s, vec2(1));\n"
13745 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013746 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13747 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13748 VkPipelineObj pipe(m_device);
13749 pipe.AddShader(&vs);
13750 pipe.AddShader(&fs);
13751 pipe.AddColorAttachment();
13752 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13753
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013755
Tony Barbour552f6c02016-12-21 14:34:07 -070013756 m_commandBuffer->BeginCommandBuffer();
13757 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013758 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013759 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13760 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13761 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013762
13763 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13764 VkRect2D scissor = {{0, 0}, {16, 16}};
13765 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13766 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13767
Tobin Ehlis209532e2016-09-07 13:52:18 -060013768 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013769 m_commandBuffer->EndRenderPass();
13770 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013771 // Submit cmd buffer then destroy sampler
13772 VkSubmitInfo submit_info = {};
13773 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13774 submit_info.commandBufferCount = 1;
13775 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13776 // Submit cmd buffer and then destroy sampler while in-flight
13777 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13778
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013779 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013780 m_errorMonitor->VerifyFound();
13781 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013782
Tobin Ehlis209532e2016-09-07 13:52:18 -060013783 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013784 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13785 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013786 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013787 vkDestroyImageView(m_device->device(), view, NULL);
13788 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13789 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13790 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13791}
13792
Mark Mueller1cd9f412016-08-25 13:23:52 -060013793TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013794 TEST_DESCRIPTION(
13795 "Call VkQueueSubmit with a semaphore that is already "
13796 "signaled but not waited on by the queue. Wait on a "
13797 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013798
Tony Barbour1fa09702017-03-16 12:09:08 -060013799 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13801
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013802 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 -070013803 const char *invalid_fence_wait_message =
13804 " which has not been submitted on a Queue or during "
13805 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013806
Chris Forbese98aec12017-05-18 12:50:14 -070013807 VkCommandBufferObj cb1(m_device, m_commandPool);
13808 cb1.begin();
13809 cb1.end();
Mark Mueller96a56d52016-08-24 10:28:05 -060013810
13811 VkSemaphoreCreateInfo semaphore_create_info = {};
13812 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13813 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013814 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013815 VkSubmitInfo submit_info = {};
13816 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13817 submit_info.commandBufferCount = 1;
Chris Forbese98aec12017-05-18 12:50:14 -070013818 submit_info.pCommandBuffers = &cb1.handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013819 submit_info.signalSemaphoreCount = 1;
13820 submit_info.pSignalSemaphores = &semaphore;
13821 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Chris Forbese98aec12017-05-18 12:50:14 -070013822
Tony Barbour552f6c02016-12-21 14:34:07 -070013823 m_commandBuffer->BeginCommandBuffer();
13824 m_commandBuffer->EndCommandBuffer();
Chris Forbese98aec12017-05-18 12:50:14 -070013825 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013827 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13828 m_errorMonitor->VerifyFound();
13829
Mark Mueller1cd9f412016-08-25 13:23:52 -060013830 VkFenceCreateInfo fence_create_info = {};
13831 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13832 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013833 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013834
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013836 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13837 m_errorMonitor->VerifyFound();
13838
Mark Mueller4042b652016-09-05 22:52:21 -060013839 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013840 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013841 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13842}
13843
Tobin Ehlis4af23302016-07-19 10:50:30 -060013844TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013845 TEST_DESCRIPTION(
13846 "Bind a secondary command buffer with with a framebuffer "
13847 "that does not match the framebuffer for the active "
13848 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013849 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013850 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13851
13852 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013853 VkAttachmentDescription attachment = {0,
13854 VK_FORMAT_B8G8R8A8_UNORM,
13855 VK_SAMPLE_COUNT_1_BIT,
13856 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13857 VK_ATTACHMENT_STORE_OP_STORE,
13858 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13859 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13860 VK_IMAGE_LAYOUT_UNDEFINED,
13861 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013862
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013863 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013864
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013865 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013866
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013867 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013868
13869 VkRenderPass rp;
13870 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13871 ASSERT_VK_SUCCESS(err);
13872
13873 // A compatible framebuffer.
13874 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013875 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 -060013876 ASSERT_TRUE(image.initialized());
13877
13878 VkImageViewCreateInfo ivci = {
13879 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13880 nullptr,
13881 0,
13882 image.handle(),
13883 VK_IMAGE_VIEW_TYPE_2D,
13884 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013885 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13886 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013887 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13888 };
13889 VkImageView view;
13890 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13891 ASSERT_VK_SUCCESS(err);
13892
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013893 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013894 VkFramebuffer fb;
13895 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13896 ASSERT_VK_SUCCESS(err);
13897
13898 VkCommandBufferAllocateInfo cbai = {};
13899 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013900 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013901 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13902 cbai.commandBufferCount = 1;
13903
13904 VkCommandBuffer sec_cb;
13905 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13906 ASSERT_VK_SUCCESS(err);
13907 VkCommandBufferBeginInfo cbbi = {};
13908 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013909 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013910 cbii.renderPass = renderPass();
13911 cbii.framebuffer = fb;
13912 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13913 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013914 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 -060013915 cbbi.pInheritanceInfo = &cbii;
13916 vkBeginCommandBuffer(sec_cb, &cbbi);
13917 vkEndCommandBuffer(sec_cb);
13918
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013919 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013920 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13921 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013924 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013925 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13926 m_errorMonitor->VerifyFound();
13927 // Cleanup
13928 vkDestroyImageView(m_device->device(), view, NULL);
13929 vkDestroyRenderPass(m_device->device(), rp, NULL);
13930 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13931}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013932
13933TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013934 TEST_DESCRIPTION(
13935 "If logicOp is available on the device, set it to an "
13936 "invalid value. If logicOp is not available, attempt to "
13937 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013938 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13940
13941 auto features = m_device->phy().features();
13942 // Set the expected error depending on whether or not logicOp available
13943 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13945 "If logic operations feature not "
13946 "enabled, logicOpEnable must be "
13947 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013948 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013950 }
13951 // Create a pipeline using logicOp
13952 VkResult err;
13953
13954 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13955 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13956
13957 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013958 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013959 ASSERT_VK_SUCCESS(err);
13960
13961 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13962 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13963 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013964 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013965 vp_state_ci.pViewports = &vp;
13966 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013967 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013968 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013969
13970 VkPipelineShaderStageCreateInfo shaderStages[2];
13971 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13972
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013973 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13974 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013975 shaderStages[0] = vs.GetStageCreateInfo();
13976 shaderStages[1] = fs.GetStageCreateInfo();
13977
13978 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13979 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13980
13981 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13982 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13983 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13984
13985 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13986 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013987 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013988
13989 VkPipelineColorBlendAttachmentState att = {};
13990 att.blendEnable = VK_FALSE;
13991 att.colorWriteMask = 0xf;
13992
13993 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13994 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13995 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13996 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013997 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013998 cb_ci.attachmentCount = 1;
13999 cb_ci.pAttachments = &att;
14000
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014001 VkPipelineMultisampleStateCreateInfo ms_ci = {};
14002 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
14003 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
14004
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014005 VkGraphicsPipelineCreateInfo gp_ci = {};
14006 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14007 gp_ci.stageCount = 2;
14008 gp_ci.pStages = shaderStages;
14009 gp_ci.pVertexInputState = &vi_ci;
14010 gp_ci.pInputAssemblyState = &ia_ci;
14011 gp_ci.pViewportState = &vp_state_ci;
14012 gp_ci.pRasterizationState = &rs_ci;
14013 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014014 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014015 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14016 gp_ci.layout = pipeline_layout;
14017 gp_ci.renderPass = renderPass();
14018
14019 VkPipelineCacheCreateInfo pc_ci = {};
14020 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14021
14022 VkPipeline pipeline;
14023 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014024 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014025 ASSERT_VK_SUCCESS(err);
14026
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014027 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014028 m_errorMonitor->VerifyFound();
14029 if (VK_SUCCESS == err) {
14030 vkDestroyPipeline(m_device->device(), pipeline, NULL);
14031 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014032 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
14033 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
14034}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014035
Mike Stroyanaccf7692015-05-12 16:00:45 -060014036#if GTEST_IS_THREADSAFE
14037struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014038 VkCommandBuffer commandBuffer;
Mike Stroyanca855662017-05-02 11:06:27 -060014039 VkDevice device;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014040 VkEvent event;
14041 bool bailout;
14042};
14043
Karl Schultz6addd812016-02-02 17:17:23 -070014044extern "C" void *AddToCommandBuffer(void *arg) {
14045 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014046
Mike Stroyana6d14942016-07-13 15:10:05 -060014047 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014048 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014049 if (data->bailout) {
14050 break;
14051 }
14052 }
14053 return NULL;
14054}
14055
Karl Schultz6addd812016-02-02 17:17:23 -070014056TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014057 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014058
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014060
Tony Barbour1fa09702017-03-16 12:09:08 -060014061 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060014062 ASSERT_NO_FATAL_FAILURE(InitViewport());
14063 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14064
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014065 // Calls AllocateCommandBuffers
14066 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014067
14068 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014069 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014070
14071 VkEventCreateInfo event_info;
14072 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014073 VkResult err;
14074
14075 memset(&event_info, 0, sizeof(event_info));
14076 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
14077
Chia-I Wuf7458c52015-10-26 21:10:41 +080014078 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014079 ASSERT_VK_SUCCESS(err);
14080
Mike Stroyanaccf7692015-05-12 16:00:45 -060014081 err = vkResetEvent(device(), event);
14082 ASSERT_VK_SUCCESS(err);
14083
14084 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014085 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014086 data.event = event;
14087 data.bailout = false;
14088 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060014089
14090 // First do some correct operations using multiple threads.
14091 // Add many entries to command buffer from another thread.
14092 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
14093 // Make non-conflicting calls from this thread at the same time.
14094 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060014095 uint32_t count;
14096 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060014097 }
14098 test_platform_thread_join(thread, NULL);
14099
14100 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060014101 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014102 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014103 // Add many entries to command buffer from this thread at the same time.
14104 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014105
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014106 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014107 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014108
Mike Stroyan10b8cb72016-01-22 15:22:03 -070014109 m_errorMonitor->SetBailout(NULL);
14110
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014111 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014112
Chia-I Wuf7458c52015-10-26 21:10:41 +080014113 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014114}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014115#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014116
Karl Schultz6addd812016-02-02 17:17:23 -070014117TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014118 TEST_DESCRIPTION("Test that errors are produced for a spirv modules with invalid code sizes");
Chris Forbes1cc79542016-07-20 11:13:44 +120014119
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014121
Tony Barbour1fa09702017-03-16 12:09:08 -060014122 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014123 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14124
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014125 VkShaderModule module;
14126 VkShaderModuleCreateInfo moduleCreateInfo;
14127 struct icd_spv_header spv;
14128
14129 spv.magic = ICD_SPV_MAGIC;
14130 spv.version = ICD_SPV_VERSION;
14131 spv.gen_magic = 0;
14132
14133 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14134 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014135 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014136 moduleCreateInfo.codeSize = 4;
14137 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014138 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014139
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014140 m_errorMonitor->VerifyFound();
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014141
14142 char const *vsSource =
14143 "#version 450\n"
14144 "\n"
14145 "layout(location=0) out float x;\n"
14146 "out gl_PerVertex {\n"
14147 " vec4 gl_Position;\n"
14148 "};\n"
14149 "void main(){\n"
14150 " gl_Position = vec4(1);\n"
14151 " x = 0;\n"
14152 "}\n";
14153
14154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02816);
14155 std::vector<unsigned int> shader;
14156 VkShaderModuleCreateInfo module_create_info;
14157 VkShaderModule shader_module;
14158 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14159 module_create_info.pNext = NULL;
14160 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, shader);
14161 module_create_info.pCode = shader.data();
14162 // Introduce failure by making codeSize a non-multiple of 4
14163 module_create_info.codeSize = shader.size() * sizeof(unsigned int) - 1;
14164 module_create_info.flags = 0;
14165 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
14166
14167 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014168}
14169
Karl Schultz6addd812016-02-02 17:17:23 -070014170TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014171 TEST_DESCRIPTION(
14172 "Test that an error is produced for a spirv module "
14173 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120014174
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014176
Tony Barbour1fa09702017-03-16 12:09:08 -060014177 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14179
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014180 VkShaderModule module;
14181 VkShaderModuleCreateInfo moduleCreateInfo;
14182 struct icd_spv_header spv;
14183
14184 spv.magic = ~ICD_SPV_MAGIC;
14185 spv.version = ICD_SPV_VERSION;
14186 spv.gen_magic = 0;
14187
14188 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14189 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014190 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014191 moduleCreateInfo.codeSize = sizeof(spv) + 16;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014192 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014193 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014194
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014195 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014196}
14197
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014198#if 0
14199// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070014200TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014202 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014203
Tony Barbour1fa09702017-03-16 12:09:08 -060014204 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014205 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14206
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014207 VkShaderModule module;
14208 VkShaderModuleCreateInfo moduleCreateInfo;
14209 struct icd_spv_header spv;
14210
14211 spv.magic = ICD_SPV_MAGIC;
14212 spv.version = ~ICD_SPV_VERSION;
14213 spv.gen_magic = 0;
14214
14215 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14216 moduleCreateInfo.pNext = NULL;
14217
Karl Schultz6addd812016-02-02 17:17:23 -070014218 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014219 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14220 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014221 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014222
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014223 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014224}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014225#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014226
Karl Schultz6addd812016-02-02 17:17:23 -070014227TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014228 TEST_DESCRIPTION(
14229 "Test that a warning is produced for a vertex output that "
14230 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014232
Tony Barbour1fa09702017-03-16 12:09:08 -060014233 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014235
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014236 char const *vsSource =
14237 "#version 450\n"
14238 "\n"
14239 "layout(location=0) out float x;\n"
14240 "out gl_PerVertex {\n"
14241 " vec4 gl_Position;\n"
14242 "};\n"
14243 "void main(){\n"
14244 " gl_Position = vec4(1);\n"
14245 " x = 0;\n"
14246 "}\n";
14247 char const *fsSource =
14248 "#version 450\n"
14249 "\n"
14250 "layout(location=0) out vec4 color;\n"
14251 "void main(){\n"
14252 " color = vec4(1);\n"
14253 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120014254
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014255 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14256 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014257
14258 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014259 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014260 pipe.AddShader(&vs);
14261 pipe.AddShader(&fs);
14262
Chris Forbes9f7ff632015-05-25 11:13:08 +120014263 VkDescriptorSetObj descriptorSet(m_device);
14264 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014265 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014266
Tony Barbour5781e8f2015-08-04 16:23:11 -060014267 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014268
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014269 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014270}
Chris Forbes9f7ff632015-05-25 11:13:08 +120014271
Mark Mueller098c9cb2016-09-08 09:01:57 -060014272TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
14273 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14274
Tony Barbour1fa09702017-03-16 12:09:08 -060014275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14277
14278 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014279 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014280
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014281 char const *vsSource =
14282 "#version 450\n"
14283 "\n"
14284 "out gl_PerVertex {\n"
14285 " vec4 gl_Position;\n"
14286 "};\n"
14287 "void main(){\n"
14288 " gl_Position = vec4(1);\n"
14289 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014290
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014291 char const *fsSource =
14292 "#version 450\n"
14293 "\n"
14294 "layout (constant_id = 0) const float r = 0.0f;\n"
14295 "layout(location = 0) out vec4 uFragColor;\n"
14296 "void main(){\n"
14297 " uFragColor = vec4(r,1,0,1);\n"
14298 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014299
14300 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14301 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14302
14303 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14304 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14305
14306 VkPipelineLayout pipeline_layout;
14307 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14308
14309 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
14310 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14311 vp_state_create_info.viewportCount = 1;
14312 VkViewport viewport = {};
14313 vp_state_create_info.pViewports = &viewport;
14314 vp_state_create_info.scissorCount = 1;
14315 VkRect2D scissors = {};
14316 vp_state_create_info.pScissors = &scissors;
14317
14318 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
14319
14320 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
14321 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
14322 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
14323 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
14324
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014325 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060014326
14327 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
14328 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14329
14330 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
14331 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14332 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14333
14334 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
14335 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
14336 rasterization_state_create_info.pNext = nullptr;
14337 rasterization_state_create_info.lineWidth = 1.0f;
14338 rasterization_state_create_info.rasterizerDiscardEnable = true;
14339
14340 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
14341 color_blend_attachment_state.blendEnable = VK_FALSE;
14342 color_blend_attachment_state.colorWriteMask = 0xf;
14343
14344 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
14345 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14346 color_blend_state_create_info.attachmentCount = 1;
14347 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
14348
14349 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
14350 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14351 graphicspipe_create_info.stageCount = 2;
14352 graphicspipe_create_info.pStages = shader_stage_create_info;
14353 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
14354 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
14355 graphicspipe_create_info.pViewportState = &vp_state_create_info;
14356 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
14357 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
14358 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
14359 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14360 graphicspipe_create_info.layout = pipeline_layout;
14361 graphicspipe_create_info.renderPass = renderPass();
14362
14363 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
14364 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14365
14366 VkPipelineCache pipelineCache;
14367 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
14368
14369 // This structure maps constant ids to data locations.
14370 const VkSpecializationMapEntry entry =
14371 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014372 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014373
14374 uint32_t data = 1;
14375
14376 // Set up the info describing spec map and data
14377 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014378 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060014379 };
14380 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
14381
14382 VkPipeline pipeline;
14383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
14384 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
14385 m_errorMonitor->VerifyFound();
14386
14387 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
14388 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14389}
14390
14391TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
14392 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14393
Tony Barbour1fa09702017-03-16 12:09:08 -060014394 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14396
14397 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
14398
14399 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
14400 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14401 descriptor_pool_type_count[0].descriptorCount = 1;
14402 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14403 descriptor_pool_type_count[1].descriptorCount = 1;
14404
14405 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14406 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14407 descriptor_pool_create_info.maxSets = 1;
14408 descriptor_pool_create_info.poolSizeCount = 2;
14409 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
14410 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14411
14412 VkDescriptorPool descriptorset_pool;
14413 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14414
14415 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14416 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14417 descriptorset_layout_binding.descriptorCount = 1;
14418 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070014419 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014420
14421 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14422 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14423 descriptorset_layout_create_info.bindingCount = 1;
14424 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14425
14426 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014427 ASSERT_VK_SUCCESS(
14428 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014429
14430 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14431 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14432 descriptorset_allocate_info.descriptorSetCount = 1;
14433 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14434 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14435 VkDescriptorSet descriptorset;
14436 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14437
14438 // Challenge core_validation with a non uniform buffer type.
14439 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
14440
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014441 char const *vsSource =
14442 "#version 450\n"
14443 "\n"
14444 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14445 " mat4 mvp;\n"
14446 "} ubuf;\n"
14447 "out gl_PerVertex {\n"
14448 " vec4 gl_Position;\n"
14449 "};\n"
14450 "void main(){\n"
14451 " gl_Position = ubuf.mvp * vec4(1);\n"
14452 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014453
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014454 char const *fsSource =
14455 "#version 450\n"
14456 "\n"
14457 "layout(location = 0) out vec4 uFragColor;\n"
14458 "void main(){\n"
14459 " uFragColor = vec4(0,1,0,1);\n"
14460 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014461
14462 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14463 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14464
14465 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14466 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14467 pipeline_layout_create_info.setLayoutCount = 1;
14468 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14469
14470 VkPipelineLayout pipeline_layout;
14471 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14472
14473 VkPipelineObj pipe(m_device);
14474 pipe.AddColorAttachment();
14475 pipe.AddShader(&vs);
14476 pipe.AddShader(&fs);
14477
14478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
14479 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14480 m_errorMonitor->VerifyFound();
14481
14482 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14483 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14484 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14485}
14486
14487TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
14488 TEST_DESCRIPTION(
14489 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
14490
Tony Barbour1fa09702017-03-16 12:09:08 -060014491 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14493
14494 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
14495
14496 VkDescriptorPoolSize descriptor_pool_type_count = {};
14497 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14498 descriptor_pool_type_count.descriptorCount = 1;
14499
14500 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14501 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14502 descriptor_pool_create_info.maxSets = 1;
14503 descriptor_pool_create_info.poolSizeCount = 1;
14504 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
14505 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14506
14507 VkDescriptorPool descriptorset_pool;
14508 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14509
14510 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14511 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14512 descriptorset_layout_binding.descriptorCount = 1;
14513 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
14514 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070014515 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014516
14517 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14518 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14519 descriptorset_layout_create_info.bindingCount = 1;
14520 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14521
14522 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014523 ASSERT_VK_SUCCESS(
14524 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014525
14526 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14527 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14528 descriptorset_allocate_info.descriptorSetCount = 1;
14529 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14530 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14531 VkDescriptorSet descriptorset;
14532 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14533
14534 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14535
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014536 char const *vsSource =
14537 "#version 450\n"
14538 "\n"
14539 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14540 " mat4 mvp;\n"
14541 "} ubuf;\n"
14542 "out gl_PerVertex {\n"
14543 " vec4 gl_Position;\n"
14544 "};\n"
14545 "void main(){\n"
14546 " gl_Position = ubuf.mvp * vec4(1);\n"
14547 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014548
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014549 char const *fsSource =
14550 "#version 450\n"
14551 "\n"
14552 "layout(location = 0) out vec4 uFragColor;\n"
14553 "void main(){\n"
14554 " uFragColor = vec4(0,1,0,1);\n"
14555 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014556
14557 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14558 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14559
14560 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14561 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14562 pipeline_layout_create_info.setLayoutCount = 1;
14563 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14564
14565 VkPipelineLayout pipeline_layout;
14566 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14567
14568 VkPipelineObj pipe(m_device);
14569 pipe.AddColorAttachment();
14570 pipe.AddShader(&vs);
14571 pipe.AddShader(&fs);
14572
14573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14574 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14575 m_errorMonitor->VerifyFound();
14576
14577 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14578 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14579 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14580}
14581
14582TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014583 TEST_DESCRIPTION(
14584 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14585 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014586
Tony Barbour1fa09702017-03-16 12:09:08 -060014587 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014588 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14589
14590 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014591 "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 -060014592
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014593 char const *vsSource =
14594 "#version 450\n"
14595 "\n"
14596 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14597 "out gl_PerVertex {\n"
14598 " vec4 gl_Position;\n"
14599 "};\n"
14600 "void main(){\n"
14601 " gl_Position = vec4(consts.x);\n"
14602 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014603
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014604 char const *fsSource =
14605 "#version 450\n"
14606 "\n"
14607 "layout(location = 0) out vec4 uFragColor;\n"
14608 "void main(){\n"
14609 " uFragColor = vec4(0,1,0,1);\n"
14610 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014611
14612 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14613 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14614
14615 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14616 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14617
14618 // Set up a push constant range
14619 VkPushConstantRange push_constant_ranges = {};
14620 // Set to the wrong stage to challenge core_validation
14621 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14622 push_constant_ranges.size = 4;
14623
14624 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14625 pipeline_layout_create_info.pushConstantRangeCount = 1;
14626
14627 VkPipelineLayout pipeline_layout;
14628 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14629
14630 VkPipelineObj pipe(m_device);
14631 pipe.AddColorAttachment();
14632 pipe.AddShader(&vs);
14633 pipe.AddShader(&fs);
14634
14635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14636 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14637 m_errorMonitor->VerifyFound();
14638
14639 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14640}
14641
14642TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14643 TEST_DESCRIPTION(
14644 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14645
Tony Barbour1fa09702017-03-16 12:09:08 -060014646 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014647 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14648
14649 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014650 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014651
14652 // Some awkward steps are required to test with custom device features.
14653 std::vector<const char *> device_extension_names;
14654 auto features = m_device->phy().features();
14655 // Disable support for 64 bit floats
14656 features.shaderFloat64 = false;
14657 // The sacrificial device object
14658 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
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 "void main(){\n"
14667 " gl_Position = vec4(1);\n"
14668 "}\n";
14669 char const *fsSource =
14670 "#version 450\n"
14671 "\n"
14672 "layout(location=0) out vec4 color;\n"
14673 "void main(){\n"
14674 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14675 " color = vec4(green);\n"
14676 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014677
14678 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14679 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14680
14681 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014682
14683 VkPipelineObj pipe(&test_device);
14684 pipe.AddColorAttachment();
14685 pipe.AddShader(&vs);
14686 pipe.AddShader(&fs);
14687
14688 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14689 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14690 VkPipelineLayout pipeline_layout;
14691 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14692
14693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14694 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14695 m_errorMonitor->VerifyFound();
14696
14697 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14698}
14699
Mark Lobodzinski20832822017-03-24 14:49:45 -060014700TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14701 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14702 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014703
Tony Barbour1fa09702017-03-16 12:09:08 -060014704 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14706
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014707 char const *vsSource =
14708 "#version 450\n"
14709 "\n"
14710 "out gl_PerVertex {\n"
14711 " vec4 gl_Position;\n"
14712 "};\n"
14713 "layout(xfb_buffer = 1) out;"
14714 "void main(){\n"
14715 " gl_Position = vec4(1);\n"
14716 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014717
Mark Lobodzinski20832822017-03-24 14:49:45 -060014718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014719
Mark Lobodzinski20832822017-03-24 14:49:45 -060014720 std::vector<unsigned int> spv;
14721 VkShaderModuleCreateInfo module_create_info;
14722 VkShaderModule shader_module;
14723 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14724 module_create_info.pNext = NULL;
14725 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14726 module_create_info.pCode = spv.data();
14727 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14728 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014729
Mark Lobodzinski20832822017-03-24 14:49:45 -060014730 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014731
Mark Lobodzinski20832822017-03-24 14:49:45 -060014732 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014733}
14734
Karl Schultz6addd812016-02-02 17:17:23 -070014735TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014736 TEST_DESCRIPTION(
14737 "Test that an error is produced for a fragment shader input "
14738 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014739
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014741
Tony Barbour1fa09702017-03-16 12:09:08 -060014742 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014743 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014744
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014745 char const *vsSource =
14746 "#version 450\n"
14747 "\n"
14748 "out gl_PerVertex {\n"
14749 " vec4 gl_Position;\n"
14750 "};\n"
14751 "void main(){\n"
14752 " gl_Position = vec4(1);\n"
14753 "}\n";
14754 char const *fsSource =
14755 "#version 450\n"
14756 "\n"
14757 "layout(location=0) in float x;\n"
14758 "layout(location=0) out vec4 color;\n"
14759 "void main(){\n"
14760 " color = vec4(x);\n"
14761 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014762
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014763 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14764 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014765
14766 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014767 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014768 pipe.AddShader(&vs);
14769 pipe.AddShader(&fs);
14770
Chris Forbes59cb88d2015-05-25 11:13:13 +120014771 VkDescriptorSetObj descriptorSet(m_device);
14772 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014773 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014774
Tony Barbour5781e8f2015-08-04 16:23:11 -060014775 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014776
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014777 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014778}
14779
Karl Schultz6addd812016-02-02 17:17:23 -070014780TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014781 TEST_DESCRIPTION(
14782 "Test that an error is produced for a fragment shader input "
14783 "within an interace block, which is not present in the outputs "
14784 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014786
Tony Barbour1fa09702017-03-16 12:09:08 -060014787 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +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 "out gl_PerVertex {\n"
14794 " vec4 gl_Position;\n"
14795 "};\n"
14796 "void main(){\n"
14797 " gl_Position = vec4(1);\n"
14798 "}\n";
14799 char const *fsSource =
14800 "#version 450\n"
14801 "\n"
14802 "in block { layout(location=0) float x; } ins;\n"
14803 "layout(location=0) out vec4 color;\n"
14804 "void main(){\n"
14805 " color = vec4(ins.x);\n"
14806 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014807
14808 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14809 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14810
14811 VkPipelineObj pipe(m_device);
14812 pipe.AddColorAttachment();
14813 pipe.AddShader(&vs);
14814 pipe.AddShader(&fs);
14815
14816 VkDescriptorSetObj descriptorSet(m_device);
14817 descriptorSet.AppendDummy();
14818 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14819
14820 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14821
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014822 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014823}
14824
Karl Schultz6addd812016-02-02 17:17:23 -070014825TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014826 TEST_DESCRIPTION(
14827 "Test that an error is produced for mismatched array sizes "
14828 "across the vertex->fragment shader interface");
14829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14830 "Type mismatch on location 0.0: 'ptr to "
14831 "output arr[2] of float32' vs 'ptr to "
14832 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014833
Tony Barbour1fa09702017-03-16 12:09:08 -060014834 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014835 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14836
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014837 char const *vsSource =
14838 "#version 450\n"
14839 "\n"
14840 "layout(location=0) out float x[2];\n"
14841 "out gl_PerVertex {\n"
14842 " vec4 gl_Position;\n"
14843 "};\n"
14844 "void main(){\n"
14845 " x[0] = 0; x[1] = 0;\n"
14846 " gl_Position = vec4(1);\n"
14847 "}\n";
14848 char const *fsSource =
14849 "#version 450\n"
14850 "\n"
14851 "layout(location=0) in float x[1];\n"
14852 "layout(location=0) out vec4 color;\n"
14853 "void main(){\n"
14854 " color = vec4(x[0]);\n"
14855 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014856
14857 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14858 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14859
14860 VkPipelineObj pipe(m_device);
14861 pipe.AddColorAttachment();
14862 pipe.AddShader(&vs);
14863 pipe.AddShader(&fs);
14864
14865 VkDescriptorSetObj descriptorSet(m_device);
14866 descriptorSet.AppendDummy();
14867 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14868
14869 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14870
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014871 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014872}
14873
Karl Schultz6addd812016-02-02 17:17:23 -070014874TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014875 TEST_DESCRIPTION(
14876 "Test that an error is produced for mismatched types across "
14877 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014879
Tony Barbour1fa09702017-03-16 12:09:08 -060014880 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014882
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014883 char const *vsSource =
14884 "#version 450\n"
14885 "\n"
14886 "layout(location=0) out int x;\n"
14887 "out gl_PerVertex {\n"
14888 " vec4 gl_Position;\n"
14889 "};\n"
14890 "void main(){\n"
14891 " x = 0;\n"
14892 " gl_Position = vec4(1);\n"
14893 "}\n";
14894 char const *fsSource =
14895 "#version 450\n"
14896 "\n"
14897 "layout(location=0) in float x;\n" /* VS writes int */
14898 "layout(location=0) out vec4 color;\n"
14899 "void main(){\n"
14900 " color = vec4(x);\n"
14901 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014902
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014903 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14904 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014905
14906 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014907 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014908 pipe.AddShader(&vs);
14909 pipe.AddShader(&fs);
14910
Chris Forbesb56af562015-05-25 11:13:17 +120014911 VkDescriptorSetObj descriptorSet(m_device);
14912 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014913 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014914
Tony Barbour5781e8f2015-08-04 16:23:11 -060014915 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014916
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014917 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014918}
14919
Karl Schultz6addd812016-02-02 17:17:23 -070014920TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014921 TEST_DESCRIPTION(
14922 "Test that an error is produced for mismatched types across "
14923 "the vertex->fragment shader interface, when the variable is contained within "
14924 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014926
Tony Barbour1fa09702017-03-16 12:09:08 -060014927 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +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=0) int 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" /* VS writes int */
14945 "layout(location=0) out vec4 color;\n"
14946 "void main(){\n"
14947 " color = vec4(ins.x);\n"
14948 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +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, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014968 TEST_DESCRIPTION(
14969 "Test that an error is produced for location mismatches across "
14970 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14971 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014972 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 +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=1) 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) 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 Forbese9928822016-02-17 14:44:52 +130015012}
15013
15014TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015015 TEST_DESCRIPTION(
15016 "Test that an error is produced for component mismatches across the "
15017 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
15018 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015019 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 +130015020
Tony Barbour1fa09702017-03-16 12:09:08 -060015021 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130015022 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15023
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015024 char const *vsSource =
15025 "#version 450\n"
15026 "\n"
15027 "out block { layout(location=0, component=0) float x; } outs;\n"
15028 "out gl_PerVertex {\n"
15029 " vec4 gl_Position;\n"
15030 "};\n"
15031 "void main(){\n"
15032 " outs.x = 0;\n"
15033 " gl_Position = vec4(1);\n"
15034 "}\n";
15035 char const *fsSource =
15036 "#version 450\n"
15037 "\n"
15038 "in block { layout(location=0, component=1) float x; } ins;\n"
15039 "layout(location=0) out vec4 color;\n"
15040 "void main(){\n"
15041 " color = vec4(ins.x);\n"
15042 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130015043
15044 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15045 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15046
15047 VkPipelineObj pipe(m_device);
15048 pipe.AddColorAttachment();
15049 pipe.AddShader(&vs);
15050 pipe.AddShader(&fs);
15051
15052 VkDescriptorSetObj descriptorSet(m_device);
15053 descriptorSet.AppendDummy();
15054 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15055
15056 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15057
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015058 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130015059}
15060
Chris Forbes1f3b0152016-11-30 12:48:40 +130015061TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
15062 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15063
Tony Barbour1fa09702017-03-16 12:09:08 -060015064 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130015065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15066
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015067 char const *vsSource =
15068 "#version 450\n"
15069 "layout(location=0) out mediump float x;\n"
15070 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15071 char const *fsSource =
15072 "#version 450\n"
15073 "layout(location=0) in highp float x;\n"
15074 "layout(location=0) out vec4 color;\n"
15075 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130015076
15077 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15078 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15079
15080 VkPipelineObj pipe(m_device);
15081 pipe.AddColorAttachment();
15082 pipe.AddShader(&vs);
15083 pipe.AddShader(&fs);
15084
15085 VkDescriptorSetObj descriptorSet(m_device);
15086 descriptorSet.AppendDummy();
15087 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15088
15089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15090
15091 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15092
15093 m_errorMonitor->VerifyFound();
15094}
15095
Chris Forbes870a39e2016-11-30 12:55:56 +130015096TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
15097 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15098
Tony Barbour1fa09702017-03-16 12:09:08 -060015099 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130015100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15101
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015102 char const *vsSource =
15103 "#version 450\n"
15104 "out block { layout(location=0) mediump float x; };\n"
15105 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15106 char const *fsSource =
15107 "#version 450\n"
15108 "in block { layout(location=0) highp float x; };\n"
15109 "layout(location=0) out vec4 color;\n"
15110 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130015111
15112 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15113 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15114
15115 VkPipelineObj pipe(m_device);
15116 pipe.AddColorAttachment();
15117 pipe.AddShader(&vs);
15118 pipe.AddShader(&fs);
15119
15120 VkDescriptorSetObj descriptorSet(m_device);
15121 descriptorSet.AppendDummy();
15122 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15123
15124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15125
15126 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15127
15128 m_errorMonitor->VerifyFound();
15129}
15130
Karl Schultz6addd812016-02-02 17:17:23 -070015131TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015132 TEST_DESCRIPTION(
15133 "Test that a warning is produced for a vertex attribute which is "
15134 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015136
Tony Barbour1fa09702017-03-16 12:09:08 -060015137 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120015139
15140 VkVertexInputBindingDescription input_binding;
15141 memset(&input_binding, 0, sizeof(input_binding));
15142
15143 VkVertexInputAttributeDescription input_attrib;
15144 memset(&input_attrib, 0, sizeof(input_attrib));
15145 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15146
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015147 char const *vsSource =
15148 "#version 450\n"
15149 "\n"
15150 "out gl_PerVertex {\n"
15151 " vec4 gl_Position;\n"
15152 "};\n"
15153 "void main(){\n"
15154 " gl_Position = vec4(1);\n"
15155 "}\n";
15156 char const *fsSource =
15157 "#version 450\n"
15158 "\n"
15159 "layout(location=0) out vec4 color;\n"
15160 "void main(){\n"
15161 " color = vec4(1);\n"
15162 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120015163
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015164 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15165 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120015166
15167 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015168 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120015169 pipe.AddShader(&vs);
15170 pipe.AddShader(&fs);
15171
15172 pipe.AddVertexInputBindings(&input_binding, 1);
15173 pipe.AddVertexInputAttribs(&input_attrib, 1);
15174
Chris Forbesde136e02015-05-25 11:13:28 +120015175 VkDescriptorSetObj descriptorSet(m_device);
15176 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015177 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120015178
Tony Barbour5781e8f2015-08-04 16:23:11 -060015179 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120015180
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015181 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120015182}
15183
Karl Schultz6addd812016-02-02 17:17:23 -070015184TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015185 TEST_DESCRIPTION(
15186 "Test that a warning is produced for a location mismatch on "
15187 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015189
Tony Barbour1fa09702017-03-16 12:09:08 -060015190 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130015191 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15192
15193 VkVertexInputBindingDescription input_binding;
15194 memset(&input_binding, 0, sizeof(input_binding));
15195
15196 VkVertexInputAttributeDescription input_attrib;
15197 memset(&input_attrib, 0, sizeof(input_attrib));
15198 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15199
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015200 char const *vsSource =
15201 "#version 450\n"
15202 "\n"
15203 "layout(location=1) in float x;\n"
15204 "out gl_PerVertex {\n"
15205 " vec4 gl_Position;\n"
15206 "};\n"
15207 "void main(){\n"
15208 " gl_Position = vec4(x);\n"
15209 "}\n";
15210 char const *fsSource =
15211 "#version 450\n"
15212 "\n"
15213 "layout(location=0) out vec4 color;\n"
15214 "void main(){\n"
15215 " color = vec4(1);\n"
15216 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130015217
15218 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15219 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15220
15221 VkPipelineObj pipe(m_device);
15222 pipe.AddColorAttachment();
15223 pipe.AddShader(&vs);
15224 pipe.AddShader(&fs);
15225
15226 pipe.AddVertexInputBindings(&input_binding, 1);
15227 pipe.AddVertexInputAttribs(&input_attrib, 1);
15228
15229 VkDescriptorSetObj descriptorSet(m_device);
15230 descriptorSet.AppendDummy();
15231 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15232
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015233 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015234 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15235
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015236 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130015237}
15238
Karl Schultz6addd812016-02-02 17:17:23 -070015239TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015240 TEST_DESCRIPTION(
15241 "Test that an error is produced for a vertex shader input which is not "
15242 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15244 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015245
Tony Barbour1fa09702017-03-16 12:09:08 -060015246 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120015248
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015249 char const *vsSource =
15250 "#version 450\n"
15251 "\n"
15252 "layout(location=0) in vec4 x;\n" /* not provided */
15253 "out gl_PerVertex {\n"
15254 " vec4 gl_Position;\n"
15255 "};\n"
15256 "void main(){\n"
15257 " gl_Position = x;\n"
15258 "}\n";
15259 char const *fsSource =
15260 "#version 450\n"
15261 "\n"
15262 "layout(location=0) out vec4 color;\n"
15263 "void main(){\n"
15264 " color = vec4(1);\n"
15265 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120015266
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015267 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15268 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120015269
15270 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015271 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120015272 pipe.AddShader(&vs);
15273 pipe.AddShader(&fs);
15274
Chris Forbes62e8e502015-05-25 11:13:29 +120015275 VkDescriptorSetObj descriptorSet(m_device);
15276 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015277 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120015278
Tony Barbour5781e8f2015-08-04 16:23:11 -060015279 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120015280
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015281 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120015282}
15283
Karl Schultz6addd812016-02-02 17:17:23 -070015284TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015285 TEST_DESCRIPTION(
15286 "Test that an error is produced for a mismatch between the "
15287 "fundamental type (float/int/uint) of an attribute and the "
15288 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015289 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 -060015290
Tony Barbour1fa09702017-03-16 12:09:08 -060015291 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015292 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015293
15294 VkVertexInputBindingDescription input_binding;
15295 memset(&input_binding, 0, sizeof(input_binding));
15296
15297 VkVertexInputAttributeDescription input_attrib;
15298 memset(&input_attrib, 0, sizeof(input_attrib));
15299 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15300
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015301 char const *vsSource =
15302 "#version 450\n"
15303 "\n"
15304 "layout(location=0) in int x;\n" /* attrib provided float */
15305 "out gl_PerVertex {\n"
15306 " vec4 gl_Position;\n"
15307 "};\n"
15308 "void main(){\n"
15309 " gl_Position = vec4(x);\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 Forbesc97d98e2015-05-25 11:13:31 +120015318
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015319 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15320 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015321
15322 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015323 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015324 pipe.AddShader(&vs);
15325 pipe.AddShader(&fs);
15326
15327 pipe.AddVertexInputBindings(&input_binding, 1);
15328 pipe.AddVertexInputAttribs(&input_attrib, 1);
15329
Chris Forbesc97d98e2015-05-25 11:13:31 +120015330 VkDescriptorSetObj descriptorSet(m_device);
15331 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015332 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015333
Tony Barbour5781e8f2015-08-04 16:23:11 -060015334 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015335
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015336 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015337}
15338
Chris Forbesc68b43c2016-04-06 11:18:47 +120015339TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015340 TEST_DESCRIPTION(
15341 "Test that an error is produced for a pipeline containing multiple "
15342 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15344 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120015345
Tony Barbour1fa09702017-03-16 12:09:08 -060015346 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120015347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15348
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015349 char const *vsSource =
15350 "#version 450\n"
15351 "\n"
15352 "out gl_PerVertex {\n"
15353 " vec4 gl_Position;\n"
15354 "};\n"
15355 "void main(){\n"
15356 " gl_Position = vec4(1);\n"
15357 "}\n";
15358 char const *fsSource =
15359 "#version 450\n"
15360 "\n"
15361 "layout(location=0) out vec4 color;\n"
15362 "void main(){\n"
15363 " color = vec4(1);\n"
15364 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120015365
15366 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15367 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15368
15369 VkPipelineObj pipe(m_device);
15370 pipe.AddColorAttachment();
15371 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015372 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120015373 pipe.AddShader(&fs);
15374
15375 VkDescriptorSetObj descriptorSet(m_device);
15376 descriptorSet.AppendDummy();
15377 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15378
15379 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15380
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015381 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120015382}
15383
Chris Forbes82ff92a2016-09-09 10:50:24 +120015384TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120015386
Tony Barbour1fa09702017-03-16 12:09:08 -060015387 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120015388 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15389
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015390 char const *vsSource =
15391 "#version 450\n"
15392 "out gl_PerVertex {\n"
15393 " vec4 gl_Position;\n"
15394 "};\n"
15395 "void main(){\n"
15396 " gl_Position = vec4(0);\n"
15397 "}\n";
15398 char const *fsSource =
15399 "#version 450\n"
15400 "\n"
15401 "layout(location=0) out vec4 color;\n"
15402 "void main(){\n"
15403 " color = vec4(1);\n"
15404 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120015405
15406 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15407 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
15408
15409 VkPipelineObj pipe(m_device);
15410 pipe.AddColorAttachment();
15411 pipe.AddShader(&vs);
15412 pipe.AddShader(&fs);
15413
15414 VkDescriptorSetObj descriptorSet(m_device);
15415 descriptorSet.AppendDummy();
15416 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15417
15418 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15419
15420 m_errorMonitor->VerifyFound();
15421}
15422
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015423TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15425 "pDepthStencilState is NULL when rasterization is enabled and subpass "
15426 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015427
Tony Barbour1fa09702017-03-16 12:09:08 -060015428 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015429 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15430
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015431 char const *vsSource =
15432 "#version 450\n"
15433 "void main(){ gl_Position = vec4(0); }\n";
15434 char const *fsSource =
15435 "#version 450\n"
15436 "\n"
15437 "layout(location=0) out vec4 color;\n"
15438 "void main(){\n"
15439 " color = vec4(1);\n"
15440 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015441
15442 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15443 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15444
15445 VkPipelineObj pipe(m_device);
15446 pipe.AddColorAttachment();
15447 pipe.AddShader(&vs);
15448 pipe.AddShader(&fs);
15449
15450 VkDescriptorSetObj descriptorSet(m_device);
15451 descriptorSet.AppendDummy();
15452 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15453
15454 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015455 {
15456 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15457 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15458 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015459 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015460 {
15461 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15462 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15463 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015464 },
15465 };
15466 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015467 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015468 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015469 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
15470 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015471 VkRenderPass rp;
15472 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15473 ASSERT_VK_SUCCESS(err);
15474
15475 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
15476
15477 m_errorMonitor->VerifyFound();
15478
15479 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15480}
15481
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015482TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015483 TEST_DESCRIPTION(
15484 "Test that an error is produced for a variable output from "
15485 "the TCS without the patch decoration, but consumed in the TES "
15486 "with the decoration.");
15487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15488 "is per-vertex in tessellation control shader stage "
15489 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120015490
Tony Barbour1fa09702017-03-16 12:09:08 -060015491 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120015492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15493
Chris Forbesc1e852d2016-04-04 19:26:42 +120015494 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070015495 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120015496 return;
15497 }
15498
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015499 char const *vsSource =
15500 "#version 450\n"
15501 "void main(){}\n";
15502 char const *tcsSource =
15503 "#version 450\n"
15504 "layout(location=0) out int x[];\n"
15505 "layout(vertices=3) out;\n"
15506 "void main(){\n"
15507 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15508 " gl_TessLevelInner[0] = 1;\n"
15509 " x[gl_InvocationID] = gl_InvocationID;\n"
15510 "}\n";
15511 char const *tesSource =
15512 "#version 450\n"
15513 "layout(triangles, equal_spacing, cw) in;\n"
15514 "layout(location=0) patch in int x;\n"
15515 "out gl_PerVertex { vec4 gl_Position; };\n"
15516 "void main(){\n"
15517 " gl_Position.xyz = gl_TessCoord;\n"
15518 " gl_Position.w = x;\n"
15519 "}\n";
15520 char const *fsSource =
15521 "#version 450\n"
15522 "layout(location=0) out vec4 color;\n"
15523 "void main(){\n"
15524 " color = vec4(1);\n"
15525 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015526
15527 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15528 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15529 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15530 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15531
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015532 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15533 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015534
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015535 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015536
15537 VkPipelineObj pipe(m_device);
15538 pipe.SetInputAssembly(&iasci);
15539 pipe.SetTessellation(&tsci);
15540 pipe.AddColorAttachment();
15541 pipe.AddShader(&vs);
15542 pipe.AddShader(&tcs);
15543 pipe.AddShader(&tes);
15544 pipe.AddShader(&fs);
15545
15546 VkDescriptorSetObj descriptorSet(m_device);
15547 descriptorSet.AppendDummy();
15548 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15549
15550 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15551
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015552 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015553}
15554
Cort Stratton2bcca1b2017-05-05 16:02:35 -070015555TEST_F(VkLayerTest, CreatePipelineTessErrors) {
15556 TEST_DESCRIPTION("Test various errors when creating a graphics pipeline with tessellation stages active.");
15557
15558 ASSERT_NO_FATAL_FAILURE(Init());
15559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15560
15561 if (!m_device->phy().features().tessellationShader) {
15562 printf(" Device does not support tessellation shaders; skipped.\n");
15563 return;
15564 }
15565
15566 char const *vsSource =
15567 "#version 450\n"
15568 "void main(){}\n";
15569 char const *tcsSource =
15570 "#version 450\n"
15571 "layout(vertices=3) out;\n"
15572 "void main(){\n"
15573 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15574 " gl_TessLevelInner[0] = 1;\n"
15575 "}\n";
15576 char const *tesSource =
15577 "#version 450\n"
15578 "layout(triangles, equal_spacing, cw) in;\n"
15579 "out gl_PerVertex { vec4 gl_Position; };\n"
15580 "void main(){\n"
15581 " gl_Position.xyz = gl_TessCoord;\n"
15582 " gl_Position.w = 0;\n"
15583 "}\n";
15584 char const *fsSource =
15585 "#version 450\n"
15586 "layout(location=0) out vec4 color;\n"
15587 "void main(){\n"
15588 " color = vec4(1);\n"
15589 "}\n";
15590
15591 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15592 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15593 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15594 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15595
15596 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15597 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
15598
15599 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
15600
15601 VkDescriptorSetObj descriptorSet(m_device);
15602 descriptorSet.AppendDummy();
15603 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15604
15605 {
15606 VkPipelineObj pipe(m_device);
15607 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15608 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15609 pipe.SetInputAssembly(&iasci_bad);
15610 pipe.AddColorAttachment();
15611 pipe.AddShader(&vs);
15612 pipe.AddShader(&fs);
15613
15614 // Pass a tess control shader without a tess eval shader
15615 pipe.AddShader(&tcs);
15616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00534);
15617 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15618 m_errorMonitor->VerifyFound();
15619 }
15620
15621 {
15622 VkPipelineObj pipe(m_device);
15623 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15624 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15625 pipe.SetInputAssembly(&iasci_bad);
15626 pipe.AddColorAttachment();
15627 pipe.AddShader(&vs);
15628 pipe.AddShader(&fs);
15629
15630 // Pass a tess eval shader without a tess control shader
15631 pipe.AddShader(&tes);
15632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00535);
15633 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15634 m_errorMonitor->VerifyFound();
15635 }
15636
15637 {
15638 VkPipelineObj pipe(m_device);
15639 pipe.SetInputAssembly(&iasci);
15640 pipe.AddColorAttachment();
15641 pipe.AddShader(&vs);
15642 pipe.AddShader(&fs);
15643
15644 // Pass patch topology without tessellation shaders
15645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02100);
15646 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15647 m_errorMonitor->VerifyFound();
15648
15649 pipe.AddShader(&tcs);
15650 pipe.AddShader(&tes);
15651 // Pass a NULL pTessellationState (with active tessellation shader stages)
15652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00536);
15653 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15654 m_errorMonitor->VerifyFound();
15655
15656 // Pass an invalid pTessellationState (bad sType)
15657 VkPipelineTessellationStateCreateInfo tsci_bad = tsci;
15658 tsci_bad.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
15659 pipe.SetTessellation(&tsci_bad);
15660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01427);
15661 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15662 m_errorMonitor->VerifyFound();
15663 // Pass out-of-range patchControlPoints
15664 tsci_bad = tsci;
15665 tsci_bad.patchControlPoints = 0;
15666 pipe.SetTessellation(&tsci);
15667 pipe.SetTessellation(&tsci_bad);
15668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15669 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15670 m_errorMonitor->VerifyFound();
15671 tsci_bad.patchControlPoints = m_device->props.limits.maxTessellationPatchSize + 1;
15672 pipe.SetTessellation(&tsci_bad);
15673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15674 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15675 m_errorMonitor->VerifyFound();
15676 pipe.SetTessellation(&tsci);
15677
15678 // Pass an invalid primitive topology
15679 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15680 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
15681 pipe.SetInputAssembly(&iasci_bad);
15682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02099);
15683 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15684 m_errorMonitor->VerifyFound();
15685 pipe.SetInputAssembly(&iasci);
15686 }
15687}
15688
Karl Schultz6addd812016-02-02 17:17:23 -070015689TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015690 TEST_DESCRIPTION(
15691 "Test that an error is produced for a vertex attribute setup where multiple "
15692 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15694 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015695
Tony Barbour1fa09702017-03-16 12:09:08 -060015696 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015698
15699 /* Two binding descriptions for binding 0 */
15700 VkVertexInputBindingDescription input_bindings[2];
15701 memset(input_bindings, 0, sizeof(input_bindings));
15702
15703 VkVertexInputAttributeDescription input_attrib;
15704 memset(&input_attrib, 0, sizeof(input_attrib));
15705 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15706
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015707 char const *vsSource =
15708 "#version 450\n"
15709 "\n"
15710 "layout(location=0) in float x;\n" /* attrib provided float */
15711 "out gl_PerVertex {\n"
15712 " vec4 gl_Position;\n"
15713 "};\n"
15714 "void main(){\n"
15715 " gl_Position = vec4(x);\n"
15716 "}\n";
15717 char const *fsSource =
15718 "#version 450\n"
15719 "\n"
15720 "layout(location=0) out vec4 color;\n"
15721 "void main(){\n"
15722 " color = vec4(1);\n"
15723 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015724
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015725 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15726 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015727
15728 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015729 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015730 pipe.AddShader(&vs);
15731 pipe.AddShader(&fs);
15732
15733 pipe.AddVertexInputBindings(input_bindings, 2);
15734 pipe.AddVertexInputAttribs(&input_attrib, 1);
15735
Chris Forbes280ba2c2015-06-12 11:16:41 +120015736 VkDescriptorSetObj descriptorSet(m_device);
15737 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015738 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015739
Tony Barbour5781e8f2015-08-04 16:23:11 -060015740 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015741
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015742 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015743}
Chris Forbes8f68b562015-05-25 11:13:32 +120015744
Karl Schultz6addd812016-02-02 17:17:23 -070015745TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015746 TEST_DESCRIPTION(
15747 "Test that an error is produced for a fragment shader which does not "
15748 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015750
Tony Barbour1fa09702017-03-16 12:09:08 -060015751 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015752
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015753 char const *vsSource =
15754 "#version 450\n"
15755 "\n"
15756 "out gl_PerVertex {\n"
15757 " vec4 gl_Position;\n"
15758 "};\n"
15759 "void main(){\n"
15760 " gl_Position = vec4(1);\n"
15761 "}\n";
15762 char const *fsSource =
15763 "#version 450\n"
15764 "\n"
15765 "void main(){\n"
15766 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015767
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015768 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15769 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015770
15771 VkPipelineObj pipe(m_device);
15772 pipe.AddShader(&vs);
15773 pipe.AddShader(&fs);
15774
Chia-I Wu08accc62015-07-07 11:50:03 +080015775 /* set up CB 0, not written */
15776 pipe.AddColorAttachment();
15777 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015778
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015779 VkDescriptorSetObj descriptorSet(m_device);
15780 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015781 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015782
Tony Barbour5781e8f2015-08-04 16:23:11 -060015783 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015784
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015785 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015786}
15787
Karl Schultz6addd812016-02-02 17:17:23 -070015788TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015789 TEST_DESCRIPTION(
15790 "Test that a warning is produced for a fragment shader which provides a spurious "
15791 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015793 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015794
Tony Barbour1fa09702017-03-16 12:09:08 -060015795 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015796
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015797 char const *vsSource =
15798 "#version 450\n"
15799 "\n"
15800 "out gl_PerVertex {\n"
15801 " vec4 gl_Position;\n"
15802 "};\n"
15803 "void main(){\n"
15804 " gl_Position = vec4(1);\n"
15805 "}\n";
15806 char const *fsSource =
15807 "#version 450\n"
15808 "\n"
15809 "layout(location=0) out vec4 x;\n"
15810 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15811 "void main(){\n"
15812 " x = vec4(1);\n"
15813 " y = vec4(1);\n"
15814 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015815
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015816 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15817 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015818
15819 VkPipelineObj pipe(m_device);
15820 pipe.AddShader(&vs);
15821 pipe.AddShader(&fs);
15822
Chia-I Wu08accc62015-07-07 11:50:03 +080015823 /* set up CB 0, not written */
15824 pipe.AddColorAttachment();
15825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015826 /* FS writes CB 1, but we don't configure it */
15827
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015828 VkDescriptorSetObj descriptorSet(m_device);
15829 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015830 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015831
Tony Barbour5781e8f2015-08-04 16:23:11 -060015832 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015833
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015834 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015835}
15836
Karl Schultz6addd812016-02-02 17:17:23 -070015837TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015838 TEST_DESCRIPTION(
15839 "Test that an error is produced for a mismatch between the fundamental "
15840 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015842
Tony Barbour1fa09702017-03-16 12:09:08 -060015843 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015844
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015845 char const *vsSource =
15846 "#version 450\n"
15847 "\n"
15848 "out gl_PerVertex {\n"
15849 " vec4 gl_Position;\n"
15850 "};\n"
15851 "void main(){\n"
15852 " gl_Position = vec4(1);\n"
15853 "}\n";
15854 char const *fsSource =
15855 "#version 450\n"
15856 "\n"
15857 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15858 "void main(){\n"
15859 " x = ivec4(1);\n"
15860 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015861
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015862 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15863 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015864
15865 VkPipelineObj pipe(m_device);
15866 pipe.AddShader(&vs);
15867 pipe.AddShader(&fs);
15868
Chia-I Wu08accc62015-07-07 11:50:03 +080015869 /* set up CB 0; type is UNORM by default */
15870 pipe.AddColorAttachment();
15871 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015872
Chris Forbesa36d69e2015-05-25 11:13:44 +120015873 VkDescriptorSetObj descriptorSet(m_device);
15874 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015875 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015876
Tony Barbour5781e8f2015-08-04 16:23:11 -060015877 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015878
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015879 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015880}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015881
Karl Schultz6addd812016-02-02 17:17:23 -070015882TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015883 TEST_DESCRIPTION(
15884 "Test that an error is produced for a shader consuming a uniform "
15885 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015887
Tony Barbour1fa09702017-03-16 12:09:08 -060015888 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015889
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015890 char const *vsSource =
15891 "#version 450\n"
15892 "\n"
15893 "out gl_PerVertex {\n"
15894 " vec4 gl_Position;\n"
15895 "};\n"
15896 "void main(){\n"
15897 " gl_Position = vec4(1);\n"
15898 "}\n";
15899 char const *fsSource =
15900 "#version 450\n"
15901 "\n"
15902 "layout(location=0) out vec4 x;\n"
15903 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15904 "void main(){\n"
15905 " x = vec4(bar.y);\n"
15906 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015907
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015908 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15909 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015910
Chris Forbes556c76c2015-08-14 12:04:59 +120015911 VkPipelineObj pipe(m_device);
15912 pipe.AddShader(&vs);
15913 pipe.AddShader(&fs);
15914
15915 /* set up CB 0; type is UNORM by default */
15916 pipe.AddColorAttachment();
15917 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15918
15919 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015920 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015921
15922 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15923
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015924 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015925}
15926
Chris Forbes5c59e902016-02-26 16:56:09 +130015927TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015928 TEST_DESCRIPTION(
15929 "Test that an error is produced for a shader consuming push constants "
15930 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015932
Tony Barbour1fa09702017-03-16 12:09:08 -060015933 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015934
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015935 char const *vsSource =
15936 "#version 450\n"
15937 "\n"
15938 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15939 "out gl_PerVertex {\n"
15940 " vec4 gl_Position;\n"
15941 "};\n"
15942 "void main(){\n"
15943 " gl_Position = vec4(consts.x);\n"
15944 "}\n";
15945 char const *fsSource =
15946 "#version 450\n"
15947 "\n"
15948 "layout(location=0) out vec4 x;\n"
15949 "void main(){\n"
15950 " x = vec4(1);\n"
15951 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015952
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
15960 /* set up CB 0; type is UNORM by default */
15961 pipe.AddColorAttachment();
15962 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15963
15964 VkDescriptorSetObj descriptorSet(m_device);
15965 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15966
15967 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15968
15969 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015970 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015971}
15972
Chris Forbes3fb17902016-08-22 14:57:55 +120015973TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015974 TEST_DESCRIPTION(
15975 "Test that an error is produced for a shader consuming an input attachment "
15976 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15978 "consumes input attachment index 0 but not provided in subpass");
15979
Tony Barbour1fa09702017-03-16 12:09:08 -060015980 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015981
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015982 char const *vsSource =
15983 "#version 450\n"
15984 "\n"
15985 "out gl_PerVertex {\n"
15986 " vec4 gl_Position;\n"
15987 "};\n"
15988 "void main(){\n"
15989 " gl_Position = vec4(1);\n"
15990 "}\n";
15991 char const *fsSource =
15992 "#version 450\n"
15993 "\n"
15994 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15995 "layout(location=0) out vec4 color;\n"
15996 "void main() {\n"
15997 " color = subpassLoad(x);\n"
15998 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015999
16000 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16001 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16002
16003 VkPipelineObj pipe(m_device);
16004 pipe.AddShader(&vs);
16005 pipe.AddShader(&fs);
16006 pipe.AddColorAttachment();
16007 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16008
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016009 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16010 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120016011 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016012 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120016013 ASSERT_VK_SUCCESS(err);
16014
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016015 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120016016 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016017 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120016018 ASSERT_VK_SUCCESS(err);
16019
16020 // error here.
16021 pipe.CreateVKPipeline(pl, renderPass());
16022
16023 m_errorMonitor->VerifyFound();
16024
16025 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16026 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16027}
16028
Chris Forbes5a9a0472016-08-22 16:02:09 +120016029TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016030 TEST_DESCRIPTION(
16031 "Test that an error is produced for a shader consuming an input attachment "
16032 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120016033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16034 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
16035
Tony Barbour1fa09702017-03-16 12:09:08 -060016036 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120016037
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016038 char const *vsSource =
16039 "#version 450\n"
16040 "\n"
16041 "out gl_PerVertex {\n"
16042 " vec4 gl_Position;\n"
16043 "};\n"
16044 "void main(){\n"
16045 " gl_Position = vec4(1);\n"
16046 "}\n";
16047 char const *fsSource =
16048 "#version 450\n"
16049 "\n"
16050 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16051 "layout(location=0) out vec4 color;\n"
16052 "void main() {\n"
16053 " color = subpassLoad(x);\n"
16054 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120016055
16056 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16057 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16058
16059 VkPipelineObj pipe(m_device);
16060 pipe.AddShader(&vs);
16061 pipe.AddShader(&fs);
16062 pipe.AddColorAttachment();
16063 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16064
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016065 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16066 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016067 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016068 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016069 ASSERT_VK_SUCCESS(err);
16070
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016071 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016072 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016073 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016074 ASSERT_VK_SUCCESS(err);
16075
16076 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016077 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16078 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16079 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
16080 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16081 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 +120016082 };
16083 VkAttachmentReference color = {
16084 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16085 };
16086 VkAttachmentReference input = {
16087 1, VK_IMAGE_LAYOUT_GENERAL,
16088 };
16089
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016090 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016091
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016092 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016093 VkRenderPass rp;
16094 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
16095 ASSERT_VK_SUCCESS(err);
16096
16097 // error here.
16098 pipe.CreateVKPipeline(pl, rp);
16099
16100 m_errorMonitor->VerifyFound();
16101
16102 vkDestroyRenderPass(m_device->device(), rp, nullptr);
16103 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16104 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16105}
16106
Chris Forbes541f7b02016-08-22 15:30:27 +120016107TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016108 TEST_DESCRIPTION(
16109 "Test that an error is produced for a shader consuming an input attachment "
16110 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120016111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070016112 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120016113
Tony Barbour1fa09702017-03-16 12:09:08 -060016114 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120016115
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016116 char const *vsSource =
16117 "#version 450\n"
16118 "\n"
16119 "out gl_PerVertex {\n"
16120 " vec4 gl_Position;\n"
16121 "};\n"
16122 "void main(){\n"
16123 " gl_Position = vec4(1);\n"
16124 "}\n";
16125 char const *fsSource =
16126 "#version 450\n"
16127 "\n"
16128 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
16129 "layout(location=0) out vec4 color;\n"
16130 "void main() {\n"
16131 " color = subpassLoad(xs[0]);\n"
16132 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120016133
16134 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16135 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16136
16137 VkPipelineObj pipe(m_device);
16138 pipe.AddShader(&vs);
16139 pipe.AddShader(&fs);
16140 pipe.AddColorAttachment();
16141 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16142
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016143 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16144 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120016145 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016146 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016147 ASSERT_VK_SUCCESS(err);
16148
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016149 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120016150 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016151 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016152 ASSERT_VK_SUCCESS(err);
16153
16154 // error here.
16155 pipe.CreateVKPipeline(pl, renderPass());
16156
16157 m_errorMonitor->VerifyFound();
16158
16159 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16160 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16161}
16162
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016163TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016164 TEST_DESCRIPTION(
16165 "Test that an error is produced for a compute pipeline consuming a "
16166 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016168
Tony Barbour1fa09702017-03-16 12:09:08 -060016169 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016170
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016171 char const *csSource =
16172 "#version 450\n"
16173 "\n"
16174 "layout(local_size_x=1) in;\n"
16175 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16176 "void main(){\n"
16177 " x = vec4(1);\n"
16178 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016179
16180 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16181
16182 VkDescriptorSetObj descriptorSet(m_device);
16183 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16184
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016185 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16186 nullptr,
16187 0,
16188 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16189 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16190 descriptorSet.GetPipelineLayout(),
16191 VK_NULL_HANDLE,
16192 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016193
16194 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016195 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016196
16197 m_errorMonitor->VerifyFound();
16198
16199 if (err == VK_SUCCESS) {
16200 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16201 }
16202}
16203
Chris Forbes22a9b092016-07-19 14:34:05 +120016204TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016205 TEST_DESCRIPTION(
16206 "Test that an error is produced for a pipeline consuming a "
16207 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16209 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120016210
Tony Barbour1fa09702017-03-16 12:09:08 -060016211 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120016212
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016213 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
16214 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120016215 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016216 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016217 ASSERT_VK_SUCCESS(err);
16218
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016219 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120016220 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016221 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016222 ASSERT_VK_SUCCESS(err);
16223
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016224 char const *csSource =
16225 "#version 450\n"
16226 "\n"
16227 "layout(local_size_x=1) in;\n"
16228 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16229 "void main() {\n"
16230 " x.x = 1.0f;\n"
16231 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120016232 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16233
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016234 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16235 nullptr,
16236 0,
16237 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16238 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16239 pl,
16240 VK_NULL_HANDLE,
16241 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120016242
16243 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016244 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120016245
16246 m_errorMonitor->VerifyFound();
16247
16248 if (err == VK_SUCCESS) {
16249 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16250 }
16251
16252 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16253 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16254}
16255
Chris Forbes50020592016-07-27 13:52:41 +120016256TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016257 TEST_DESCRIPTION(
16258 "Test that an error is produced when an image view type "
16259 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120016260
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016261 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 +120016262
Tony Barbour1fa09702017-03-16 12:09:08 -060016263 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120016264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16265
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016266 char const *vsSource =
16267 "#version 450\n"
16268 "\n"
16269 "out gl_PerVertex { vec4 gl_Position; };\n"
16270 "void main() { gl_Position = vec4(0); }\n";
16271 char const *fsSource =
16272 "#version 450\n"
16273 "\n"
16274 "layout(set=0, binding=0) uniform sampler3D s;\n"
16275 "layout(location=0) out vec4 color;\n"
16276 "void main() {\n"
16277 " color = texture(s, vec3(0));\n"
16278 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120016279 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16280 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16281
16282 VkPipelineObj pipe(m_device);
16283 pipe.AddShader(&vs);
16284 pipe.AddShader(&fs);
16285 pipe.AddColorAttachment();
16286
16287 VkTextureObj texture(m_device, nullptr);
16288 VkSamplerObj sampler(m_device);
16289
16290 VkDescriptorSetObj descriptorSet(m_device);
16291 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16292 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16293
16294 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16295 ASSERT_VK_SUCCESS(err);
16296
Tony Barbour552f6c02016-12-21 14:34:07 -070016297 m_commandBuffer->BeginCommandBuffer();
16298 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120016299
16300 m_commandBuffer->BindPipeline(pipe);
16301 m_commandBuffer->BindDescriptorSet(descriptorSet);
16302
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016303 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120016304 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016305 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120016306 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16307
16308 // error produced here.
16309 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16310
16311 m_errorMonitor->VerifyFound();
16312
Tony Barbour552f6c02016-12-21 14:34:07 -070016313 m_commandBuffer->EndRenderPass();
16314 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120016315}
16316
Chris Forbes5533bfc2016-07-27 14:12:34 +120016317TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016318 TEST_DESCRIPTION(
16319 "Test that an error is produced when a multisampled images "
16320 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016321
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016323
Tony Barbour1fa09702017-03-16 12:09:08 -060016324 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120016325 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16326
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016327 char const *vsSource =
16328 "#version 450\n"
16329 "\n"
16330 "out gl_PerVertex { vec4 gl_Position; };\n"
16331 "void main() { gl_Position = vec4(0); }\n";
16332 char const *fsSource =
16333 "#version 450\n"
16334 "\n"
16335 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
16336 "layout(location=0) out vec4 color;\n"
16337 "void main() {\n"
16338 " color = texelFetch(s, ivec2(0), 0);\n"
16339 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120016340 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16341 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16342
16343 VkPipelineObj pipe(m_device);
16344 pipe.AddShader(&vs);
16345 pipe.AddShader(&fs);
16346 pipe.AddColorAttachment();
16347
16348 VkTextureObj texture(m_device, nullptr);
16349 VkSamplerObj sampler(m_device);
16350
16351 VkDescriptorSetObj descriptorSet(m_device);
16352 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16353 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16354
16355 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16356 ASSERT_VK_SUCCESS(err);
16357
Tony Barbour552f6c02016-12-21 14:34:07 -070016358 m_commandBuffer->BeginCommandBuffer();
16359 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120016360
16361 m_commandBuffer->BindPipeline(pipe);
16362 m_commandBuffer->BindDescriptorSet(descriptorSet);
16363
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016364 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016365 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016366 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016367 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16368
16369 // error produced here.
16370 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16371
16372 m_errorMonitor->VerifyFound();
16373
Tony Barbour552f6c02016-12-21 14:34:07 -070016374 m_commandBuffer->EndRenderPass();
16375 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120016376}
16377
Mark Youngc48c4c12016-04-11 14:26:49 -060016378TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016380
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016381 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16382 {
16383 VkFormatProperties properties;
16384 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16385 if (properties.optimalTilingFeatures == 0) {
16386 printf(" Image format not supported; skipped.\n");
16387 return;
16388 }
16389 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016390
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016391 VkImageCreateInfo info = {};
16392 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16393 info.pNext = NULL;
16394 info.imageType = VK_IMAGE_TYPE_2D;
16395 info.format = format;
16396 info.extent.height = 32;
16397 info.extent.depth = 1;
16398 info.mipLevels = 1;
16399 info.arrayLayers = 1;
16400 info.samples = VK_SAMPLE_COUNT_1_BIT;
16401 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16402 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16403 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016404
16405 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016406 {
16407 VkImageFormatProperties properties;
16408 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
16409 info.tiling, info.usage, info.flags, &properties);
16410 ASSERT_VK_SUCCESS(result);
16411 info.extent.width = properties.maxExtent.width + 1;
16412 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016413
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016414 VkImage image;
16415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
16416 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016417 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016418}
16419
Mark Youngc48c4c12016-04-11 14:26:49 -060016420TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016421 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060016422
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016423 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16424 {
16425 VkFormatProperties properties;
16426 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16427 if (properties.optimalTilingFeatures == 0) {
16428 printf(" Image format not supported; skipped.\n");
16429 return;
16430 }
16431 }
Mark Youngc48c4c12016-04-11 14:26:49 -060016432
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016433 VkImageCreateInfo info = {};
16434 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16435 info.pNext = NULL;
16436 info.imageType = VK_IMAGE_TYPE_2D;
16437 info.format = format;
16438 info.extent.height = 32;
16439 info.extent.depth = 1;
16440 info.mipLevels = 1;
16441 info.arrayLayers = 1;
16442 info.samples = VK_SAMPLE_COUNT_1_BIT;
16443 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16444 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16445 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016446
16447 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016448 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016449
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016450 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060016451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016452 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
16453 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060016454 m_errorMonitor->VerifyFound();
16455}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070016456
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016457TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016458 TEST_DESCRIPTION(
16459 "Create a render pass with an attachment description "
16460 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016461
Tony Barbour1fa09702017-03-16 12:09:08 -060016462 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016463 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16464
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070016465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016466
16467 VkAttachmentReference color_attach = {};
16468 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
16469 color_attach.attachment = 0;
16470 VkSubpassDescription subpass = {};
16471 subpass.colorAttachmentCount = 1;
16472 subpass.pColorAttachments = &color_attach;
16473
16474 VkRenderPassCreateInfo rpci = {};
16475 rpci.subpassCount = 1;
16476 rpci.pSubpasses = &subpass;
16477 rpci.attachmentCount = 1;
16478 VkAttachmentDescription attach_desc = {};
16479 attach_desc.format = VK_FORMAT_UNDEFINED;
16480 rpci.pAttachments = &attach_desc;
16481 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
16482 VkRenderPass rp;
16483 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
16484
16485 m_errorMonitor->VerifyFound();
16486
16487 if (result == VK_SUCCESS) {
16488 vkDestroyRenderPass(m_device->device(), rp, NULL);
16489 }
16490}
16491
Karl Schultz6addd812016-02-02 17:17:23 -070016492TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016493 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060016494
Mike Stroyana3082432015-09-25 13:39:21 -060016495 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070016496 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16497 const int32_t tex_width = 32;
16498 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060016499
16500 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016501 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16502 image_create_info.pNext = NULL;
16503 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16504 image_create_info.format = tex_format;
16505 image_create_info.extent.width = tex_width;
16506 image_create_info.extent.height = tex_height;
16507 image_create_info.extent.depth = 1;
16508 image_create_info.mipLevels = 1;
16509 image_create_info.arrayLayers = 1;
16510 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16511 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16512 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16513 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060016514
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016515 VkImage image;
16516 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060016517 ASSERT_VK_SUCCESS(err);
16518
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016519 VkMemoryRequirements requirements;
16520 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
16521
16522 VkMemoryAllocateInfo alloc_info{};
16523 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16524 alloc_info.pNext = NULL;
16525 alloc_info.memoryTypeIndex = 0;
16526 alloc_info.allocationSize = requirements.size;
16527 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16528 ASSERT_TRUE(pass);
16529
16530 VkDeviceMemory memory;
16531 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16532 ASSERT_VK_SUCCESS(err);
16533
16534 err = vkBindImageMemory(m_device->device(), image, memory, 0);
16535
Tobin Ehliscde08892015-09-22 10:11:37 -060016536 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016537 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070016538 image_view_create_info.image = image;
16539 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16540 image_view_create_info.format = tex_format;
16541 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016542 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070016543 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016544 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060016545
16546 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016548 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016549 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016550
16551 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060016552 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060016553}
Mike Stroyana3082432015-09-25 13:39:21 -060016554
Mark Youngd339ba32016-05-30 13:28:35 -060016555TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
16556 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060016557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060016558 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060016559
Tony Barbour1fa09702017-03-16 12:09:08 -060016560 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060016561
16562 // Create an image and try to create a view with no memory backing the image
16563 VkImage image;
16564
16565 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16566 const int32_t tex_width = 32;
16567 const int32_t tex_height = 32;
16568
16569 VkImageCreateInfo image_create_info = {};
16570 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16571 image_create_info.pNext = NULL;
16572 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16573 image_create_info.format = tex_format;
16574 image_create_info.extent.width = tex_width;
16575 image_create_info.extent.height = tex_height;
16576 image_create_info.extent.depth = 1;
16577 image_create_info.mipLevels = 1;
16578 image_create_info.arrayLayers = 1;
16579 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16580 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16581 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16582 image_create_info.flags = 0;
16583
16584 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16585 ASSERT_VK_SUCCESS(err);
16586
16587 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016588 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060016589 image_view_create_info.image = image;
16590 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16591 image_view_create_info.format = tex_format;
16592 image_view_create_info.subresourceRange.layerCount = 1;
16593 image_view_create_info.subresourceRange.baseMipLevel = 0;
16594 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016595 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060016596
16597 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016598 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060016599
16600 m_errorMonitor->VerifyFound();
16601 vkDestroyImage(m_device->device(), image, NULL);
16602 // If last error is success, it still created the view, so delete it.
16603 if (err == VK_SUCCESS) {
16604 vkDestroyImageView(m_device->device(), view, NULL);
16605 }
Mark Youngd339ba32016-05-30 13:28:35 -060016606}
16607
Karl Schultz6addd812016-02-02 17:17:23 -070016608TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016609 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016611
Tony Barbour1fa09702017-03-16 12:09:08 -060016612 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016613
Karl Schultz6addd812016-02-02 17:17:23 -070016614 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016615 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016616 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016617 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016618
16619 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016620 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016621 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070016622 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16623 image_view_create_info.format = tex_format;
16624 image_view_create_info.subresourceRange.baseMipLevel = 0;
16625 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016626 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016627 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016628 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016629
16630 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016631 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016632
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016633 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016634}
16635
Mike Weiblena1e13f42017-02-09 21:25:59 -070016636TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
16637 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
16638
Tony Barbour1fa09702017-03-16 12:09:08 -060016639 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070016640 VkSubresourceLayout subres_layout = {};
16641
16642 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
16643 {
16644 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
16645 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016646 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016647 ASSERT_TRUE(img.initialized());
16648
16649 VkImageSubresource subres = {};
16650 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16651 subres.mipLevel = 0;
16652 subres.arrayLayer = 0;
16653
16654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
16655 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16656 m_errorMonitor->VerifyFound();
16657 }
16658
16659 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
16660 {
16661 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016662 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016663 ASSERT_TRUE(img.initialized());
16664
16665 VkImageSubresource subres = {};
16666 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16667 subres.mipLevel = 0;
16668 subres.arrayLayer = 0;
16669
16670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16672 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16673 m_errorMonitor->VerifyFound();
16674 }
16675
16676 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16677 {
16678 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016679 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016680 ASSERT_TRUE(img.initialized());
16681
16682 VkImageSubresource subres = {};
16683 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16684 subres.mipLevel = 1; // ERROR: triggers VU 00739
16685 subres.arrayLayer = 0;
16686
16687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16688 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16689 m_errorMonitor->VerifyFound();
16690 }
16691
16692 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16693 {
16694 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016695 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016696 ASSERT_TRUE(img.initialized());
16697
16698 VkImageSubresource subres = {};
16699 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16700 subres.mipLevel = 0;
16701 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16702
16703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16704 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16705 m_errorMonitor->VerifyFound();
16706 }
16707}
16708
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016709TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016710 VkResult err;
16711 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016712
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016714
Tony Barbour1fa09702017-03-16 12:09:08 -060016715 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016716
16717 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016718 VkImage srcImage;
16719 VkImage dstImage;
16720 VkDeviceMemory srcMem;
16721 VkDeviceMemory destMem;
16722 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016723
16724 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016725 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16726 image_create_info.pNext = NULL;
16727 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16728 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16729 image_create_info.extent.width = 32;
16730 image_create_info.extent.height = 32;
16731 image_create_info.extent.depth = 1;
16732 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016733 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016734 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16735 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16736 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16737 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016738
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016739 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016740 ASSERT_VK_SUCCESS(err);
16741
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016742 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016743 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016744 ASSERT_VK_SUCCESS(err);
16745
16746 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016747 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016748 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16749 memAlloc.pNext = NULL;
16750 memAlloc.allocationSize = 0;
16751 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016752
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016753 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016754 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016755 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016756 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016757 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016758 ASSERT_VK_SUCCESS(err);
16759
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016760 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016761 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016762 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016763 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016764 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016765 ASSERT_VK_SUCCESS(err);
16766
16767 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16768 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016769 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016770 ASSERT_VK_SUCCESS(err);
16771
Tony Barbour552f6c02016-12-21 14:34:07 -070016772 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016773 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016774 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016775 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016776 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016777 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016778 copyRegion.srcOffset.x = 0;
16779 copyRegion.srcOffset.y = 0;
16780 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016781 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016782 copyRegion.dstSubresource.mipLevel = 0;
16783 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016784 // Introduce failure by forcing the dst layerCount to differ from src
16785 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016786 copyRegion.dstOffset.x = 0;
16787 copyRegion.dstOffset.y = 0;
16788 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016789 copyRegion.extent.width = 1;
16790 copyRegion.extent.height = 1;
16791 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016792 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016793 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016794
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016795 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016796
Chia-I Wuf7458c52015-10-26 21:10:41 +080016797 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016798 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016799 vkFreeMemory(m_device->device(), srcMem, NULL);
16800 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016801}
16802
Tony Barbourd6673642016-05-05 14:46:39 -060016803TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016804 TEST_DESCRIPTION("Creating images with unsuported formats ");
16805
Tony Barbour1fa09702017-03-16 12:09:08 -060016806 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016808
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016809 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016810 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016811 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016812 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16813 image_create_info.format = VK_FORMAT_UNDEFINED;
16814 image_create_info.extent.width = 32;
16815 image_create_info.extent.height = 32;
16816 image_create_info.extent.depth = 1;
16817 image_create_info.mipLevels = 1;
16818 image_create_info.arrayLayers = 1;
16819 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16820 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16821 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016822
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16824 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016825
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016826 VkImage image;
16827 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016828 m_errorMonitor->VerifyFound();
16829
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016830 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016831 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016832 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16833 VkFormat format = static_cast<VkFormat>(f);
16834 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016835 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016836 unsupported = format;
16837 break;
16838 }
16839 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016840
Tony Barbourd6673642016-05-05 14:46:39 -060016841 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016842 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016844
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016845 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016846 m_errorMonitor->VerifyFound();
16847 }
16848}
16849
16850TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016851 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16852
Tony Barbour1fa09702017-03-16 12:09:08 -060016853 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016854 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016855 if (!depth_format) {
16856 return;
16857 }
Tony Barbourd6673642016-05-05 14:46:39 -060016858
16859 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016860 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 -060016861 VK_IMAGE_TILING_OPTIMAL, 0);
16862 ASSERT_TRUE(image.initialized());
16863
16864 VkImageView imgView;
16865 VkImageViewCreateInfo imgViewInfo = {};
16866 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16867 imgViewInfo.image = image.handle();
16868 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16869 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16870 imgViewInfo.subresourceRange.layerCount = 1;
16871 imgViewInfo.subresourceRange.baseMipLevel = 0;
16872 imgViewInfo.subresourceRange.levelCount = 1;
16873 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16874
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016875 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016876 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016878 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16879 m_errorMonitor->VerifyFound();
16880 imgViewInfo.subresourceRange.baseMipLevel = 0;
16881
Tony Barbourd6673642016-05-05 14:46:39 -060016882 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16883 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016885 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16886 m_errorMonitor->VerifyFound();
16887 imgViewInfo.subresourceRange.levelCount = 1;
16888
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016889 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16890 imgViewInfo.subresourceRange.levelCount = 2;
16891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16892 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16893 m_errorMonitor->VerifyFound();
16894 imgViewInfo.subresourceRange.levelCount = 1;
16895
16896 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16897 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16899 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16900 m_errorMonitor->VerifyFound();
16901 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16902
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016903 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16904 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016905 m_errorMonitor->SetDesiredFailureMsg(
16906 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16907 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016908 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16909 m_errorMonitor->VerifyFound();
16910 imgViewInfo.subresourceRange.layerCount = 1;
16911
Tony Barbourd6673642016-05-05 14:46:39 -060016912 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016913 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016914 m_errorMonitor->SetDesiredFailureMsg(
16915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16916 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016917 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16918 m_errorMonitor->VerifyFound();
16919 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16920
Tony Barbourd6673642016-05-05 14:46:39 -060016921 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16922 // VIEW_CREATE_ERROR
16923 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016925 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16926 m_errorMonitor->VerifyFound();
16927 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16928
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016929 // TODO: Update framework to easily passing mutable flag into ImageObj init
16930 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016931 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16932 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16933 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016934 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16935 // VIEW_CREATE_ERROR
16936 VkImageCreateInfo mutImgInfo = image.create_info();
16937 VkImage mutImage;
16938 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016939 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016940 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16941 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016942 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016943 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016944
16945 VkMemoryRequirements requirements;
16946 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16947
16948 VkMemoryAllocateInfo alloc_info{};
16949 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16950 alloc_info.pNext = NULL;
16951 alloc_info.memoryTypeIndex = 0;
16952 alloc_info.allocationSize = requirements.size;
16953 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16954 ASSERT_TRUE(pass);
16955
16956 VkDeviceMemory memory;
16957 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16958 ASSERT_VK_SUCCESS(ret);
16959
16960 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16961 ASSERT_VK_SUCCESS(ret);
16962
Tony Barbourd6673642016-05-05 14:46:39 -060016963 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016965 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16966 m_errorMonitor->VerifyFound();
16967 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016968
16969 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016970 vkDestroyImage(m_device->handle(), mutImage, NULL);
16971}
16972
Dave Houlton75967fc2017-03-06 17:21:16 -070016973TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16974 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16975
Tony Barbour1fa09702017-03-16 12:09:08 -060016976 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016977
Jamie Madill35127872017-03-15 16:17:46 -040016978 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016979 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16980 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16981 if (device_features.textureCompressionBC) {
16982 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16983 } else if (device_features.textureCompressionETC2) {
16984 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16985 } else if (device_features.textureCompressionASTC_LDR) {
16986 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16987 } else {
16988 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16989 return;
16990 }
16991
16992 VkImageCreateInfo ci;
16993 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16994 ci.pNext = NULL;
16995 ci.flags = 0;
16996 ci.imageType = VK_IMAGE_TYPE_2D;
16997 ci.format = compressed_format;
16998 ci.extent = {32, 32, 1};
16999 ci.mipLevels = 6;
17000 ci.arrayLayers = 1;
17001 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17002 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17003 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17004 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17005 ci.queueFamilyIndexCount = 0;
17006 ci.pQueueFamilyIndices = NULL;
17007 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17008
17009 VkImageObj image(m_device);
17010 image.init(&ci);
17011 ASSERT_TRUE(image.initialized());
17012
17013 VkImageObj odd_image(m_device);
17014 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
17015 odd_image.init(&ci);
17016 ASSERT_TRUE(odd_image.initialized());
17017
17018 // Allocate buffers
17019 VkMemoryPropertyFlags reqs = 0;
17020 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
17021 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
17022 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
17023 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
17024 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
17025
17026 VkBufferImageCopy region = {};
17027 region.bufferRowLength = 0;
17028 region.bufferImageHeight = 0;
17029 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17030 region.imageSubresource.layerCount = 1;
17031 region.imageOffset = {0, 0, 0};
17032 region.bufferOffset = 0;
17033
17034 // start recording
17035 m_commandBuffer->BeginCommandBuffer();
17036
17037 // Mip level copies that work - 5 levels
17038 m_errorMonitor->ExpectSuccess();
17039
17040 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
17041 region.imageExtent = {32, 32, 1};
17042 region.imageSubresource.mipLevel = 0;
17043 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
17044 &region);
17045 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17046 &region);
17047
17048 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
17049 region.imageExtent = {8, 8, 1};
17050 region.imageSubresource.mipLevel = 2;
17051 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
17052 &region);
17053 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17054 &region);
17055
17056 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
17057 region.imageExtent = {4, 4, 1};
17058 region.imageSubresource.mipLevel = 3;
17059 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17060 &region);
17061 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17062 &region);
17063
17064 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
17065 region.imageExtent = {2, 2, 1};
17066 region.imageSubresource.mipLevel = 4;
17067 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17068 &region);
17069 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17070 &region);
17071
17072 region.imageExtent = {1, 1, 1};
17073 region.imageSubresource.mipLevel = 5;
17074 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17075 &region);
17076 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17077 &region);
17078 m_errorMonitor->VerifyNotFound();
17079
17080 // Buffer must accomodate a full compressed block, regardless of texel count
17081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17082 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
17083 &region);
17084 m_errorMonitor->VerifyFound();
17085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
17086 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17087 &region);
17088 m_errorMonitor->VerifyFound();
17089
17090 // Copy width < compressed block size, but not the full mip width
17091 region.imageExtent = {1, 2, 1};
17092 region.imageSubresource.mipLevel = 4;
17093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17094 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17095 &region);
17096 m_errorMonitor->VerifyFound();
17097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17098 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17099 &region);
17100 m_errorMonitor->VerifyFound();
17101
17102 // Copy height < compressed block size but not the full mip height
17103 region.imageExtent = {2, 1, 1};
17104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17105 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17106 &region);
17107 m_errorMonitor->VerifyFound();
17108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17109 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17110 &region);
17111 m_errorMonitor->VerifyFound();
17112
17113 // Offsets must be multiple of compressed block size
17114 region.imageOffset = {1, 1, 0};
17115 region.imageExtent = {1, 1, 1};
17116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17117 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17118 &region);
17119 m_errorMonitor->VerifyFound();
17120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17121 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17122 &region);
17123 m_errorMonitor->VerifyFound();
17124
17125 // Offset + extent width = mip width - should succeed
17126 region.imageOffset = {4, 4, 0};
17127 region.imageExtent = {3, 4, 1};
17128 region.imageSubresource.mipLevel = 2;
17129 m_errorMonitor->ExpectSuccess();
17130 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17131 &region);
17132 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17133 &region);
17134 m_errorMonitor->VerifyNotFound();
17135
17136 // Offset + extent width > mip width, but still within the final compressed block - should succeed
17137 region.imageExtent = {4, 4, 1};
17138 m_errorMonitor->ExpectSuccess();
17139 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17140 &region);
17141 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17142 &region);
17143 m_errorMonitor->VerifyNotFound();
17144
17145 // Offset + extent width < mip width and not a multiple of block width - should fail
17146 region.imageExtent = {3, 3, 1};
17147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17148 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17149 &region);
17150 m_errorMonitor->VerifyFound();
17151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17152 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17153 &region);
17154 m_errorMonitor->VerifyFound();
17155}
17156
Dave Houlton59a20702017-02-02 17:26:23 -070017157TEST_F(VkLayerTest, ImageBufferCopyTests) {
17158 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
17159
Tony Barbour1fa09702017-03-16 12:09:08 -060017160 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017161 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
17162 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
17163 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
17164 return;
17165 }
Dave Houlton584d51e2017-02-16 12:52:54 -070017166
17167 // Bail if any dimension of transfer granularity is 0.
17168 auto index = m_device->graphics_queue_node_index_;
17169 auto queue_family_properties = m_device->phy().queue_properties();
17170 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
17171 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
17172 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
17173 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
17174 return;
17175 }
17176
Dave Houlton59a20702017-02-02 17:26:23 -070017177 VkImageObj image_64k(m_device); // 128^2 texels, 64k
17178 VkImageObj image_16k(m_device); // 64^2 texels, 16k
17179 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070017180 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
17181 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
17182 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
17183 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
17184
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017185 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017186 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17187 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017188 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017189 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17190 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017191 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 -070017192 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070017193 ASSERT_TRUE(image_64k.initialized());
17194 ASSERT_TRUE(image_16k.initialized());
17195 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017196
Dave Houltonf3229d52017-02-21 15:59:08 -070017197 // Verify all needed Depth/Stencil formats are supported
17198 bool missing_ds_support = false;
17199 VkFormatProperties props = {0, 0, 0};
17200 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
17201 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17202 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
17203 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17204 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
17205 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17206 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
17207 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17208
17209 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017210 ds_image_4D_1S.Init(
17211 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017212 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17213 VK_IMAGE_TILING_OPTIMAL, 0);
17214 ASSERT_TRUE(ds_image_4D_1S.initialized());
17215
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017216 ds_image_3D_1S.Init(
17217 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017218 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17219 VK_IMAGE_TILING_OPTIMAL, 0);
17220 ASSERT_TRUE(ds_image_3D_1S.initialized());
17221
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017222 ds_image_2D.Init(
17223 256, 256, 1, VK_FORMAT_D16_UNORM,
17224 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17225 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017226 ASSERT_TRUE(ds_image_2D.initialized());
17227
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017228 ds_image_1S.Init(
17229 256, 256, 1, VK_FORMAT_S8_UINT,
17230 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17231 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017232 ASSERT_TRUE(ds_image_1S.initialized());
17233 }
17234
17235 // Allocate buffers
17236 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070017237 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070017238 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
17239 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
17240 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
17241 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070017242
17243 VkBufferImageCopy region = {};
17244 region.bufferRowLength = 0;
17245 region.bufferImageHeight = 0;
17246 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17247 region.imageSubresource.layerCount = 1;
17248 region.imageOffset = {0, 0, 0};
17249 region.imageExtent = {64, 64, 1};
17250 region.bufferOffset = 0;
17251
17252 // attempt copies before putting command buffer in recording state
17253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
17254 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.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_01258);
17259 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17260 &region);
17261 m_errorMonitor->VerifyFound();
17262
17263 // start recording
17264 m_commandBuffer->BeginCommandBuffer();
17265
17266 // successful copies
17267 m_errorMonitor->ExpectSuccess();
17268 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17269 &region);
17270 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17271 &region);
17272 region.imageOffset.x = 16; // 16k copy, offset requires larger image
17273 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17274 &region);
17275 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
17276 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17277 &region);
17278 region.imageOffset.x = 0;
17279 region.imageExtent.height = 64;
17280 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
17281 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17282 &region);
17283 m_errorMonitor->VerifyNotFound();
17284
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017285 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070017286 region.imageExtent = {65, 64, 1};
17287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17288 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17289 &region);
17290 m_errorMonitor->VerifyFound();
17291
17292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17293 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17294 &region);
17295 m_errorMonitor->VerifyFound();
17296
17297 // image/buffer too small (offset) on copy to image
17298 region.imageExtent = {64, 64, 1};
17299 region.imageOffset = {0, 4, 0};
17300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17301 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17302 &region);
17303 m_errorMonitor->VerifyFound();
17304
17305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17306 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17307 &region);
17308 m_errorMonitor->VerifyFound();
17309
17310 // image/buffer too small on copy to buffer
17311 region.imageExtent = {64, 64, 1};
17312 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070017313 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
17315 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17316 &region);
17317 m_errorMonitor->VerifyFound();
17318
17319 region.imageExtent = {64, 65, 1};
17320 region.bufferOffset = 0;
17321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
17322 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17323 &region);
17324 m_errorMonitor->VerifyFound();
17325
17326 // buffer size ok but rowlength causes loose packing
17327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17328 region.imageExtent = {64, 64, 1};
17329 region.bufferRowLength = 68;
17330 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17331 &region);
17332 m_errorMonitor->VerifyFound();
17333
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017334 // An extent with zero area should produce a warning, but no error
17335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
17336 region.imageExtent.width = 0;
17337 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17338 &region);
17339 m_errorMonitor->VerifyFound();
17340
Dave Houlton59a20702017-02-02 17:26:23 -070017341 // aspect bits
17342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
17343 region.imageExtent = {64, 64, 1};
17344 region.bufferRowLength = 0;
17345 region.bufferImageHeight = 0;
17346 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17347 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17348 buffer_16k.handle(), 1, &region);
17349 m_errorMonitor->VerifyFound();
17350
17351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
17352 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17353 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17354 &region);
17355 m_errorMonitor->VerifyFound();
17356
17357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
17358 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17359 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17360 buffer_16k.handle(), 1, &region);
17361 m_errorMonitor->VerifyFound();
17362
Dave Houltonf3229d52017-02-21 15:59:08 -070017363 // Test Depth/Stencil copies
17364 if (missing_ds_support) {
17365 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
17366 } else {
17367 VkBufferImageCopy ds_region = {};
17368 ds_region.bufferOffset = 0;
17369 ds_region.bufferRowLength = 0;
17370 ds_region.bufferImageHeight = 0;
17371 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17372 ds_region.imageSubresource.mipLevel = 0;
17373 ds_region.imageSubresource.baseArrayLayer = 0;
17374 ds_region.imageSubresource.layerCount = 1;
17375 ds_region.imageOffset = {0, 0, 0};
17376 ds_region.imageExtent = {256, 256, 1};
17377
17378 // Depth copies that should succeed
17379 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
17380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17381 buffer_256k.handle(), 1, &ds_region);
17382 m_errorMonitor->VerifyNotFound();
17383
17384 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
17385 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17386 buffer_256k.handle(), 1, &ds_region);
17387 m_errorMonitor->VerifyNotFound();
17388
17389 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
17390 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17391 buffer_128k.handle(), 1, &ds_region);
17392 m_errorMonitor->VerifyNotFound();
17393
17394 // Depth copies that should fail
17395 ds_region.bufferOffset = 4;
17396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17397 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
17398 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17399 buffer_256k.handle(), 1, &ds_region);
17400 m_errorMonitor->VerifyFound();
17401
17402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17403 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
17404 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17405 buffer_256k.handle(), 1, &ds_region);
17406 m_errorMonitor->VerifyFound();
17407
17408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17409 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
17410 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17411 buffer_128k.handle(), 1, &ds_region);
17412 m_errorMonitor->VerifyFound();
17413
17414 // Stencil copies that should succeed
17415 ds_region.bufferOffset = 0;
17416 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17417 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17418 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17419 buffer_64k.handle(), 1, &ds_region);
17420 m_errorMonitor->VerifyNotFound();
17421
17422 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17423 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17424 buffer_64k.handle(), 1, &ds_region);
17425 m_errorMonitor->VerifyNotFound();
17426
17427 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
17428 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17429 buffer_64k.handle(), 1, &ds_region);
17430 m_errorMonitor->VerifyNotFound();
17431
17432 // Stencil copies that should fail
17433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17434 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17435 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17436 buffer_16k.handle(), 1, &ds_region);
17437 m_errorMonitor->VerifyFound();
17438
17439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17440 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17441 ds_region.bufferRowLength = 260;
17442 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17443 buffer_64k.handle(), 1, &ds_region);
17444 m_errorMonitor->VerifyFound();
17445
17446 ds_region.bufferRowLength = 0;
17447 ds_region.bufferOffset = 4;
17448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17449 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
17450 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17451 buffer_64k.handle(), 1, &ds_region);
17452 m_errorMonitor->VerifyFound();
17453 }
17454
Dave Houlton584d51e2017-02-16 12:52:54 -070017455 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040017456 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070017457 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070017458 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
17459 device_features.textureCompressionASTC_LDR)) {
17460 printf(" No compressed formats supported - block compression tests skipped.\n");
17461 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070017462 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
17463 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070017464 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017465 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
17466 0);
17467 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 -070017468 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017469 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017470 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 -070017471 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017472 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 -070017473 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017474 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017475 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 -070017476 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017477 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 -070017478 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017479 }
17480 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017481
Dave Houlton584d51e2017-02-16 12:52:54 -070017482 // Just fits
17483 m_errorMonitor->ExpectSuccess();
17484 region.imageExtent = {128, 128, 1};
17485 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17486 buffer_16k.handle(), 1, &region);
17487 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017488
Dave Houlton584d51e2017-02-16 12:52:54 -070017489 // with offset, too big for buffer
17490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17491 region.bufferOffset = 16;
17492 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17493 buffer_16k.handle(), 1, &region);
17494 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017495 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017496
Dave Houlton67e9b532017-03-02 17:00:10 -070017497 // extents that are not a multiple of compressed block size
17498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17499 region.imageExtent.width = 66;
17500 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17501 buffer_16k.handle(), 1, &region);
17502 m_errorMonitor->VerifyFound();
17503 region.imageExtent.width = 128;
17504
17505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017506 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070017507 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17508 buffer_16k.handle(), 1, &region);
17509 m_errorMonitor->VerifyFound();
17510 region.imageExtent.height = 128;
17511
17512 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
17513
17514 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
17515 m_errorMonitor->ExpectSuccess();
17516 region.imageExtent.width = 66;
17517 region.imageOffset.x = 64;
17518 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17519 buffer_16k.handle(), 1, &region);
17520 region.imageExtent.width = 16;
17521 region.imageOffset.x = 0;
17522 region.imageExtent.height = 2;
17523 region.imageOffset.y = 128;
17524 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017525 buffer_16k.handle(), 1, &region);
17526 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017527 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017528
Dave Houlton584d51e2017-02-16 12:52:54 -070017529 // buffer offset must be a multiple of texel block size (16)
17530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
17531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
17532 region.imageExtent = {64, 64, 1};
17533 region.bufferOffset = 24;
17534 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17535 buffer_16k.handle(), 1, &region);
17536 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017537
Dave Houlton584d51e2017-02-16 12:52:54 -070017538 // rowlength not a multiple of block width (4)
17539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
17540 region.bufferOffset = 0;
17541 region.bufferRowLength = 130;
17542 region.bufferImageHeight = 0;
17543 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17544 buffer_64k.handle(), 1, &region);
17545 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017546
Dave Houlton584d51e2017-02-16 12:52:54 -070017547 // imageheight not a multiple of block height (4)
17548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
17549 region.bufferRowLength = 0;
17550 region.bufferImageHeight = 130;
17551 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17552 buffer_64k.handle(), 1, &region);
17553 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070017554 }
Dave Houlton59a20702017-02-02 17:26:23 -070017555}
17556
Tony Barbourd6673642016-05-05 14:46:39 -060017557TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070017558 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060017559
Tony Barbour1fa09702017-03-16 12:09:08 -060017560 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060017561
Rene Lindsay135204f2016-12-22 17:11:09 -070017562 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060017563 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017564 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 -070017565 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060017566 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060017567 vk_testing::Buffer buffer;
17568 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070017569 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060017570 VkBufferImageCopy region = {};
17571 region.bufferRowLength = 128;
17572 region.bufferImageHeight = 128;
17573 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17574 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070017575 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017576 region.imageExtent.height = 4;
17577 region.imageExtent.width = 4;
17578 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070017579
17580 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017581 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 -070017582 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070017583 ASSERT_TRUE(image2.initialized());
17584 vk_testing::Buffer buffer2;
17585 VkMemoryPropertyFlags reqs2 = 0;
17586 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
17587 VkBufferImageCopy region2 = {};
17588 region2.bufferRowLength = 128;
17589 region2.bufferImageHeight = 128;
17590 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17591 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
17592 region2.imageSubresource.layerCount = 1;
17593 region2.imageExtent.height = 4;
17594 region2.imageExtent.width = 4;
17595 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017596 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060017597
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017598 // Image must have offset.z of 0 and extent.depth of 1
17599 // Introduce failure by setting imageExtent.depth to 0
17600 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017602 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017603 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017604 m_errorMonitor->VerifyFound();
17605
17606 region.imageExtent.depth = 1;
17607
17608 // Image must have offset.z of 0 and extent.depth of 1
17609 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017610 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017611 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017614 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017615 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017616 m_errorMonitor->VerifyFound();
17617
17618 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017619 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
17620 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070017621 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017623 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17624 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017625 m_errorMonitor->VerifyFound();
17626
17627 // BufferOffset must be a multiple of 4
17628 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070017629 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070017631 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
17632 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017633 m_errorMonitor->VerifyFound();
17634
17635 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
17636 region.bufferOffset = 0;
17637 region.imageExtent.height = 128;
17638 region.imageExtent.width = 128;
17639 // Introduce failure by setting bufferRowLength > 0 but less than width
17640 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017642 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17643 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017644 m_errorMonitor->VerifyFound();
17645
17646 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
17647 region.bufferRowLength = 128;
17648 // Introduce failure by setting bufferRowHeight > 0 but less than height
17649 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017651 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17652 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017653 m_errorMonitor->VerifyFound();
17654
17655 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060017656 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017657 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 -070017658 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017659 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017660 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 -070017661 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017662 VkImageBlit blitRegion = {};
17663 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17664 blitRegion.srcSubresource.baseArrayLayer = 0;
17665 blitRegion.srcSubresource.layerCount = 1;
17666 blitRegion.srcSubresource.mipLevel = 0;
17667 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17668 blitRegion.dstSubresource.baseArrayLayer = 0;
17669 blitRegion.dstSubresource.layerCount = 1;
17670 blitRegion.dstSubresource.mipLevel = 0;
17671
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017672 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17674 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17676 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017677 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17678 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017679 m_errorMonitor->VerifyFound();
17680
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017682 VkImageMemoryBarrier img_barrier;
17683 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17684 img_barrier.pNext = NULL;
17685 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17686 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17687 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17688 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17689 img_barrier.image = image.handle();
17690 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17691 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17692 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17693 img_barrier.subresourceRange.baseArrayLayer = 0;
17694 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017695 img_barrier.subresourceRange.layerCount = 0;
17696 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017697 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17698 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017699 m_errorMonitor->VerifyFound();
17700 img_barrier.subresourceRange.layerCount = 1;
17701}
17702
17703TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017704 TEST_DESCRIPTION("Exceed the limits of image format ");
17705
Tony Barbour1fa09702017-03-16 12:09:08 -060017706 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017707
17708 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17709 {
17710 VkFormatProperties properties;
17711 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17712 if (properties.linearTilingFeatures == 0) {
17713 printf(" Image format not supported; skipped.\n");
17714 return;
17715 }
17716 }
17717
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017719 VkImageCreateInfo image_create_info = {};
17720 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17721 image_create_info.pNext = NULL;
17722 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017723 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017724 image_create_info.extent.width = 32;
17725 image_create_info.extent.height = 32;
17726 image_create_info.extent.depth = 1;
17727 image_create_info.mipLevels = 1;
17728 image_create_info.arrayLayers = 1;
17729 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17730 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17731 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17732 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17733 image_create_info.flags = 0;
17734
17735 VkImage nullImg;
17736 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017737 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17738 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017739 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017740 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17741 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17742 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017743 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017744
Tony Barbour0907e362017-03-09 15:05:30 -070017745 uint32_t maxDim =
17746 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17747 // If max mip levels exceeds image extents, skip the max mip levels test
17748 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17750 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17751 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17752 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17753 m_errorMonitor->VerifyFound();
17754 image_create_info.mipLevels = 1;
17755 }
Tony Barbourd6673642016-05-05 14:46:39 -060017756
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017758 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17759 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17760 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17761 m_errorMonitor->VerifyFound();
17762 image_create_info.arrayLayers = 1;
17763
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017765 int samples = imgFmtProps.sampleCounts >> 1;
17766 image_create_info.samples = (VkSampleCountFlagBits)samples;
17767 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17768 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17769 m_errorMonitor->VerifyFound();
17770 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17771
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17773 "pCreateInfo->initialLayout, must be "
17774 "VK_IMAGE_LAYOUT_UNDEFINED or "
17775 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017776 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17777 // Expect INVALID_LAYOUT
17778 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17779 m_errorMonitor->VerifyFound();
17780 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17781}
17782
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017783TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017784 // Image copy with source region specified greater than src image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017785 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017786
Dave Houltonfc1a4052017-04-27 14:32:45 -060017787 // Create images with full mip chain
17788 VkImageCreateInfo ci;
17789 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17790 ci.pNext = NULL;
17791 ci.flags = 0;
17792 ci.imageType = VK_IMAGE_TYPE_3D;
17793 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17794 ci.extent = {32, 32, 8};
17795 ci.mipLevels = 6;
17796 ci.arrayLayers = 1;
17797 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17798 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17799 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17800 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17801 ci.queueFamilyIndexCount = 0;
17802 ci.pQueueFamilyIndices = NULL;
17803 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17804
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017805 VkImageObj src_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017806 src_image.init(&ci);
17807 ASSERT_TRUE(src_image.initialized());
17808
17809 // Dest image with one more mip level
17810 ci.extent = {64, 64, 16};
17811 ci.mipLevels = 7;
17812 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017813 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017814 dst_image.init(&ci);
17815 ASSERT_TRUE(dst_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017816
Tony Barbour552f6c02016-12-21 14:34:07 -070017817 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017818
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017819 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017820 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017821 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017822 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017823 copy_region.srcSubresource.mipLevel = 0;
17824 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017825 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017826 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017827 copy_region.srcSubresource.layerCount = 1;
17828 copy_region.dstSubresource.layerCount = 1;
17829 copy_region.srcOffset = {0, 0, 0};
17830 copy_region.dstOffset = {0, 0, 0};
17831
17832 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017833 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17834 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017835 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017836
Dave Houltonfc1a4052017-04-27 14:32:45 -060017837 // Source exceeded in x-dim, VU 01202
17838 copy_region.srcOffset.x = 4;
17839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175); // General "contained within" VU
17840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01202);
17841 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17842 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017843 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017844
17845 // Source exceeded in y-dim, VU 01203
17846 copy_region.srcOffset.x = 0;
17847 copy_region.extent.height = 48;
17848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01203);
17850 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17851 &copy_region);
17852 m_errorMonitor->VerifyFound();
17853
17854 // Source exceeded in z-dim, VU 01204
17855 copy_region.extent = {4, 4, 4};
17856 copy_region.srcSubresource.mipLevel = 2;
17857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01204);
17859 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17860 &copy_region);
17861 m_errorMonitor->VerifyFound();
17862
17863 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017864}
17865
17866TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017867 // Image copy with dest region specified greater than dest image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017868 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017869
Dave Houltonfc1a4052017-04-27 14:32:45 -060017870 // Create images with full mip chain
17871 VkImageCreateInfo ci;
17872 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17873 ci.pNext = NULL;
17874 ci.flags = 0;
17875 ci.imageType = VK_IMAGE_TYPE_3D;
17876 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17877 ci.extent = {32, 32, 8};
17878 ci.mipLevels = 6;
17879 ci.arrayLayers = 1;
17880 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17881 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17882 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17883 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17884 ci.queueFamilyIndexCount = 0;
17885 ci.pQueueFamilyIndices = NULL;
17886 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17887
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017888 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017889 dst_image.init(&ci);
17890 ASSERT_TRUE(dst_image.initialized());
17891
17892 // Src image with one more mip level
17893 ci.extent = {64, 64, 16};
17894 ci.mipLevels = 7;
17895 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17896 VkImageObj src_image(m_device);
17897 src_image.init(&ci);
17898 ASSERT_TRUE(src_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017899
Tony Barbour552f6c02016-12-21 14:34:07 -070017900 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017901
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017902 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017903 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017904 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017905 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017906 copy_region.srcSubresource.mipLevel = 0;
17907 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017908 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017909 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017910 copy_region.srcSubresource.layerCount = 1;
17911 copy_region.dstSubresource.layerCount = 1;
17912 copy_region.srcOffset = {0, 0, 0};
17913 copy_region.dstOffset = {0, 0, 0};
17914
17915 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017916 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17917 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017918 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017919
Dave Houltonfc1a4052017-04-27 14:32:45 -060017920 // Dest exceeded in x-dim, VU 01205
17921 copy_region.dstOffset.x = 4;
17922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176); // General "contained within" VU
17923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01205);
17924 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17925 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017926 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017927
17928 // Dest exceeded in y-dim, VU 01206
17929 copy_region.dstOffset.x = 0;
17930 copy_region.extent.height = 48;
17931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01206);
17933 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17934 &copy_region);
17935 m_errorMonitor->VerifyFound();
17936
17937 // Dest exceeded in z-dim, VU 01207
17938 copy_region.extent = {4, 4, 4};
17939 copy_region.dstSubresource.mipLevel = 2;
17940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01207);
17942 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17943 &copy_region);
17944 m_errorMonitor->VerifyFound();
17945
17946 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017947}
17948
Karl Schultz6addd812016-02-02 17:17:23 -070017949TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017950 VkResult err;
17951 bool pass;
17952
17953 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017955
Tony Barbour1fa09702017-03-16 12:09:08 -060017956 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017957
17958 // Create two images of different types and try to copy between them
17959 VkImage srcImage;
17960 VkImage dstImage;
17961 VkDeviceMemory srcMem;
17962 VkDeviceMemory destMem;
17963 VkMemoryRequirements memReqs;
17964
17965 VkImageCreateInfo image_create_info = {};
17966 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17967 image_create_info.pNext = NULL;
17968 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17969 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17970 image_create_info.extent.width = 32;
17971 image_create_info.extent.height = 32;
17972 image_create_info.extent.depth = 1;
17973 image_create_info.mipLevels = 1;
17974 image_create_info.arrayLayers = 1;
17975 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17976 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17977 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17978 image_create_info.flags = 0;
17979
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017980 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017981 ASSERT_VK_SUCCESS(err);
17982
17983 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17984 // Introduce failure by creating second image with a different-sized format.
17985 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017986 VkFormatProperties properties;
17987 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17988 if (properties.optimalTilingFeatures == 0) {
17989 printf(" Image format not supported; skipped.\n");
17990 return;
17991 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017992
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017993 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017994 ASSERT_VK_SUCCESS(err);
17995
17996 // Allocate memory
17997 VkMemoryAllocateInfo memAlloc = {};
17998 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17999 memAlloc.pNext = NULL;
18000 memAlloc.allocationSize = 0;
18001 memAlloc.memoryTypeIndex = 0;
18002
18003 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
18004 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018005 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060018006 ASSERT_TRUE(pass);
18007 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
18008 ASSERT_VK_SUCCESS(err);
18009
18010 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
18011 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018012 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060018013 ASSERT_TRUE(pass);
18014 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
18015 ASSERT_VK_SUCCESS(err);
18016
18017 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18018 ASSERT_VK_SUCCESS(err);
18019 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
18020 ASSERT_VK_SUCCESS(err);
18021
Tony Barbour552f6c02016-12-21 14:34:07 -070018022 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060018023 VkImageCopy copyRegion;
18024 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18025 copyRegion.srcSubresource.mipLevel = 0;
18026 copyRegion.srcSubresource.baseArrayLayer = 0;
18027 copyRegion.srcSubresource.layerCount = 0;
18028 copyRegion.srcOffset.x = 0;
18029 copyRegion.srcOffset.y = 0;
18030 copyRegion.srcOffset.z = 0;
18031 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18032 copyRegion.dstSubresource.mipLevel = 0;
18033 copyRegion.dstSubresource.baseArrayLayer = 0;
18034 copyRegion.dstSubresource.layerCount = 0;
18035 copyRegion.dstOffset.x = 0;
18036 copyRegion.dstOffset.y = 0;
18037 copyRegion.dstOffset.z = 0;
18038 copyRegion.extent.width = 1;
18039 copyRegion.extent.height = 1;
18040 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018041 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018042 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060018043
18044 m_errorMonitor->VerifyFound();
18045
18046 vkDestroyImage(m_device->device(), srcImage, NULL);
18047 vkDestroyImage(m_device->device(), dstImage, NULL);
18048 vkFreeMemory(m_device->device(), srcMem, NULL);
18049 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018050}
18051
Karl Schultz6addd812016-02-02 17:17:23 -070018052TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
18053 VkResult err;
18054 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018055
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018056 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18058 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018059
Tony Barbour1fa09702017-03-16 12:09:08 -060018060 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018061 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018062 if (!depth_format) {
18063 return;
18064 }
Mike Stroyana3082432015-09-25 13:39:21 -060018065
18066 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018067 VkImage srcImage;
18068 VkImage dstImage;
18069 VkDeviceMemory srcMem;
18070 VkDeviceMemory destMem;
18071 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018072
18073 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018074 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18075 image_create_info.pNext = NULL;
18076 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018077 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070018078 image_create_info.extent.width = 32;
18079 image_create_info.extent.height = 32;
18080 image_create_info.extent.depth = 1;
18081 image_create_info.mipLevels = 1;
18082 image_create_info.arrayLayers = 1;
18083 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060018084 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070018085 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18086 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018087 VkFormatProperties properties;
18088 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
18089 if (properties.optimalTilingFeatures == 0) {
18090 printf(" Image format not supported; skipped.\n");
18091 return;
18092 }
Mike Stroyana3082432015-09-25 13:39:21 -060018093
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018094 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018095 ASSERT_VK_SUCCESS(err);
18096
Karl Schultzbdb75952016-04-19 11:36:49 -060018097 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18098
Mark Lobodzinskidb117632016-03-31 10:45:56 -060018099 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070018100 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070018101 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060018102 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018103
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018104 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018105 ASSERT_VK_SUCCESS(err);
18106
18107 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018108 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018109 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18110 memAlloc.pNext = NULL;
18111 memAlloc.allocationSize = 0;
18112 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018113
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018114 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018115 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018116 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018117 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018118 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018119 ASSERT_VK_SUCCESS(err);
18120
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018121 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018122 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018123 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018124 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018125 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018126 ASSERT_VK_SUCCESS(err);
18127
18128 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18129 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018130 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018131 ASSERT_VK_SUCCESS(err);
18132
Tony Barbour552f6c02016-12-21 14:34:07 -070018133 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018134 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018135 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018136 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018137 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018138 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018139 copyRegion.srcOffset.x = 0;
18140 copyRegion.srcOffset.y = 0;
18141 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018142 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018143 copyRegion.dstSubresource.mipLevel = 0;
18144 copyRegion.dstSubresource.baseArrayLayer = 0;
18145 copyRegion.dstSubresource.layerCount = 0;
18146 copyRegion.dstOffset.x = 0;
18147 copyRegion.dstOffset.y = 0;
18148 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018149 copyRegion.extent.width = 1;
18150 copyRegion.extent.height = 1;
18151 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018152 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018153 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018154
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018155 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018156
Chia-I Wuf7458c52015-10-26 21:10:41 +080018157 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018158 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018159 vkFreeMemory(m_device->device(), srcMem, NULL);
18160 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018161}
18162
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018163TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
18164 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070018165
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018166 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070018167
18168 VkImageFormatProperties image_format_properties;
18169 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
18170 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
18171 &image_format_properties);
18172
18173 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
18174 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
18175 printf(" Image multi-sample support not found; skipped.\n");
18176 return;
18177 }
18178
18179 VkImageCreateInfo ci;
18180 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18181 ci.pNext = NULL;
18182 ci.flags = 0;
18183 ci.imageType = VK_IMAGE_TYPE_2D;
18184 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
18185 ci.extent = {128, 128, 1};
18186 ci.mipLevels = 1;
18187 ci.arrayLayers = 1;
18188 ci.samples = VK_SAMPLE_COUNT_1_BIT;
18189 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
18190 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18191 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18192 ci.queueFamilyIndexCount = 0;
18193 ci.pQueueFamilyIndices = NULL;
18194 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18195
18196 VkImageObj image1(m_device);
18197 image1.init(&ci);
18198 ASSERT_TRUE(image1.initialized());
18199
18200 ci.samples = VK_SAMPLE_COUNT_2_BIT;
18201 VkImageObj image2(m_device);
18202 image2.init(&ci);
18203 ASSERT_TRUE(image2.initialized());
18204
18205 ci.samples = VK_SAMPLE_COUNT_4_BIT;
18206 VkImageObj image4(m_device);
18207 image4.init(&ci);
18208 ASSERT_TRUE(image4.initialized());
18209
18210 m_commandBuffer->BeginCommandBuffer();
18211
18212 VkImageCopy copyRegion;
18213 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18214 copyRegion.srcSubresource.mipLevel = 0;
18215 copyRegion.srcSubresource.baseArrayLayer = 0;
18216 copyRegion.srcSubresource.layerCount = 1;
18217 copyRegion.srcOffset = {0, 0, 0};
18218 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18219 copyRegion.dstSubresource.mipLevel = 0;
18220 copyRegion.dstSubresource.baseArrayLayer = 0;
18221 copyRegion.dstSubresource.layerCount = 1;
18222 copyRegion.dstOffset = {0, 0, 0};
18223 copyRegion.extent = {128, 128, 1};
18224
18225 // Copy a single sample image to/from a multi-sample image
18226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18227 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18228 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18229 m_errorMonitor->VerifyFound();
18230
18231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18232 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
18233 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18234 m_errorMonitor->VerifyFound();
18235
18236 // Copy between multi-sample images with different sample counts
18237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18238 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18239 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18240 m_errorMonitor->VerifyFound();
18241
18242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18243 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
18244 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18245 m_errorMonitor->VerifyFound();
18246
18247 m_commandBuffer->EndCommandBuffer();
18248}
18249
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018250TEST_F(VkLayerTest, CopyImageAspectMismatch) {
18251 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018252 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018253 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060018254 if (!ds_format) {
18255 return;
18256 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018257
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018258 VkFormatProperties properties;
18259 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
18260 if (properties.optimalTilingFeatures == 0) {
18261 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
18262 return;
18263 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018264 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018265 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 -060018266 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 -060018267 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018268 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
18269 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018270 ASSERT_TRUE(color_image.initialized());
18271 ASSERT_TRUE(depth_image.initialized());
18272 ASSERT_TRUE(ds_image.initialized());
18273
18274 VkImageCopy copyRegion;
18275 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18276 copyRegion.srcSubresource.mipLevel = 0;
18277 copyRegion.srcSubresource.baseArrayLayer = 0;
18278 copyRegion.srcSubresource.layerCount = 1;
18279 copyRegion.srcOffset = {0, 0, 0};
18280 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18281 copyRegion.dstSubresource.mipLevel = 0;
18282 copyRegion.dstSubresource.baseArrayLayer = 0;
18283 copyRegion.dstSubresource.layerCount = 1;
18284 copyRegion.dstOffset = {64, 0, 0};
18285 copyRegion.extent = {64, 128, 1};
18286
18287 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060018288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18289 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
18290 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18291 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018292 m_errorMonitor->VerifyFound();
18293
18294 m_commandBuffer->BeginCommandBuffer();
18295
18296 // Src and dest aspect masks don't match
18297 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
18298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018299 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
18300 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018301 m_errorMonitor->VerifyFound();
18302 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18303
18304 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060018305 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018306 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
18307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
18308 // These aspect/format mismatches are redundant but unavoidable here
18309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018311 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18312 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018313 m_errorMonitor->VerifyFound();
18314 // Metadata aspect is illegal - VU 01222
18315 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18316 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
18318 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060018319 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18320 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018321 m_errorMonitor->VerifyFound();
18322
18323 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18324 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18325
18326 // Aspect mask doesn't match source image format - VU 01200
18327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18328 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
18329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18330 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18331 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18332 m_errorMonitor->VerifyFound();
18333
18334 // Aspect mask doesn't match dest image format - VU 01201
18335 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18336 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
18338 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
18339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18340 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18341 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18342 m_errorMonitor->VerifyFound();
18343
18344 m_commandBuffer->EndCommandBuffer();
18345}
18346
Karl Schultz6addd812016-02-02 17:17:23 -070018347TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
18348 VkResult err;
18349 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18352 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018353
Tony Barbour1fa09702017-03-16 12:09:08 -060018354 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018355
18356 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018357 VkImage srcImage;
18358 VkImage dstImage;
18359 VkDeviceMemory srcMem;
18360 VkDeviceMemory destMem;
18361 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018362
18363 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018364 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18365 image_create_info.pNext = NULL;
18366 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18367 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18368 image_create_info.extent.width = 32;
18369 image_create_info.extent.height = 1;
18370 image_create_info.extent.depth = 1;
18371 image_create_info.mipLevels = 1;
18372 image_create_info.arrayLayers = 1;
18373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18375 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18376 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018377
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018378 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018379 ASSERT_VK_SUCCESS(err);
18380
Karl Schultz6addd812016-02-02 17:17:23 -070018381 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018382
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018383 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018384 ASSERT_VK_SUCCESS(err);
18385
18386 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018387 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018388 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18389 memAlloc.pNext = NULL;
18390 memAlloc.allocationSize = 0;
18391 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018392
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018393 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018394 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018395 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018396 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018397 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018398 ASSERT_VK_SUCCESS(err);
18399
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018400 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018401 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018402 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018403 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018404 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018405 ASSERT_VK_SUCCESS(err);
18406
18407 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18408 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018409 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018410 ASSERT_VK_SUCCESS(err);
18411
Tony Barbour552f6c02016-12-21 14:34:07 -070018412 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018413 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018414 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18415 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018416 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018417 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018418 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018419 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018420 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018421 resolveRegion.srcOffset.x = 0;
18422 resolveRegion.srcOffset.y = 0;
18423 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018424 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018425 resolveRegion.dstSubresource.mipLevel = 0;
18426 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018427 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018428 resolveRegion.dstOffset.x = 0;
18429 resolveRegion.dstOffset.y = 0;
18430 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018431 resolveRegion.extent.width = 1;
18432 resolveRegion.extent.height = 1;
18433 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018434 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018435 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018436
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018437 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018438
Chia-I Wuf7458c52015-10-26 21:10:41 +080018439 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018440 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018441 vkFreeMemory(m_device->device(), srcMem, NULL);
18442 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018443}
18444
Karl Schultz6addd812016-02-02 17:17:23 -070018445TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
18446 VkResult err;
18447 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018448
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18450 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018451
Tony Barbour1fa09702017-03-16 12:09:08 -060018452 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018453
Chris Forbesa7530692016-05-08 12:35:39 +120018454 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018455 VkImage srcImage;
18456 VkImage dstImage;
18457 VkDeviceMemory srcMem;
18458 VkDeviceMemory destMem;
18459 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018460
18461 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018462 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18463 image_create_info.pNext = NULL;
18464 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18465 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18466 image_create_info.extent.width = 32;
18467 image_create_info.extent.height = 1;
18468 image_create_info.extent.depth = 1;
18469 image_create_info.mipLevels = 1;
18470 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120018471 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018472 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18473 // Note: Some implementations expect color attachment usage for any
18474 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018475 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018476 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018477
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018478 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018479 ASSERT_VK_SUCCESS(err);
18480
Karl Schultz6addd812016-02-02 17:17:23 -070018481 // Note: Some implementations expect color attachment usage for any
18482 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018483 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018484
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018485 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018486 ASSERT_VK_SUCCESS(err);
18487
18488 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018489 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018490 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18491 memAlloc.pNext = NULL;
18492 memAlloc.allocationSize = 0;
18493 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018494
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018495 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018496 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018497 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018498 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018499 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018500 ASSERT_VK_SUCCESS(err);
18501
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018502 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018503 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018504 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018505 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018506 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018507 ASSERT_VK_SUCCESS(err);
18508
18509 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18510 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018511 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018512 ASSERT_VK_SUCCESS(err);
18513
Tony Barbour552f6c02016-12-21 14:34:07 -070018514 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018515 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018516 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18517 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018518 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018519 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018520 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018521 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018522 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018523 resolveRegion.srcOffset.x = 0;
18524 resolveRegion.srcOffset.y = 0;
18525 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018526 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018527 resolveRegion.dstSubresource.mipLevel = 0;
18528 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018529 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018530 resolveRegion.dstOffset.x = 0;
18531 resolveRegion.dstOffset.y = 0;
18532 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018533 resolveRegion.extent.width = 1;
18534 resolveRegion.extent.height = 1;
18535 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018536 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018537 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018538
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018539 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018540
Chia-I Wuf7458c52015-10-26 21:10:41 +080018541 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018542 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018543 vkFreeMemory(m_device->device(), srcMem, NULL);
18544 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018545}
18546
Karl Schultz6addd812016-02-02 17:17:23 -070018547TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
18548 VkResult err;
18549 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018550
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018552 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018553
Tony Barbour1fa09702017-03-16 12:09:08 -060018554 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018555
18556 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018557 VkImage srcImage;
18558 VkImage dstImage;
18559 VkDeviceMemory srcMem;
18560 VkDeviceMemory destMem;
18561 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018562
18563 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018564 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18565 image_create_info.pNext = NULL;
18566 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18567 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18568 image_create_info.extent.width = 32;
18569 image_create_info.extent.height = 1;
18570 image_create_info.extent.depth = 1;
18571 image_create_info.mipLevels = 1;
18572 image_create_info.arrayLayers = 1;
18573 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18574 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18575 // Note: Some implementations expect color attachment usage for any
18576 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018577 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018578 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018579
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018580 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018581 ASSERT_VK_SUCCESS(err);
18582
Karl Schultz6addd812016-02-02 17:17:23 -070018583 // Set format to something other than source image
18584 image_create_info.format = VK_FORMAT_R32_SFLOAT;
18585 // Note: Some implementations expect color attachment usage for any
18586 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018587 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018588 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018589
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018590 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018591 ASSERT_VK_SUCCESS(err);
18592
18593 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018594 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018595 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18596 memAlloc.pNext = NULL;
18597 memAlloc.allocationSize = 0;
18598 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018599
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018600 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018601 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018602 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018603 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018604 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018605 ASSERT_VK_SUCCESS(err);
18606
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018607 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018608 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018609 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018610 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018611 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018612 ASSERT_VK_SUCCESS(err);
18613
18614 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18615 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018616 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018617 ASSERT_VK_SUCCESS(err);
18618
Tony Barbour552f6c02016-12-21 14:34:07 -070018619 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018620 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018621 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18622 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018623 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018624 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018625 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018626 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018627 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018628 resolveRegion.srcOffset.x = 0;
18629 resolveRegion.srcOffset.y = 0;
18630 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018631 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018632 resolveRegion.dstSubresource.mipLevel = 0;
18633 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018634 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018635 resolveRegion.dstOffset.x = 0;
18636 resolveRegion.dstOffset.y = 0;
18637 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018638 resolveRegion.extent.width = 1;
18639 resolveRegion.extent.height = 1;
18640 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018641 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018642 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018643
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018644 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018645
Chia-I Wuf7458c52015-10-26 21:10:41 +080018646 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018647 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018648 vkFreeMemory(m_device->device(), srcMem, NULL);
18649 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018650}
18651
Karl Schultz6addd812016-02-02 17:17:23 -070018652TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
18653 VkResult err;
18654 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018655
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018657 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018658
Tony Barbour1fa09702017-03-16 12:09:08 -060018659 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018660
18661 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018662 VkImage srcImage;
18663 VkImage dstImage;
18664 VkDeviceMemory srcMem;
18665 VkDeviceMemory destMem;
18666 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018667
18668 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018669 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18670 image_create_info.pNext = NULL;
18671 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18672 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18673 image_create_info.extent.width = 32;
18674 image_create_info.extent.height = 1;
18675 image_create_info.extent.depth = 1;
18676 image_create_info.mipLevels = 1;
18677 image_create_info.arrayLayers = 1;
18678 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18679 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18680 // Note: Some implementations expect color attachment usage for any
18681 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018682 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018683 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018684
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018685 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018686 ASSERT_VK_SUCCESS(err);
18687
Karl Schultz6addd812016-02-02 17:17:23 -070018688 image_create_info.imageType = VK_IMAGE_TYPE_1D;
18689 // Note: Some implementations expect color attachment usage for any
18690 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018691 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018692 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018693
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018694 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018695 ASSERT_VK_SUCCESS(err);
18696
18697 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018698 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018699 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18700 memAlloc.pNext = NULL;
18701 memAlloc.allocationSize = 0;
18702 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018703
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018704 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018705 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018706 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018707 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018708 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018709 ASSERT_VK_SUCCESS(err);
18710
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018711 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018712 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018713 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018714 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018715 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018716 ASSERT_VK_SUCCESS(err);
18717
18718 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18719 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018720 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018721 ASSERT_VK_SUCCESS(err);
18722
Tony Barbour552f6c02016-12-21 14:34:07 -070018723 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018724 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018725 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18726 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018727 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018728 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018729 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018730 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018731 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018732 resolveRegion.srcOffset.x = 0;
18733 resolveRegion.srcOffset.y = 0;
18734 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018735 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018736 resolveRegion.dstSubresource.mipLevel = 0;
18737 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018738 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018739 resolveRegion.dstOffset.x = 0;
18740 resolveRegion.dstOffset.y = 0;
18741 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018742 resolveRegion.extent.width = 1;
18743 resolveRegion.extent.height = 1;
18744 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018745 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018746 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018747
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018748 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018749
Chia-I Wuf7458c52015-10-26 21:10:41 +080018750 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018751 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018752 vkFreeMemory(m_device->device(), srcMem, NULL);
18753 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018754}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018755
Karl Schultz6addd812016-02-02 17:17:23 -070018756TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018757 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018758 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18759 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018760 // The image format check comes 2nd in validation so we trigger it first,
18761 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018762 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018763
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18765 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018766
Tony Barbour1fa09702017-03-16 12:09:08 -060018767 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018768 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018769 if (!depth_format) {
18770 return;
18771 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018772
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018773 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018774 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18775 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018776
18777 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018778 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18779 ds_pool_ci.pNext = NULL;
18780 ds_pool_ci.maxSets = 1;
18781 ds_pool_ci.poolSizeCount = 1;
18782 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018783
18784 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018785 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018786 ASSERT_VK_SUCCESS(err);
18787
18788 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018789 dsl_binding.binding = 0;
18790 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18791 dsl_binding.descriptorCount = 1;
18792 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18793 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018794
18795 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018796 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18797 ds_layout_ci.pNext = NULL;
18798 ds_layout_ci.bindingCount = 1;
18799 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018800 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018802 ASSERT_VK_SUCCESS(err);
18803
18804 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018805 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018806 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018807 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018808 alloc_info.descriptorPool = ds_pool;
18809 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018810 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018811 ASSERT_VK_SUCCESS(err);
18812
Karl Schultz6addd812016-02-02 17:17:23 -070018813 VkImage image_bad;
18814 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018815 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018816 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018817 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018818 const int32_t tex_width = 32;
18819 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018820
18821 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018822 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18823 image_create_info.pNext = NULL;
18824 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18825 image_create_info.format = tex_format_bad;
18826 image_create_info.extent.width = tex_width;
18827 image_create_info.extent.height = tex_height;
18828 image_create_info.extent.depth = 1;
18829 image_create_info.mipLevels = 1;
18830 image_create_info.arrayLayers = 1;
18831 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18832 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018833 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018834 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018835
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018836 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018837 ASSERT_VK_SUCCESS(err);
18838 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018839 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18840 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018841 ASSERT_VK_SUCCESS(err);
18842
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018843 // ---Bind image memory---
18844 VkMemoryRequirements img_mem_reqs;
18845 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18846 VkMemoryAllocateInfo image_alloc_info = {};
18847 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18848 image_alloc_info.pNext = NULL;
18849 image_alloc_info.memoryTypeIndex = 0;
18850 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018851 bool pass =
18852 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 -070018853 ASSERT_TRUE(pass);
18854 VkDeviceMemory mem;
18855 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18856 ASSERT_VK_SUCCESS(err);
18857 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18858 ASSERT_VK_SUCCESS(err);
18859 // -----------------------
18860
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018861 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018862 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018863 image_view_create_info.image = image_bad;
18864 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18865 image_view_create_info.format = tex_format_bad;
18866 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18867 image_view_create_info.subresourceRange.baseMipLevel = 0;
18868 image_view_create_info.subresourceRange.layerCount = 1;
18869 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018870 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018871
18872 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018874
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018875 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018876
Chia-I Wuf7458c52015-10-26 21:10:41 +080018877 vkDestroyImage(m_device->device(), image_bad, NULL);
18878 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018879 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18880 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018881
18882 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018883}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018884
18885TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018886 TEST_DESCRIPTION(
18887 "Call ClearColorImage w/ a depth|stencil image and "
18888 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018889
Tony Barbour1fa09702017-03-16 12:09:08 -060018890 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018891 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018892 if (!depth_format) {
18893 return;
18894 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018895 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18896
Tony Barbour552f6c02016-12-21 14:34:07 -070018897 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018898
18899 // Color image
18900 VkClearColorValue clear_color;
18901 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18902 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18903 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18904 const int32_t img_width = 32;
18905 const int32_t img_height = 32;
18906 VkImageCreateInfo image_create_info = {};
18907 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18908 image_create_info.pNext = NULL;
18909 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18910 image_create_info.format = color_format;
18911 image_create_info.extent.width = img_width;
18912 image_create_info.extent.height = img_height;
18913 image_create_info.extent.depth = 1;
18914 image_create_info.mipLevels = 1;
18915 image_create_info.arrayLayers = 1;
18916 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18917 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18918 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18919
18920 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018921 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018923 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018924
18925 // Depth/Stencil image
18926 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018927 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018928 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18929 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018930 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018931 ds_image_create_info.extent.width = 64;
18932 ds_image_create_info.extent.height = 64;
18933 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018934 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 -060018935
18936 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018937 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018938
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018939 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 -060018940
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018942
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018943 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018944 &color_range);
18945
18946 m_errorMonitor->VerifyFound();
18947
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18949 "vkCmdClearColorImage called with "
18950 "image created without "
18951 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018952
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018953 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018954 &color_range);
18955
18956 m_errorMonitor->VerifyFound();
18957
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018958 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18960 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018961
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018962 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18963 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018964
18965 m_errorMonitor->VerifyFound();
18966}
Tobin Ehliscde08892015-09-22 10:11:37 -060018967
Mike Schuchardt35fece12017-03-07 14:40:28 -070018968TEST_F(VkLayerTest, CommandQueueFlags) {
18969 TEST_DESCRIPTION(
18970 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18971 "graphics-only command");
18972
18973 ASSERT_NO_FATAL_FAILURE(Init());
18974
18975 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018976 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018977 printf(" Non-graphics queue family not found; skipped.\n");
18978 return;
18979 } else {
18980 // Create command pool on a non-graphics queue
18981 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18982
18983 // Setup command buffer on pool
18984 VkCommandBufferObj command_buffer(m_device, &command_pool);
18985 command_buffer.BeginCommandBuffer();
18986
18987 // Issue a graphics only command
18988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18989 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18990 command_buffer.SetViewport(0, 1, &viewport);
18991 m_errorMonitor->VerifyFound();
18992 }
18993}
18994
Mark Lobodzinskib8359282017-05-16 09:17:51 -060018995TEST_F(VkLayerTest, ExecuteUnrecordedCBs) {
18996 TEST_DESCRIPTION(
18997 "Attempt vkCmdExecuteCommands and then QueueSubmit with an unrecorded secondary and primary command buffer, respectively");
18998
18999 ASSERT_NO_FATAL_FAILURE(Init());
19000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00155);
19002 // Allocate a secondary command buffer
19003 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19004 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19005 command_buffer_allocate_info.commandPool = m_commandPool->handle();
19006 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19007 command_buffer_allocate_info.commandBufferCount = 1;
19008 VkCommandBuffer secondary_command_buffer;
19009 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19010 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19011 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19012 command_buffer_begin_info.flags =
19013 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
19014 command_buffer_begin_info.pInheritanceInfo = nullptr;
19015
19016 // Now update primary cmd buffer to execute unrecorded secondary
19017 VkResult err = vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
19018 ASSERT_VK_SUCCESS(err);
19019 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
19020 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
19021 vkCmdEndRenderPass(m_commandBuffer->handle());
19022 err = vkEndCommandBuffer(m_commandBuffer->handle());
19023 ASSERT_VK_SUCCESS(err);
19024 m_errorMonitor->VerifyFound();
19025
19026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00134);
19027 // Allocate a primary command buffer
19028 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19029 command_buffer_allocate_info.commandBufferCount = 1;
19030 VkCommandBuffer primary_command_buffer;
19031 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19032
19033 // And submit the unrecorded command buffer
19034 VkSubmitInfo submit_info = {};
19035 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19036 submit_info.commandBufferCount = 1;
19037 submit_info.pCommandBuffers = &primary_command_buffer;
19038 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19039 m_errorMonitor->VerifyFound();
19040}
19041
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019042// WSI Enabled Tests
19043//
Chris Forbes09368e42016-10-13 11:59:22 +130019044#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019045TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
19046
19047#if defined(VK_USE_PLATFORM_XCB_KHR)
19048 VkSurfaceKHR surface = VK_NULL_HANDLE;
19049
19050 VkResult err;
19051 bool pass;
19052 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
19053 VkSwapchainCreateInfoKHR swapchain_create_info = {};
19054 // uint32_t swapchain_image_count = 0;
19055 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
19056 // uint32_t image_index = 0;
19057 // VkPresentInfoKHR present_info = {};
19058
Tony Barbour1fa09702017-03-16 12:09:08 -060019059 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019060
19061 // Use the create function from one of the VK_KHR_*_surface extension in
19062 // order to create a surface, testing all known errors in the process,
19063 // before successfully creating a surface:
19064 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
19065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
19066 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
19067 pass = (err != VK_SUCCESS);
19068 ASSERT_TRUE(pass);
19069 m_errorMonitor->VerifyFound();
19070
19071 // Next, try to create a surface with the wrong
19072 // VkXcbSurfaceCreateInfoKHR::sType:
19073 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
19074 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19076 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19077 pass = (err != VK_SUCCESS);
19078 ASSERT_TRUE(pass);
19079 m_errorMonitor->VerifyFound();
19080
19081 // Create a native window, and then correctly create a surface:
19082 xcb_connection_t *connection;
19083 xcb_screen_t *screen;
19084 xcb_window_t xcb_window;
19085 xcb_intern_atom_reply_t *atom_wm_delete_window;
19086
19087 const xcb_setup_t *setup;
19088 xcb_screen_iterator_t iter;
19089 int scr;
19090 uint32_t value_mask, value_list[32];
19091 int width = 1;
19092 int height = 1;
19093
19094 connection = xcb_connect(NULL, &scr);
19095 ASSERT_TRUE(connection != NULL);
19096 setup = xcb_get_setup(connection);
19097 iter = xcb_setup_roots_iterator(setup);
19098 while (scr-- > 0)
19099 xcb_screen_next(&iter);
19100 screen = iter.data;
19101
19102 xcb_window = xcb_generate_id(connection);
19103
19104 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
19105 value_list[0] = screen->black_pixel;
19106 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
19107
19108 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
19109 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
19110
19111 /* Magic code that will send notification when window is destroyed */
19112 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
19113 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
19114
19115 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
19116 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
19117 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
19118 free(reply);
19119
19120 xcb_map_window(connection, xcb_window);
19121
19122 // Force the x/y coordinates to 100,100 results are identical in consecutive
19123 // runs
19124 const uint32_t coords[] = { 100, 100 };
19125 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
19126
19127 // Finally, try to correctly create a surface:
19128 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
19129 xcb_create_info.pNext = NULL;
19130 xcb_create_info.flags = 0;
19131 xcb_create_info.connection = connection;
19132 xcb_create_info.window = xcb_window;
19133 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19134 pass = (err == VK_SUCCESS);
19135 ASSERT_TRUE(pass);
19136
19137 // Check if surface supports presentation:
19138
19139 // 1st, do so without having queried the queue families:
19140 VkBool32 supported = false;
19141 // TODO: Get the following error to come out:
19142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19143 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
19144 "function");
19145 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19146 pass = (err != VK_SUCCESS);
19147 // ASSERT_TRUE(pass);
19148 // m_errorMonitor->VerifyFound();
19149
19150 // Next, query a queue family index that's too large:
19151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19152 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
19153 pass = (err != VK_SUCCESS);
19154 ASSERT_TRUE(pass);
19155 m_errorMonitor->VerifyFound();
19156
19157 // Finally, do so correctly:
19158 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19159 // SUPPORTED
19160 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19161 pass = (err == VK_SUCCESS);
19162 ASSERT_TRUE(pass);
19163
19164 // Before proceeding, try to create a swapchain without having called
19165 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
19166 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19167 swapchain_create_info.pNext = NULL;
19168 swapchain_create_info.flags = 0;
19169 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
19170 swapchain_create_info.surface = surface;
19171 swapchain_create_info.imageArrayLayers = 1;
19172 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
19173 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
19174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19175 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
19176 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19177 pass = (err != VK_SUCCESS);
19178 ASSERT_TRUE(pass);
19179 m_errorMonitor->VerifyFound();
19180
19181 // Get the surface capabilities:
19182 VkSurfaceCapabilitiesKHR surface_capabilities;
19183
19184 // Do so correctly (only error logged by this entrypoint is if the
19185 // extension isn't enabled):
19186 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
19187 pass = (err == VK_SUCCESS);
19188 ASSERT_TRUE(pass);
19189
19190 // Get the surface formats:
19191 uint32_t surface_format_count;
19192
19193 // First, try without a pointer to surface_format_count:
19194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
19195 "specified as NULL");
19196 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
19197 pass = (err == VK_SUCCESS);
19198 ASSERT_TRUE(pass);
19199 m_errorMonitor->VerifyFound();
19200
19201 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
19202 // correctly done a 1st try (to get the count):
19203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19204 surface_format_count = 0;
19205 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
19206 pass = (err == VK_SUCCESS);
19207 ASSERT_TRUE(pass);
19208 m_errorMonitor->VerifyFound();
19209
19210 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19211 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19212 pass = (err == VK_SUCCESS);
19213 ASSERT_TRUE(pass);
19214
19215 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19216 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
19217
19218 // Next, do a 2nd try with surface_format_count being set too high:
19219 surface_format_count += 5;
19220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19221 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19222 pass = (err == VK_SUCCESS);
19223 ASSERT_TRUE(pass);
19224 m_errorMonitor->VerifyFound();
19225
19226 // Finally, do a correct 1st and 2nd try:
19227 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19228 pass = (err == VK_SUCCESS);
19229 ASSERT_TRUE(pass);
19230 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19231 pass = (err == VK_SUCCESS);
19232 ASSERT_TRUE(pass);
19233
19234 // Get the surface present modes:
19235 uint32_t surface_present_mode_count;
19236
19237 // First, try without a pointer to surface_format_count:
19238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
19239 "specified as NULL");
19240
19241 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
19242 pass = (err == VK_SUCCESS);
19243 ASSERT_TRUE(pass);
19244 m_errorMonitor->VerifyFound();
19245
19246 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
19247 // correctly done a 1st try (to get the count):
19248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19249 surface_present_mode_count = 0;
19250 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
19251 (VkPresentModeKHR *)&surface_present_mode_count);
19252 pass = (err == VK_SUCCESS);
19253 ASSERT_TRUE(pass);
19254 m_errorMonitor->VerifyFound();
19255
19256 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19257 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19258 pass = (err == VK_SUCCESS);
19259 ASSERT_TRUE(pass);
19260
19261 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19262 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
19263
19264 // Next, do a 2nd try with surface_format_count being set too high:
19265 surface_present_mode_count += 5;
19266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19267 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19268 pass = (err == VK_SUCCESS);
19269 ASSERT_TRUE(pass);
19270 m_errorMonitor->VerifyFound();
19271
19272 // Finally, do a correct 1st and 2nd try:
19273 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19274 pass = (err == VK_SUCCESS);
19275 ASSERT_TRUE(pass);
19276 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19277 pass = (err == VK_SUCCESS);
19278 ASSERT_TRUE(pass);
19279
19280 // Create a swapchain:
19281
19282 // First, try without a pointer to swapchain_create_info:
19283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
19284 "specified as NULL");
19285
19286 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
19287 pass = (err != VK_SUCCESS);
19288 ASSERT_TRUE(pass);
19289 m_errorMonitor->VerifyFound();
19290
19291 // Next, call with a non-NULL swapchain_create_info, that has the wrong
19292 // sType:
19293 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19295
19296 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19297 pass = (err != VK_SUCCESS);
19298 ASSERT_TRUE(pass);
19299 m_errorMonitor->VerifyFound();
19300
19301 // Next, call with a NULL swapchain pointer:
19302 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19303 swapchain_create_info.pNext = NULL;
19304 swapchain_create_info.flags = 0;
19305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
19306 "specified as NULL");
19307
19308 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
19309 pass = (err != VK_SUCCESS);
19310 ASSERT_TRUE(pass);
19311 m_errorMonitor->VerifyFound();
19312
19313 // TODO: Enhance swapchain layer so that
19314 // swapchain_create_info.queueFamilyIndexCount is checked against something?
19315
19316 // Next, call with a queue family index that's too large:
19317 uint32_t queueFamilyIndex[2] = { 100000, 0 };
19318 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19319 swapchain_create_info.queueFamilyIndexCount = 2;
19320 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
19321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19322 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19323 pass = (err != VK_SUCCESS);
19324 ASSERT_TRUE(pass);
19325 m_errorMonitor->VerifyFound();
19326
19327 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
19328 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19329 swapchain_create_info.queueFamilyIndexCount = 1;
19330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19331 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
19332 "pCreateInfo->pQueueFamilyIndices).");
19333 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19334 pass = (err != VK_SUCCESS);
19335 ASSERT_TRUE(pass);
19336 m_errorMonitor->VerifyFound();
19337
19338 // Next, call with an invalid imageSharingMode:
19339 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
19340 swapchain_create_info.queueFamilyIndexCount = 1;
19341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19342 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
19343 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19344 pass = (err != VK_SUCCESS);
19345 ASSERT_TRUE(pass);
19346 m_errorMonitor->VerifyFound();
19347 // Fix for the future:
19348 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19349 // SUPPORTED
19350 swapchain_create_info.queueFamilyIndexCount = 0;
19351 queueFamilyIndex[0] = 0;
19352 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
19353
19354 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
19355 // Get the images from a swapchain:
19356 // Acquire an image from a swapchain:
19357 // Present an image to a swapchain:
19358 // Destroy the swapchain:
19359
19360 // TODOs:
19361 //
19362 // - Try destroying the device without first destroying the swapchain
19363 //
19364 // - Try destroying the device without first destroying the surface
19365 //
19366 // - Try destroying the surface without first destroying the swapchain
19367
19368 // Destroy the surface:
19369 vkDestroySurfaceKHR(instance(), surface, NULL);
19370
19371 // Tear down the window:
19372 xcb_destroy_window(connection, xcb_window);
19373 xcb_disconnect(connection);
19374
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019375#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019376 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019377#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019378}
Chris Forbes09368e42016-10-13 11:59:22 +130019379#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019380
19381//
19382// POSITIVE VALIDATION TESTS
19383//
19384// These tests do not expect to encounter ANY validation errors pass only if this is true
19385
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019386TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
19387 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060019388 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019389 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19390
19391 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19392 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019393 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019394 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19395 command_buffer_allocate_info.commandBufferCount = 1;
19396
19397 VkCommandBuffer secondary_command_buffer;
19398 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19399 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19400 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19401 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19402 command_buffer_inheritance_info.renderPass = m_renderPass;
19403 command_buffer_inheritance_info.framebuffer = m_framebuffer;
19404
19405 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19406 command_buffer_begin_info.flags =
19407 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
19408 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19409
19410 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19411 VkClearAttachment color_attachment;
19412 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19413 color_attachment.clearValue.color.float32[0] = 0;
19414 color_attachment.clearValue.color.float32[1] = 0;
19415 color_attachment.clearValue.color.float32[2] = 0;
19416 color_attachment.clearValue.color.float32[3] = 0;
19417 color_attachment.colorAttachment = 0;
19418 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
19419 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
19420}
19421
Tobin Ehlise0006882016-11-03 10:14:28 -060019422TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019423 TEST_DESCRIPTION(
19424 "Perform an image layout transition in a secondary command buffer followed "
19425 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060019426 VkResult err;
19427 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060019428 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060019429 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070019430 if (!depth_format) {
19431 return;
19432 }
Tobin Ehlise0006882016-11-03 10:14:28 -060019433 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19434 // Allocate a secondary and primary cmd buffer
19435 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19436 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019437 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060019438 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19439 command_buffer_allocate_info.commandBufferCount = 1;
19440
19441 VkCommandBuffer secondary_command_buffer;
19442 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19443 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19444 VkCommandBuffer primary_command_buffer;
19445 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19446 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19447 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19448 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19449 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19450 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
19451 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19452
19453 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19454 ASSERT_VK_SUCCESS(err);
19455 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019456 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 -060019457 ASSERT_TRUE(image.initialized());
19458 VkImageMemoryBarrier img_barrier = {};
19459 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19460 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19461 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19462 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
19463 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19464 img_barrier.image = image.handle();
19465 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19466 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19467 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19468 img_barrier.subresourceRange.baseArrayLayer = 0;
19469 img_barrier.subresourceRange.baseMipLevel = 0;
19470 img_barrier.subresourceRange.layerCount = 1;
19471 img_barrier.subresourceRange.levelCount = 1;
19472 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
19473 0, nullptr, 1, &img_barrier);
19474 err = vkEndCommandBuffer(secondary_command_buffer);
19475 ASSERT_VK_SUCCESS(err);
19476
19477 // Now update primary cmd buffer to execute secondary and transitions image
19478 command_buffer_begin_info.pInheritanceInfo = nullptr;
19479 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
19480 ASSERT_VK_SUCCESS(err);
19481 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
19482 VkImageMemoryBarrier img_barrier2 = {};
19483 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19484 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19485 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19486 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19487 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19488 img_barrier2.image = image.handle();
19489 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19490 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19491 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19492 img_barrier2.subresourceRange.baseArrayLayer = 0;
19493 img_barrier2.subresourceRange.baseMipLevel = 0;
19494 img_barrier2.subresourceRange.layerCount = 1;
19495 img_barrier2.subresourceRange.levelCount = 1;
19496 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
19497 nullptr, 1, &img_barrier2);
19498 err = vkEndCommandBuffer(primary_command_buffer);
19499 ASSERT_VK_SUCCESS(err);
19500 VkSubmitInfo submit_info = {};
19501 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19502 submit_info.commandBufferCount = 1;
19503 submit_info.pCommandBuffers = &primary_command_buffer;
19504 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19505 ASSERT_VK_SUCCESS(err);
19506 m_errorMonitor->VerifyNotFound();
19507 err = vkDeviceWaitIdle(m_device->device());
19508 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070019509 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
19510 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060019511}
19512
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019513// This is a positive test. No failures are expected.
19514TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019515 TEST_DESCRIPTION(
19516 "Ensure that the vkUpdateDescriptorSets validation code "
19517 "is ignoring VkWriteDescriptorSet members that are not "
19518 "related to the descriptor type specified by "
19519 "VkWriteDescriptorSet::descriptorType. Correct "
19520 "validation behavior will result in the test running to "
19521 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019522
19523 const uintptr_t invalid_ptr = 0xcdcdcdcd;
19524
Tony Barbour1fa09702017-03-16 12:09:08 -060019525 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019526
19527 // Image Case
19528 {
19529 m_errorMonitor->ExpectSuccess();
19530
19531 VkImage image;
19532 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
19533 const int32_t tex_width = 32;
19534 const int32_t tex_height = 32;
19535 VkImageCreateInfo image_create_info = {};
19536 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19537 image_create_info.pNext = NULL;
19538 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19539 image_create_info.format = tex_format;
19540 image_create_info.extent.width = tex_width;
19541 image_create_info.extent.height = tex_height;
19542 image_create_info.extent.depth = 1;
19543 image_create_info.mipLevels = 1;
19544 image_create_info.arrayLayers = 1;
19545 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19546 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19547 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
19548 image_create_info.flags = 0;
19549 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19550 ASSERT_VK_SUCCESS(err);
19551
19552 VkMemoryRequirements memory_reqs;
19553 VkDeviceMemory image_memory;
19554 bool pass;
19555 VkMemoryAllocateInfo memory_info = {};
19556 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19557 memory_info.pNext = NULL;
19558 memory_info.allocationSize = 0;
19559 memory_info.memoryTypeIndex = 0;
19560 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19561 memory_info.allocationSize = memory_reqs.size;
19562 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19563 ASSERT_TRUE(pass);
19564 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
19565 ASSERT_VK_SUCCESS(err);
19566 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
19567 ASSERT_VK_SUCCESS(err);
19568
19569 VkImageViewCreateInfo image_view_create_info = {};
19570 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19571 image_view_create_info.image = image;
19572 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
19573 image_view_create_info.format = tex_format;
19574 image_view_create_info.subresourceRange.layerCount = 1;
19575 image_view_create_info.subresourceRange.baseMipLevel = 0;
19576 image_view_create_info.subresourceRange.levelCount = 1;
19577 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19578
19579 VkImageView view;
19580 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
19581 ASSERT_VK_SUCCESS(err);
19582
19583 VkDescriptorPoolSize ds_type_count = {};
19584 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19585 ds_type_count.descriptorCount = 1;
19586
19587 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19588 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19589 ds_pool_ci.pNext = NULL;
19590 ds_pool_ci.maxSets = 1;
19591 ds_pool_ci.poolSizeCount = 1;
19592 ds_pool_ci.pPoolSizes = &ds_type_count;
19593
19594 VkDescriptorPool ds_pool;
19595 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19596 ASSERT_VK_SUCCESS(err);
19597
19598 VkDescriptorSetLayoutBinding dsl_binding = {};
19599 dsl_binding.binding = 0;
19600 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19601 dsl_binding.descriptorCount = 1;
19602 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19603 dsl_binding.pImmutableSamplers = NULL;
19604
19605 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19606 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19607 ds_layout_ci.pNext = NULL;
19608 ds_layout_ci.bindingCount = 1;
19609 ds_layout_ci.pBindings = &dsl_binding;
19610 VkDescriptorSetLayout ds_layout;
19611 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19612 ASSERT_VK_SUCCESS(err);
19613
19614 VkDescriptorSet descriptor_set;
19615 VkDescriptorSetAllocateInfo alloc_info = {};
19616 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19617 alloc_info.descriptorSetCount = 1;
19618 alloc_info.descriptorPool = ds_pool;
19619 alloc_info.pSetLayouts = &ds_layout;
19620 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19621 ASSERT_VK_SUCCESS(err);
19622
19623 VkDescriptorImageInfo image_info = {};
19624 image_info.imageView = view;
19625 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
19626
19627 VkWriteDescriptorSet descriptor_write;
19628 memset(&descriptor_write, 0, sizeof(descriptor_write));
19629 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19630 descriptor_write.dstSet = descriptor_set;
19631 descriptor_write.dstBinding = 0;
19632 descriptor_write.descriptorCount = 1;
19633 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19634 descriptor_write.pImageInfo = &image_info;
19635
19636 // Set pBufferInfo and pTexelBufferView to invalid values, which should
19637 // be
19638 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
19639 // This will most likely produce a crash if the parameter_validation
19640 // layer
19641 // does not correctly ignore pBufferInfo.
19642 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19643 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19644
19645 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19646
19647 m_errorMonitor->VerifyNotFound();
19648
19649 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19650 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19651 vkDestroyImageView(m_device->device(), view, NULL);
19652 vkDestroyImage(m_device->device(), image, NULL);
19653 vkFreeMemory(m_device->device(), image_memory, NULL);
19654 }
19655
19656 // Buffer Case
19657 {
19658 m_errorMonitor->ExpectSuccess();
19659
19660 VkBuffer buffer;
19661 uint32_t queue_family_index = 0;
19662 VkBufferCreateInfo buffer_create_info = {};
19663 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19664 buffer_create_info.size = 1024;
19665 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19666 buffer_create_info.queueFamilyIndexCount = 1;
19667 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19668
19669 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19670 ASSERT_VK_SUCCESS(err);
19671
19672 VkMemoryRequirements memory_reqs;
19673 VkDeviceMemory buffer_memory;
19674 bool pass;
19675 VkMemoryAllocateInfo memory_info = {};
19676 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19677 memory_info.pNext = NULL;
19678 memory_info.allocationSize = 0;
19679 memory_info.memoryTypeIndex = 0;
19680
19681 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19682 memory_info.allocationSize = memory_reqs.size;
19683 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19684 ASSERT_TRUE(pass);
19685
19686 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19687 ASSERT_VK_SUCCESS(err);
19688 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19689 ASSERT_VK_SUCCESS(err);
19690
19691 VkDescriptorPoolSize ds_type_count = {};
19692 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19693 ds_type_count.descriptorCount = 1;
19694
19695 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19696 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19697 ds_pool_ci.pNext = NULL;
19698 ds_pool_ci.maxSets = 1;
19699 ds_pool_ci.poolSizeCount = 1;
19700 ds_pool_ci.pPoolSizes = &ds_type_count;
19701
19702 VkDescriptorPool ds_pool;
19703 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19704 ASSERT_VK_SUCCESS(err);
19705
19706 VkDescriptorSetLayoutBinding dsl_binding = {};
19707 dsl_binding.binding = 0;
19708 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19709 dsl_binding.descriptorCount = 1;
19710 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19711 dsl_binding.pImmutableSamplers = NULL;
19712
19713 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19714 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19715 ds_layout_ci.pNext = NULL;
19716 ds_layout_ci.bindingCount = 1;
19717 ds_layout_ci.pBindings = &dsl_binding;
19718 VkDescriptorSetLayout ds_layout;
19719 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19720 ASSERT_VK_SUCCESS(err);
19721
19722 VkDescriptorSet descriptor_set;
19723 VkDescriptorSetAllocateInfo alloc_info = {};
19724 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19725 alloc_info.descriptorSetCount = 1;
19726 alloc_info.descriptorPool = ds_pool;
19727 alloc_info.pSetLayouts = &ds_layout;
19728 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19729 ASSERT_VK_SUCCESS(err);
19730
19731 VkDescriptorBufferInfo buffer_info = {};
19732 buffer_info.buffer = buffer;
19733 buffer_info.offset = 0;
19734 buffer_info.range = 1024;
19735
19736 VkWriteDescriptorSet descriptor_write;
19737 memset(&descriptor_write, 0, sizeof(descriptor_write));
19738 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19739 descriptor_write.dstSet = descriptor_set;
19740 descriptor_write.dstBinding = 0;
19741 descriptor_write.descriptorCount = 1;
19742 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19743 descriptor_write.pBufferInfo = &buffer_info;
19744
19745 // Set pImageInfo and pTexelBufferView to invalid values, which should
19746 // be
19747 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
19748 // This will most likely produce a crash if the parameter_validation
19749 // layer
19750 // does not correctly ignore pImageInfo.
19751 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19752 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19753
19754 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19755
19756 m_errorMonitor->VerifyNotFound();
19757
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019758 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19759 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19760 vkDestroyBuffer(m_device->device(), buffer, NULL);
19761 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19762 }
19763
19764 // Texel Buffer Case
19765 {
19766 m_errorMonitor->ExpectSuccess();
19767
19768 VkBuffer buffer;
19769 uint32_t queue_family_index = 0;
19770 VkBufferCreateInfo buffer_create_info = {};
19771 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19772 buffer_create_info.size = 1024;
19773 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
19774 buffer_create_info.queueFamilyIndexCount = 1;
19775 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19776
19777 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19778 ASSERT_VK_SUCCESS(err);
19779
19780 VkMemoryRequirements memory_reqs;
19781 VkDeviceMemory buffer_memory;
19782 bool pass;
19783 VkMemoryAllocateInfo memory_info = {};
19784 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19785 memory_info.pNext = NULL;
19786 memory_info.allocationSize = 0;
19787 memory_info.memoryTypeIndex = 0;
19788
19789 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19790 memory_info.allocationSize = memory_reqs.size;
19791 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19792 ASSERT_TRUE(pass);
19793
19794 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19795 ASSERT_VK_SUCCESS(err);
19796 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19797 ASSERT_VK_SUCCESS(err);
19798
19799 VkBufferViewCreateInfo buff_view_ci = {};
19800 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
19801 buff_view_ci.buffer = buffer;
19802 buff_view_ci.format = VK_FORMAT_R8_UNORM;
19803 buff_view_ci.range = VK_WHOLE_SIZE;
19804 VkBufferView buffer_view;
19805 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19806
19807 VkDescriptorPoolSize ds_type_count = {};
19808 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19809 ds_type_count.descriptorCount = 1;
19810
19811 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19812 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19813 ds_pool_ci.pNext = NULL;
19814 ds_pool_ci.maxSets = 1;
19815 ds_pool_ci.poolSizeCount = 1;
19816 ds_pool_ci.pPoolSizes = &ds_type_count;
19817
19818 VkDescriptorPool ds_pool;
19819 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19820 ASSERT_VK_SUCCESS(err);
19821
19822 VkDescriptorSetLayoutBinding dsl_binding = {};
19823 dsl_binding.binding = 0;
19824 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19825 dsl_binding.descriptorCount = 1;
19826 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19827 dsl_binding.pImmutableSamplers = NULL;
19828
19829 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19830 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19831 ds_layout_ci.pNext = NULL;
19832 ds_layout_ci.bindingCount = 1;
19833 ds_layout_ci.pBindings = &dsl_binding;
19834 VkDescriptorSetLayout ds_layout;
19835 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19836 ASSERT_VK_SUCCESS(err);
19837
19838 VkDescriptorSet descriptor_set;
19839 VkDescriptorSetAllocateInfo alloc_info = {};
19840 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19841 alloc_info.descriptorSetCount = 1;
19842 alloc_info.descriptorPool = ds_pool;
19843 alloc_info.pSetLayouts = &ds_layout;
19844 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19845 ASSERT_VK_SUCCESS(err);
19846
19847 VkWriteDescriptorSet descriptor_write;
19848 memset(&descriptor_write, 0, sizeof(descriptor_write));
19849 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19850 descriptor_write.dstSet = descriptor_set;
19851 descriptor_write.dstBinding = 0;
19852 descriptor_write.descriptorCount = 1;
19853 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19854 descriptor_write.pTexelBufferView = &buffer_view;
19855
19856 // Set pImageInfo and pBufferInfo to invalid values, which should be
19857 // ignored for descriptorType ==
19858 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19859 // This will most likely produce a crash if the parameter_validation
19860 // layer
19861 // does not correctly ignore pImageInfo and pBufferInfo.
19862 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19863 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19864
19865 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19866
19867 m_errorMonitor->VerifyNotFound();
19868
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019869 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19870 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19871 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19872 vkDestroyBuffer(m_device->device(), buffer, NULL);
19873 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19874 }
19875}
19876
Tobin Ehlis8893af82017-05-08 12:52:25 -060019877TEST_F(VkPositiveLayerTest, ImmutableSamplerOnlyDescriptor) {
19878 TEST_DESCRIPTION(
19879 "Bind a DescriptorSet with only an immutable sampler"
19880 "and make sure that we don't warn for no update.");
19881
19882 ASSERT_NO_FATAL_FAILURE(Init());
19883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19884
19885 VkDescriptorPoolSize ds_type_count = {};
19886 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
19887 ds_type_count.descriptorCount = 1;
19888
19889 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19890 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19891 ds_pool_ci.maxSets = 1;
19892 ds_pool_ci.poolSizeCount = 1;
19893 ds_pool_ci.pPoolSizes = &ds_type_count;
19894
19895 VkDescriptorPool ds_pool;
19896 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19897 ASSERT_VK_SUCCESS(err);
19898
19899 VkSamplerCreateInfo sampler_ci = {};
19900 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
19901 sampler_ci.pNext = NULL;
19902 sampler_ci.magFilter = VK_FILTER_NEAREST;
19903 sampler_ci.minFilter = VK_FILTER_NEAREST;
19904 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
19905 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19906 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19907 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19908 sampler_ci.mipLodBias = 1.0;
19909 sampler_ci.anisotropyEnable = VK_FALSE;
19910 sampler_ci.maxAnisotropy = 1;
19911 sampler_ci.compareEnable = VK_FALSE;
19912 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
19913 sampler_ci.minLod = 1.0;
19914 sampler_ci.maxLod = 1.0;
19915 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
19916 sampler_ci.unnormalizedCoordinates = VK_FALSE;
19917 VkSampler sampler;
19918
19919 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
19920 ASSERT_VK_SUCCESS(err);
19921
19922 VkDescriptorSetLayoutBinding layout_binding = {};
19923 layout_binding.binding = 0;
19924 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
19925 layout_binding.descriptorCount = 1;
19926 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19927 layout_binding.pImmutableSamplers = static_cast<VkSampler *>(&sampler);
19928
19929 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19930 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19931 ds_layout_ci.bindingCount = 1;
19932 ds_layout_ci.pBindings = &layout_binding;
19933 VkDescriptorSetLayout ds_layout;
19934 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19935 ASSERT_VK_SUCCESS(err);
19936
19937 VkDescriptorSetAllocateInfo alloc_info = {};
19938 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19939 alloc_info.descriptorSetCount = 1;
19940 alloc_info.descriptorPool = ds_pool;
19941 alloc_info.pSetLayouts = &ds_layout;
19942 VkDescriptorSet descriptor_set;
19943 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19944 ASSERT_VK_SUCCESS(err);
19945
19946 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19947 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19948 pipeline_layout_ci.pNext = NULL;
19949 pipeline_layout_ci.setLayoutCount = 1;
19950 pipeline_layout_ci.pSetLayouts = &ds_layout;
19951
19952 VkPipelineLayout pipeline_layout;
19953 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19954 ASSERT_VK_SUCCESS(err);
19955
19956 m_errorMonitor->ExpectSuccess();
19957 m_commandBuffer->BeginCommandBuffer();
19958 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
19959
19960 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19961 &descriptor_set, 0, nullptr);
19962 m_errorMonitor->VerifyNotFound();
19963
19964 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19965 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19966 vkDestroySampler(m_device->device(), sampler, NULL);
19967 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19968}
19969
Tobin Ehlisf7428442016-10-25 07:58:24 -060019970TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19971 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19972
Tony Barbour1fa09702017-03-16 12:09:08 -060019973 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019974 // Create layout where two binding #s are "1"
19975 static const uint32_t NUM_BINDINGS = 3;
19976 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19977 dsl_binding[0].binding = 1;
19978 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19979 dsl_binding[0].descriptorCount = 1;
19980 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19981 dsl_binding[0].pImmutableSamplers = NULL;
19982 dsl_binding[1].binding = 0;
19983 dsl_binding[1].descriptorCount = 1;
19984 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19985 dsl_binding[1].descriptorCount = 1;
19986 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19987 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019988 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019989 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19990 dsl_binding[2].descriptorCount = 1;
19991 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19992 dsl_binding[2].pImmutableSamplers = NULL;
19993
19994 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19995 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19996 ds_layout_ci.pNext = NULL;
19997 ds_layout_ci.bindingCount = NUM_BINDINGS;
19998 ds_layout_ci.pBindings = dsl_binding;
19999 VkDescriptorSetLayout ds_layout;
20000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
20001 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20002 m_errorMonitor->VerifyFound();
20003}
20004
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060020005TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020006 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
20007
Tony Barbour1fa09702017-03-16 12:09:08 -060020008 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020009
Tony Barbour552f6c02016-12-21 14:34:07 -070020010 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020011
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060020012 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
20013
20014 {
20015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
20016 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
20017 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20018 m_errorMonitor->VerifyFound();
20019 }
20020
20021 {
20022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
20023 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
20024 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20025 m_errorMonitor->VerifyFound();
20026 }
20027
20028 {
20029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
20030 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
20031 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20032 m_errorMonitor->VerifyFound();
20033 }
20034
20035 {
20036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
20037 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
20038 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20039 m_errorMonitor->VerifyFound();
20040 }
20041
20042 {
20043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
20044 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
20045 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20046 m_errorMonitor->VerifyFound();
20047 }
20048
20049 {
20050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
20051 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
20052 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20053 m_errorMonitor->VerifyFound();
20054 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020055
20056 {
20057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
20058 VkRect2D scissor = {{-1, 0}, {16, 16}};
20059 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20060 m_errorMonitor->VerifyFound();
20061 }
20062
20063 {
20064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
20065 VkRect2D scissor = {{0, -2}, {16, 16}};
20066 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20067 m_errorMonitor->VerifyFound();
20068 }
20069
20070 {
20071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
20072 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
20073 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20074 m_errorMonitor->VerifyFound();
20075 }
20076
20077 {
20078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
20079 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
20080 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20081 m_errorMonitor->VerifyFound();
20082 }
20083
Tony Barbour552f6c02016-12-21 14:34:07 -070020084 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020085}
20086
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020087// This is a positive test. No failures are expected.
20088TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
20089 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
20090 VkResult err;
20091
Tony Barbour1fa09702017-03-16 12:09:08 -060020092 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020093 m_errorMonitor->ExpectSuccess();
20094 VkDescriptorPoolSize ds_type_count = {};
20095 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20096 ds_type_count.descriptorCount = 2;
20097
20098 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20099 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20100 ds_pool_ci.pNext = NULL;
20101 ds_pool_ci.maxSets = 1;
20102 ds_pool_ci.poolSizeCount = 1;
20103 ds_pool_ci.pPoolSizes = &ds_type_count;
20104
20105 VkDescriptorPool ds_pool;
20106 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20107 ASSERT_VK_SUCCESS(err);
20108
20109 // Create layout with two uniform buffer descriptors w/ empty binding between them
20110 static const uint32_t NUM_BINDINGS = 3;
20111 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
20112 dsl_binding[0].binding = 0;
20113 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20114 dsl_binding[0].descriptorCount = 1;
20115 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
20116 dsl_binding[0].pImmutableSamplers = NULL;
20117 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020118 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020119 dsl_binding[2].binding = 2;
20120 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20121 dsl_binding[2].descriptorCount = 1;
20122 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
20123 dsl_binding[2].pImmutableSamplers = NULL;
20124
20125 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20126 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20127 ds_layout_ci.pNext = NULL;
20128 ds_layout_ci.bindingCount = NUM_BINDINGS;
20129 ds_layout_ci.pBindings = dsl_binding;
20130 VkDescriptorSetLayout ds_layout;
20131 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20132 ASSERT_VK_SUCCESS(err);
20133
20134 VkDescriptorSet descriptor_set = {};
20135 VkDescriptorSetAllocateInfo alloc_info = {};
20136 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20137 alloc_info.descriptorSetCount = 1;
20138 alloc_info.descriptorPool = ds_pool;
20139 alloc_info.pSetLayouts = &ds_layout;
20140 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20141 ASSERT_VK_SUCCESS(err);
20142
20143 // Create a buffer to be used for update
20144 VkBufferCreateInfo buff_ci = {};
20145 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20146 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20147 buff_ci.size = 256;
20148 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20149 VkBuffer buffer;
20150 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
20151 ASSERT_VK_SUCCESS(err);
20152 // Have to bind memory to buffer before descriptor update
20153 VkMemoryAllocateInfo mem_alloc = {};
20154 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20155 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020156 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020157 mem_alloc.memoryTypeIndex = 0;
20158
20159 VkMemoryRequirements mem_reqs;
20160 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20161 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
20162 if (!pass) {
20163 vkDestroyBuffer(m_device->device(), buffer, NULL);
20164 return;
20165 }
20166
20167 VkDeviceMemory mem;
20168 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20169 ASSERT_VK_SUCCESS(err);
20170 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20171 ASSERT_VK_SUCCESS(err);
20172
20173 // Only update the descriptor at binding 2
20174 VkDescriptorBufferInfo buff_info = {};
20175 buff_info.buffer = buffer;
20176 buff_info.offset = 0;
20177 buff_info.range = VK_WHOLE_SIZE;
20178 VkWriteDescriptorSet descriptor_write = {};
20179 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20180 descriptor_write.dstBinding = 2;
20181 descriptor_write.descriptorCount = 1;
20182 descriptor_write.pTexelBufferView = nullptr;
20183 descriptor_write.pBufferInfo = &buff_info;
20184 descriptor_write.pImageInfo = nullptr;
20185 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20186 descriptor_write.dstSet = descriptor_set;
20187
20188 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20189
20190 m_errorMonitor->VerifyNotFound();
20191 // Cleanup
20192 vkFreeMemory(m_device->device(), mem, NULL);
20193 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20194 vkDestroyBuffer(m_device->device(), buffer, NULL);
20195 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20196}
20197
20198// This is a positive test. No failures are expected.
20199TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
20200 VkResult err;
20201 bool pass;
20202
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020203 TEST_DESCRIPTION(
20204 "Create a buffer, allocate memory, bind memory, destroy "
20205 "the buffer, create an image, and bind the same memory to "
20206 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020207
20208 m_errorMonitor->ExpectSuccess();
20209
Tony Barbour1fa09702017-03-16 12:09:08 -060020210 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020211
20212 VkBuffer buffer;
20213 VkImage image;
20214 VkDeviceMemory mem;
20215 VkMemoryRequirements mem_reqs;
20216
20217 VkBufferCreateInfo buf_info = {};
20218 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20219 buf_info.pNext = NULL;
20220 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20221 buf_info.size = 256;
20222 buf_info.queueFamilyIndexCount = 0;
20223 buf_info.pQueueFamilyIndices = NULL;
20224 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20225 buf_info.flags = 0;
20226 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
20227 ASSERT_VK_SUCCESS(err);
20228
20229 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20230
20231 VkMemoryAllocateInfo alloc_info = {};
20232 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20233 alloc_info.pNext = NULL;
20234 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020235
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020236 // Ensure memory is big enough for both bindings
20237 alloc_info.allocationSize = 0x10000;
20238
20239 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20240 if (!pass) {
20241 vkDestroyBuffer(m_device->device(), buffer, NULL);
20242 return;
20243 }
20244
20245 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20246 ASSERT_VK_SUCCESS(err);
20247
20248 uint8_t *pData;
20249 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
20250 ASSERT_VK_SUCCESS(err);
20251
20252 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
20253
20254 vkUnmapMemory(m_device->device(), mem);
20255
20256 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20257 ASSERT_VK_SUCCESS(err);
20258
20259 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
20260 // memory. In fact, it was never used by the GPU.
20261 // Just be be sure, wait for idle.
20262 vkDestroyBuffer(m_device->device(), buffer, NULL);
20263 vkDeviceWaitIdle(m_device->device());
20264
Tobin Ehlis6a005702016-12-28 15:25:56 -070020265 // Use optimal as some platforms report linear support but then fail image creation
20266 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
20267 VkImageFormatProperties image_format_properties;
20268 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
20269 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
20270 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070020271 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070020272 vkFreeMemory(m_device->device(), mem, NULL);
20273 return;
20274 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020275 VkImageCreateInfo image_create_info = {};
20276 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20277 image_create_info.pNext = NULL;
20278 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20279 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
20280 image_create_info.extent.width = 64;
20281 image_create_info.extent.height = 64;
20282 image_create_info.extent.depth = 1;
20283 image_create_info.mipLevels = 1;
20284 image_create_info.arrayLayers = 1;
20285 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070020286 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020287 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
20288 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
20289 image_create_info.queueFamilyIndexCount = 0;
20290 image_create_info.pQueueFamilyIndices = NULL;
20291 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20292 image_create_info.flags = 0;
20293
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020294 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020295 * to be textures or it will be the staging image if they are not.
20296 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020297 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20298 ASSERT_VK_SUCCESS(err);
20299
20300 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
20301
Tobin Ehlis6a005702016-12-28 15:25:56 -070020302 VkMemoryAllocateInfo mem_alloc = {};
20303 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20304 mem_alloc.pNext = NULL;
20305 mem_alloc.allocationSize = 0;
20306 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020307 mem_alloc.allocationSize = mem_reqs.size;
20308
20309 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20310 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070020311 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020312 vkDestroyImage(m_device->device(), image, NULL);
20313 return;
20314 }
20315
20316 // VALIDATION FAILURE:
20317 err = vkBindImageMemory(m_device->device(), image, mem, 0);
20318 ASSERT_VK_SUCCESS(err);
20319
20320 m_errorMonitor->VerifyNotFound();
20321
20322 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020323 vkDestroyImage(m_device->device(), image, NULL);
20324}
20325
Tony Barbourab713912017-02-02 14:17:35 -070020326// This is a positive test. No failures are expected.
20327TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
20328 VkResult err;
20329
20330 TEST_DESCRIPTION(
20331 "Call all applicable destroy and free routines with NULL"
20332 "handles, expecting no validation errors");
20333
20334 m_errorMonitor->ExpectSuccess();
20335
Tony Barbour1fa09702017-03-16 12:09:08 -060020336 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070020337 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20338 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
20339 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
20340 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
20341 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20342 vkDestroyDevice(VK_NULL_HANDLE, NULL);
20343 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
20344 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
20345 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20346 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
20347 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
20348 vkDestroyInstance(VK_NULL_HANDLE, NULL);
20349 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
20350 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
20351 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20352 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
20353 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
20354 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
20355 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
20356 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
20357
20358 VkCommandPool command_pool;
20359 VkCommandPoolCreateInfo pool_create_info{};
20360 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20361 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20362 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20363 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20364 VkCommandBuffer command_buffers[3] = {};
20365 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20366 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20367 command_buffer_allocate_info.commandPool = command_pool;
20368 command_buffer_allocate_info.commandBufferCount = 1;
20369 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20370 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
20371 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
20372 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20373
20374 VkDescriptorPoolSize ds_type_count = {};
20375 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20376 ds_type_count.descriptorCount = 1;
20377
20378 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20379 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20380 ds_pool_ci.pNext = NULL;
20381 ds_pool_ci.maxSets = 1;
20382 ds_pool_ci.poolSizeCount = 1;
20383 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
20384 ds_pool_ci.pPoolSizes = &ds_type_count;
20385
20386 VkDescriptorPool ds_pool;
20387 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20388 ASSERT_VK_SUCCESS(err);
20389
20390 VkDescriptorSetLayoutBinding dsl_binding = {};
20391 dsl_binding.binding = 2;
20392 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20393 dsl_binding.descriptorCount = 1;
20394 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20395 dsl_binding.pImmutableSamplers = NULL;
20396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20398 ds_layout_ci.pNext = NULL;
20399 ds_layout_ci.bindingCount = 1;
20400 ds_layout_ci.pBindings = &dsl_binding;
20401 VkDescriptorSetLayout ds_layout;
20402 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20403 ASSERT_VK_SUCCESS(err);
20404
20405 VkDescriptorSet descriptor_sets[3] = {};
20406 VkDescriptorSetAllocateInfo alloc_info = {};
20407 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20408 alloc_info.descriptorSetCount = 1;
20409 alloc_info.descriptorPool = ds_pool;
20410 alloc_info.pSetLayouts = &ds_layout;
20411 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
20412 ASSERT_VK_SUCCESS(err);
20413 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
20414 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20415 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20416
20417 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
20418
20419 m_errorMonitor->VerifyNotFound();
20420}
20421
Tony Barbour626994c2017-02-08 15:29:37 -070020422TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070020423 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070020424
20425 m_errorMonitor->ExpectSuccess();
20426
Tony Barbour1fa09702017-03-16 12:09:08 -060020427 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070020428 VkCommandBuffer cmd_bufs[4];
20429 VkCommandBufferAllocateInfo alloc_info;
20430 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20431 alloc_info.pNext = NULL;
20432 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070020433 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070020434 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20435 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
20436 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020437 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070020438 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
20439 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070020440 ASSERT_TRUE(image.initialized());
20441 VkCommandBufferBeginInfo cb_binfo;
20442 cb_binfo.pNext = NULL;
20443 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20444 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
20445 cb_binfo.flags = 0;
20446 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
20447 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
20448 VkImageMemoryBarrier img_barrier = {};
20449 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20450 img_barrier.pNext = NULL;
20451 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20452 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20453 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20454 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20455 img_barrier.image = image.handle();
20456 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20457 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20458 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20459 img_barrier.subresourceRange.baseArrayLayer = 0;
20460 img_barrier.subresourceRange.baseMipLevel = 0;
20461 img_barrier.subresourceRange.layerCount = 1;
20462 img_barrier.subresourceRange.levelCount = 1;
20463 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20464 &img_barrier);
20465 vkEndCommandBuffer(cmd_bufs[0]);
20466 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
20467 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20468 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20469 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20470 &img_barrier);
20471 vkEndCommandBuffer(cmd_bufs[1]);
20472 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
20473 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20474 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20475 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20476 &img_barrier);
20477 vkEndCommandBuffer(cmd_bufs[2]);
20478 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
20479 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20480 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20481 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20482 &img_barrier);
20483 vkEndCommandBuffer(cmd_bufs[3]);
20484
20485 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
20486 VkSemaphore semaphore1, semaphore2;
20487 VkSemaphoreCreateInfo semaphore_create_info{};
20488 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20489 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
20490 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
20491 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
20492 VkSubmitInfo submit_info[3];
20493 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20494 submit_info[0].pNext = nullptr;
20495 submit_info[0].commandBufferCount = 1;
20496 submit_info[0].pCommandBuffers = &cmd_bufs[0];
20497 submit_info[0].signalSemaphoreCount = 1;
20498 submit_info[0].pSignalSemaphores = &semaphore1;
20499 submit_info[0].waitSemaphoreCount = 0;
20500 submit_info[0].pWaitDstStageMask = nullptr;
20501 submit_info[0].pWaitDstStageMask = flags;
20502 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20503 submit_info[1].pNext = nullptr;
20504 submit_info[1].commandBufferCount = 1;
20505 submit_info[1].pCommandBuffers = &cmd_bufs[1];
20506 submit_info[1].waitSemaphoreCount = 1;
20507 submit_info[1].pWaitSemaphores = &semaphore1;
20508 submit_info[1].signalSemaphoreCount = 1;
20509 submit_info[1].pSignalSemaphores = &semaphore2;
20510 submit_info[1].pWaitDstStageMask = flags;
20511 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20512 submit_info[2].pNext = nullptr;
20513 submit_info[2].commandBufferCount = 2;
20514 submit_info[2].pCommandBuffers = &cmd_bufs[2];
20515 submit_info[2].waitSemaphoreCount = 1;
20516 submit_info[2].pWaitSemaphores = &semaphore2;
20517 submit_info[2].signalSemaphoreCount = 0;
20518 submit_info[2].pSignalSemaphores = nullptr;
20519 submit_info[2].pWaitDstStageMask = flags;
20520 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
20521 vkQueueWaitIdle(m_device->m_queue);
20522
20523 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
20524 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
20525 m_errorMonitor->VerifyNotFound();
20526}
20527
Tobin Ehlis953e8392016-11-17 10:54:13 -070020528TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
20529 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
20530 // We previously had a bug where dynamic offset of inactive bindings was still being used
20531 VkResult err;
20532 m_errorMonitor->ExpectSuccess();
20533
Tony Barbour1fa09702017-03-16 12:09:08 -060020534 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070020535 ASSERT_NO_FATAL_FAILURE(InitViewport());
20536 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20537
20538 VkDescriptorPoolSize ds_type_count = {};
20539 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20540 ds_type_count.descriptorCount = 3;
20541
20542 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20543 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20544 ds_pool_ci.pNext = NULL;
20545 ds_pool_ci.maxSets = 1;
20546 ds_pool_ci.poolSizeCount = 1;
20547 ds_pool_ci.pPoolSizes = &ds_type_count;
20548
20549 VkDescriptorPool ds_pool;
20550 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20551 ASSERT_VK_SUCCESS(err);
20552
20553 const uint32_t BINDING_COUNT = 3;
20554 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020555 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020556 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20557 dsl_binding[0].descriptorCount = 1;
20558 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20559 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020560 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020561 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20562 dsl_binding[1].descriptorCount = 1;
20563 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20564 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020565 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020566 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20567 dsl_binding[2].descriptorCount = 1;
20568 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20569 dsl_binding[2].pImmutableSamplers = NULL;
20570
20571 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20572 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20573 ds_layout_ci.pNext = NULL;
20574 ds_layout_ci.bindingCount = BINDING_COUNT;
20575 ds_layout_ci.pBindings = dsl_binding;
20576 VkDescriptorSetLayout ds_layout;
20577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20578 ASSERT_VK_SUCCESS(err);
20579
20580 VkDescriptorSet descriptor_set;
20581 VkDescriptorSetAllocateInfo alloc_info = {};
20582 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20583 alloc_info.descriptorSetCount = 1;
20584 alloc_info.descriptorPool = ds_pool;
20585 alloc_info.pSetLayouts = &ds_layout;
20586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20587 ASSERT_VK_SUCCESS(err);
20588
20589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20591 pipeline_layout_ci.pNext = NULL;
20592 pipeline_layout_ci.setLayoutCount = 1;
20593 pipeline_layout_ci.pSetLayouts = &ds_layout;
20594
20595 VkPipelineLayout pipeline_layout;
20596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20597 ASSERT_VK_SUCCESS(err);
20598
20599 // Create two buffers to update the descriptors with
20600 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
20601 uint32_t qfi = 0;
20602 VkBufferCreateInfo buffCI = {};
20603 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20604 buffCI.size = 2048;
20605 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20606 buffCI.queueFamilyIndexCount = 1;
20607 buffCI.pQueueFamilyIndices = &qfi;
20608
20609 VkBuffer dyub1;
20610 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
20611 ASSERT_VK_SUCCESS(err);
20612 // buffer2
20613 buffCI.size = 1024;
20614 VkBuffer dyub2;
20615 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
20616 ASSERT_VK_SUCCESS(err);
20617 // Allocate memory and bind to buffers
20618 VkMemoryAllocateInfo mem_alloc[2] = {};
20619 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20620 mem_alloc[0].pNext = NULL;
20621 mem_alloc[0].memoryTypeIndex = 0;
20622 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20623 mem_alloc[1].pNext = NULL;
20624 mem_alloc[1].memoryTypeIndex = 0;
20625
20626 VkMemoryRequirements mem_reqs1;
20627 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
20628 VkMemoryRequirements mem_reqs2;
20629 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
20630 mem_alloc[0].allocationSize = mem_reqs1.size;
20631 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
20632 mem_alloc[1].allocationSize = mem_reqs2.size;
20633 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
20634 if (!pass) {
20635 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20636 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20637 return;
20638 }
20639
20640 VkDeviceMemory mem1;
20641 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
20642 ASSERT_VK_SUCCESS(err);
20643 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
20644 ASSERT_VK_SUCCESS(err);
20645 VkDeviceMemory mem2;
20646 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
20647 ASSERT_VK_SUCCESS(err);
20648 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
20649 ASSERT_VK_SUCCESS(err);
20650 // Update descriptors
20651 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
20652 buff_info[0].buffer = dyub1;
20653 buff_info[0].offset = 0;
20654 buff_info[0].range = 256;
20655 buff_info[1].buffer = dyub1;
20656 buff_info[1].offset = 256;
20657 buff_info[1].range = 512;
20658 buff_info[2].buffer = dyub2;
20659 buff_info[2].offset = 0;
20660 buff_info[2].range = 512;
20661
20662 VkWriteDescriptorSet descriptor_write;
20663 memset(&descriptor_write, 0, sizeof(descriptor_write));
20664 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20665 descriptor_write.dstSet = descriptor_set;
20666 descriptor_write.dstBinding = 0;
20667 descriptor_write.descriptorCount = BINDING_COUNT;
20668 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20669 descriptor_write.pBufferInfo = buff_info;
20670
20671 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20672
Tony Barbour552f6c02016-12-21 14:34:07 -070020673 m_commandBuffer->BeginCommandBuffer();
20674 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070020675
20676 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020677 char const *vsSource =
20678 "#version 450\n"
20679 "\n"
20680 "out gl_PerVertex { \n"
20681 " vec4 gl_Position;\n"
20682 "};\n"
20683 "void main(){\n"
20684 " gl_Position = vec4(1);\n"
20685 "}\n";
20686 char const *fsSource =
20687 "#version 450\n"
20688 "\n"
20689 "layout(location=0) out vec4 x;\n"
20690 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
20691 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
20692 "void main(){\n"
20693 " x = vec4(bar1.y) + vec4(bar2.y);\n"
20694 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070020695 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20696 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20697 VkPipelineObj pipe(m_device);
20698 pipe.SetViewport(m_viewports);
20699 pipe.SetScissor(m_scissors);
20700 pipe.AddShader(&vs);
20701 pipe.AddShader(&fs);
20702 pipe.AddColorAttachment();
20703 pipe.CreateVKPipeline(pipeline_layout, renderPass());
20704
20705 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
20706 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
20707 // we used to have a bug in this case.
20708 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
20709 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
20710 &descriptor_set, BINDING_COUNT, dyn_off);
20711 Draw(1, 0, 0, 0);
20712 m_errorMonitor->VerifyNotFound();
20713
20714 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20715 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20716 vkFreeMemory(m_device->device(), mem1, NULL);
20717 vkFreeMemory(m_device->device(), mem2, NULL);
20718
20719 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20720 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20721 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20722}
20723
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020724TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020725 TEST_DESCRIPTION(
20726 "Ensure that validations handling of non-coherent memory "
20727 "mapping while using VK_WHOLE_SIZE does not cause access "
20728 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020729 VkResult err;
20730 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060020731 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020732
20733 VkDeviceMemory mem;
20734 VkMemoryRequirements mem_reqs;
20735 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020736 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020737 VkMemoryAllocateInfo alloc_info = {};
20738 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20739 alloc_info.pNext = NULL;
20740 alloc_info.memoryTypeIndex = 0;
20741
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020742 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020743 alloc_info.allocationSize = allocation_size;
20744
20745 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
20746 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 -070020747 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020748 if (!pass) {
20749 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020750 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
20751 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020752 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020753 pass = m_device->phy().set_memory_type(
20754 mem_reqs.memoryTypeBits, &alloc_info,
20755 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
20756 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020757 if (!pass) {
20758 return;
20759 }
20760 }
20761 }
20762
20763 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20764 ASSERT_VK_SUCCESS(err);
20765
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020766 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020767 m_errorMonitor->ExpectSuccess();
20768 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20769 ASSERT_VK_SUCCESS(err);
20770 VkMappedMemoryRange mmr = {};
20771 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20772 mmr.memory = mem;
20773 mmr.offset = 0;
20774 mmr.size = VK_WHOLE_SIZE;
20775 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20776 ASSERT_VK_SUCCESS(err);
20777 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20778 ASSERT_VK_SUCCESS(err);
20779 m_errorMonitor->VerifyNotFound();
20780 vkUnmapMemory(m_device->device(), mem);
20781
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020782 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020783 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020784 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020785 ASSERT_VK_SUCCESS(err);
20786 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20787 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020788 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020789 mmr.size = VK_WHOLE_SIZE;
20790 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20791 ASSERT_VK_SUCCESS(err);
20792 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20793 ASSERT_VK_SUCCESS(err);
20794 m_errorMonitor->VerifyNotFound();
20795 vkUnmapMemory(m_device->device(), mem);
20796
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020797 // Map with offset and size
20798 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020799 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020800 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020801 ASSERT_VK_SUCCESS(err);
20802 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20803 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020804 mmr.offset = 4 * atom_size;
20805 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020806 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20807 ASSERT_VK_SUCCESS(err);
20808 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20809 ASSERT_VK_SUCCESS(err);
20810 m_errorMonitor->VerifyNotFound();
20811 vkUnmapMemory(m_device->device(), mem);
20812
20813 // Map without offset and flush WHOLE_SIZE with two separate offsets
20814 m_errorMonitor->ExpectSuccess();
20815 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20816 ASSERT_VK_SUCCESS(err);
20817 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20818 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020819 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020820 mmr.size = VK_WHOLE_SIZE;
20821 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20822 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020823 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020824 mmr.size = VK_WHOLE_SIZE;
20825 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20826 ASSERT_VK_SUCCESS(err);
20827 m_errorMonitor->VerifyNotFound();
20828 vkUnmapMemory(m_device->device(), mem);
20829
20830 vkFreeMemory(m_device->device(), mem, NULL);
20831}
20832
20833// This is a positive test. We used to expect error in this case but spec now allows it
20834TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
20835 m_errorMonitor->ExpectSuccess();
20836 vk_testing::Fence testFence;
20837 VkFenceCreateInfo fenceInfo = {};
20838 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20839 fenceInfo.pNext = NULL;
20840
Tony Barbour1fa09702017-03-16 12:09:08 -060020841 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020842 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020843 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020844 VkResult result = vkResetFences(m_device->device(), 1, fences);
20845 ASSERT_VK_SUCCESS(result);
20846
20847 m_errorMonitor->VerifyNotFound();
20848}
20849
20850TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
20851 m_errorMonitor->ExpectSuccess();
20852
Tony Barbour1fa09702017-03-16 12:09:08 -060020853 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020854 VkResult err;
20855
20856 // Record (empty!) command buffer that can be submitted multiple times
20857 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020858 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
20859 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020860 m_commandBuffer->BeginCommandBuffer(&cbbi);
20861 m_commandBuffer->EndCommandBuffer();
20862
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020863 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020864 VkFence fence;
20865 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20866 ASSERT_VK_SUCCESS(err);
20867
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020868 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020869 VkSemaphore s1, s2;
20870 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
20871 ASSERT_VK_SUCCESS(err);
20872 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
20873 ASSERT_VK_SUCCESS(err);
20874
20875 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020876 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020877 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20878 ASSERT_VK_SUCCESS(err);
20879
20880 // Submit CB again, signaling s2.
20881 si.pSignalSemaphores = &s2;
20882 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
20883 ASSERT_VK_SUCCESS(err);
20884
20885 // Wait for fence.
20886 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20887 ASSERT_VK_SUCCESS(err);
20888
20889 // CB is still in flight from second submission, but semaphore s1 is no
20890 // longer in flight. delete it.
20891 vkDestroySemaphore(m_device->device(), s1, nullptr);
20892
20893 m_errorMonitor->VerifyNotFound();
20894
20895 // Force device idle and clean up remaining objects
20896 vkDeviceWaitIdle(m_device->device());
20897 vkDestroySemaphore(m_device->device(), s2, nullptr);
20898 vkDestroyFence(m_device->device(), fence, nullptr);
20899}
20900
20901TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20902 m_errorMonitor->ExpectSuccess();
20903
Tony Barbour1fa09702017-03-16 12:09:08 -060020904 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020905 VkResult err;
20906
20907 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020908 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020909 VkFence f1;
20910 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20911 ASSERT_VK_SUCCESS(err);
20912
20913 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020914 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020915 VkFence f2;
20916 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20917 ASSERT_VK_SUCCESS(err);
20918
20919 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020920 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020921 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20922
20923 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020924 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020925 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20926
20927 // Should have both retired!
20928 vkDestroyFence(m_device->device(), f1, nullptr);
20929 vkDestroyFence(m_device->device(), f2, nullptr);
20930
20931 m_errorMonitor->VerifyNotFound();
20932}
20933
20934TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020935 TEST_DESCRIPTION(
20936 "Verify that creating an image view from an image with valid usage "
20937 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020938
Tony Barbour1fa09702017-03-16 12:09:08 -060020939 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020940
20941 m_errorMonitor->ExpectSuccess();
20942 // Verify that we can create a view with usage INPUT_ATTACHMENT
20943 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020944 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 -060020945 ASSERT_TRUE(image.initialized());
20946 VkImageView imageView;
20947 VkImageViewCreateInfo ivci = {};
20948 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20949 ivci.image = image.handle();
20950 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20951 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20952 ivci.subresourceRange.layerCount = 1;
20953 ivci.subresourceRange.baseMipLevel = 0;
20954 ivci.subresourceRange.levelCount = 1;
20955 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20956
20957 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20958 m_errorMonitor->VerifyNotFound();
20959 vkDestroyImageView(m_device->device(), imageView, NULL);
20960}
20961
20962// This is a positive test. No failures are expected.
20963TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020964 TEST_DESCRIPTION(
20965 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20966 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020967
Tony Barbour1fa09702017-03-16 12:09:08 -060020968 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020969
20970 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020971 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020972 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020973
20974 m_errorMonitor->ExpectSuccess();
20975
20976 VkImage image;
20977 VkImageCreateInfo image_create_info = {};
20978 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20979 image_create_info.pNext = NULL;
20980 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20981 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20982 image_create_info.extent.width = 64;
20983 image_create_info.extent.height = 64;
20984 image_create_info.extent.depth = 1;
20985 image_create_info.mipLevels = 1;
20986 image_create_info.arrayLayers = 1;
20987 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20988 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20989 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20990 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20991 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20992 ASSERT_VK_SUCCESS(err);
20993
20994 VkMemoryRequirements memory_reqs;
20995 VkDeviceMemory memory_one, memory_two;
20996 bool pass;
20997 VkMemoryAllocateInfo memory_info = {};
20998 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20999 memory_info.pNext = NULL;
21000 memory_info.allocationSize = 0;
21001 memory_info.memoryTypeIndex = 0;
21002 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
21003 // Find an image big enough to allow sparse mapping of 2 memory regions
21004 // Increase the image size until it is at least twice the
21005 // size of the required alignment, to ensure we can bind both
21006 // allocated memory blocks to the image on aligned offsets.
21007 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
21008 vkDestroyImage(m_device->device(), image, nullptr);
21009 image_create_info.extent.width *= 2;
21010 image_create_info.extent.height *= 2;
21011 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
21012 ASSERT_VK_SUCCESS(err);
21013 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
21014 }
21015 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
21016 // at the end of the first
21017 memory_info.allocationSize = memory_reqs.alignment;
21018 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
21019 ASSERT_TRUE(pass);
21020 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
21021 ASSERT_VK_SUCCESS(err);
21022 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
21023 ASSERT_VK_SUCCESS(err);
21024 VkSparseMemoryBind binds[2];
21025 binds[0].flags = 0;
21026 binds[0].memory = memory_one;
21027 binds[0].memoryOffset = 0;
21028 binds[0].resourceOffset = 0;
21029 binds[0].size = memory_info.allocationSize;
21030 binds[1].flags = 0;
21031 binds[1].memory = memory_two;
21032 binds[1].memoryOffset = 0;
21033 binds[1].resourceOffset = memory_info.allocationSize;
21034 binds[1].size = memory_info.allocationSize;
21035
21036 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
21037 opaqueBindInfo.image = image;
21038 opaqueBindInfo.bindCount = 2;
21039 opaqueBindInfo.pBinds = binds;
21040
21041 VkFence fence = VK_NULL_HANDLE;
21042 VkBindSparseInfo bindSparseInfo = {};
21043 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
21044 bindSparseInfo.imageOpaqueBindCount = 1;
21045 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
21046
21047 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
21048 vkQueueWaitIdle(m_device->m_queue);
21049 vkDestroyImage(m_device->device(), image, NULL);
21050 vkFreeMemory(m_device->device(), memory_one, NULL);
21051 vkFreeMemory(m_device->device(), memory_two, NULL);
21052 m_errorMonitor->VerifyNotFound();
21053}
21054
21055TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021056 TEST_DESCRIPTION(
21057 "Ensure that CmdBeginRenderPass with an attachment's "
21058 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
21059 "the command buffer has prior knowledge of that "
21060 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021061
21062 m_errorMonitor->ExpectSuccess();
21063
Tony Barbour1fa09702017-03-16 12:09:08 -060021064 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021065
21066 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021067 VkAttachmentDescription attachment = {0,
21068 VK_FORMAT_R8G8B8A8_UNORM,
21069 VK_SAMPLE_COUNT_1_BIT,
21070 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21071 VK_ATTACHMENT_STORE_OP_STORE,
21072 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21073 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21074 VK_IMAGE_LAYOUT_UNDEFINED,
21075 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021076
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021077 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021078
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021079 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021080
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021081 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021082
21083 VkRenderPass rp;
21084 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21085 ASSERT_VK_SUCCESS(err);
21086
21087 // A compatible framebuffer.
21088 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021089 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 -060021090 ASSERT_TRUE(image.initialized());
21091
21092 VkImageViewCreateInfo ivci = {
21093 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21094 nullptr,
21095 0,
21096 image.handle(),
21097 VK_IMAGE_VIEW_TYPE_2D,
21098 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021099 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21100 VK_COMPONENT_SWIZZLE_IDENTITY},
21101 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021102 };
21103 VkImageView view;
21104 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21105 ASSERT_VK_SUCCESS(err);
21106
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021107 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021108 VkFramebuffer fb;
21109 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21110 ASSERT_VK_SUCCESS(err);
21111
21112 // Record a single command buffer which uses this renderpass twice. The
21113 // bug is triggered at the beginning of the second renderpass, when the
21114 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021115 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 -070021116 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021117 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21118 vkCmdEndRenderPass(m_commandBuffer->handle());
21119 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21120
21121 m_errorMonitor->VerifyNotFound();
21122
21123 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070021124 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021125
21126 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21127 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21128 vkDestroyImageView(m_device->device(), view, nullptr);
21129}
21130
21131TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021132 TEST_DESCRIPTION(
21133 "This test should pass. Create a Framebuffer and "
21134 "command buffer, bind them together, then destroy "
21135 "command pool and framebuffer and verify there are no "
21136 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021137
21138 m_errorMonitor->ExpectSuccess();
21139
Tony Barbour1fa09702017-03-16 12:09:08 -060021140 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021141
21142 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021143 VkAttachmentDescription attachment = {0,
21144 VK_FORMAT_R8G8B8A8_UNORM,
21145 VK_SAMPLE_COUNT_1_BIT,
21146 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21147 VK_ATTACHMENT_STORE_OP_STORE,
21148 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21149 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21150 VK_IMAGE_LAYOUT_UNDEFINED,
21151 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021152
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021153 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021154
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021155 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021156
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021157 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021158
21159 VkRenderPass rp;
21160 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21161 ASSERT_VK_SUCCESS(err);
21162
21163 // A compatible framebuffer.
21164 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021165 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 -060021166 ASSERT_TRUE(image.initialized());
21167
21168 VkImageViewCreateInfo ivci = {
21169 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21170 nullptr,
21171 0,
21172 image.handle(),
21173 VK_IMAGE_VIEW_TYPE_2D,
21174 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021175 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21176 VK_COMPONENT_SWIZZLE_IDENTITY},
21177 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021178 };
21179 VkImageView view;
21180 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21181 ASSERT_VK_SUCCESS(err);
21182
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021183 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021184 VkFramebuffer fb;
21185 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21186 ASSERT_VK_SUCCESS(err);
21187
21188 // Explicitly create a command buffer to bind the FB to so that we can then
21189 // destroy the command pool in order to implicitly free command buffer
21190 VkCommandPool command_pool;
21191 VkCommandPoolCreateInfo pool_create_info{};
21192 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21193 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21194 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21195 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21196
21197 VkCommandBuffer command_buffer;
21198 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21199 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21200 command_buffer_allocate_info.commandPool = command_pool;
21201 command_buffer_allocate_info.commandBufferCount = 1;
21202 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21203 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21204
21205 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021206 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 -060021207 VkCommandBufferBeginInfo begin_info{};
21208 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21209 vkBeginCommandBuffer(command_buffer, &begin_info);
21210
21211 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21212 vkCmdEndRenderPass(command_buffer);
21213 vkEndCommandBuffer(command_buffer);
21214 vkDestroyImageView(m_device->device(), view, nullptr);
21215 // Destroy command pool to implicitly free command buffer
21216 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21217 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21218 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21219 m_errorMonitor->VerifyNotFound();
21220}
21221
21222TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021223 TEST_DESCRIPTION(
21224 "Ensure that CmdBeginRenderPass applies the layout "
21225 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021226
21227 m_errorMonitor->ExpectSuccess();
21228
Tony Barbour1fa09702017-03-16 12:09:08 -060021229 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021230
21231 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021232 VkAttachmentDescription attachment = {0,
21233 VK_FORMAT_R8G8B8A8_UNORM,
21234 VK_SAMPLE_COUNT_1_BIT,
21235 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21236 VK_ATTACHMENT_STORE_OP_STORE,
21237 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21238 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21239 VK_IMAGE_LAYOUT_UNDEFINED,
21240 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021241
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021242 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021243
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021244 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021245
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021246 VkSubpassDependency dep = {0,
21247 0,
21248 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21249 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21250 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21251 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21252 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021253
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021254 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021255
21256 VkResult err;
21257 VkRenderPass rp;
21258 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21259 ASSERT_VK_SUCCESS(err);
21260
21261 // A compatible framebuffer.
21262 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021263 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 -060021264 ASSERT_TRUE(image.initialized());
21265
21266 VkImageViewCreateInfo ivci = {
21267 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21268 nullptr,
21269 0,
21270 image.handle(),
21271 VK_IMAGE_VIEW_TYPE_2D,
21272 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021273 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21274 VK_COMPONENT_SWIZZLE_IDENTITY},
21275 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021276 };
21277 VkImageView view;
21278 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21279 ASSERT_VK_SUCCESS(err);
21280
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021281 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021282 VkFramebuffer fb;
21283 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21284 ASSERT_VK_SUCCESS(err);
21285
21286 // Record a single command buffer which issues a pipeline barrier w/
21287 // image memory barrier for the attachment. This detects the previously
21288 // missing tracking of the subpass layout by throwing a validation error
21289 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021290 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 -070021291 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021292 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21293
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021294 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
21295 nullptr,
21296 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21297 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21298 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21299 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21300 VK_QUEUE_FAMILY_IGNORED,
21301 VK_QUEUE_FAMILY_IGNORED,
21302 image.handle(),
21303 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021304 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021305 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21306 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021307
21308 vkCmdEndRenderPass(m_commandBuffer->handle());
21309 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021310 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021311
21312 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21313 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21314 vkDestroyImageView(m_device->device(), view, nullptr);
21315}
21316
21317TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021318 TEST_DESCRIPTION(
21319 "Validate that when an imageView of a depth/stencil image "
21320 "is used as a depth/stencil framebuffer attachment, the "
21321 "aspectMask is ignored and both depth and stencil image "
21322 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021323
Tony Barbour1fa09702017-03-16 12:09:08 -060021324 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021325 VkFormatProperties format_properties;
21326 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
21327 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
21328 return;
21329 }
21330
21331 m_errorMonitor->ExpectSuccess();
21332
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021333 VkAttachmentDescription attachment = {0,
21334 VK_FORMAT_D32_SFLOAT_S8_UINT,
21335 VK_SAMPLE_COUNT_1_BIT,
21336 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21337 VK_ATTACHMENT_STORE_OP_STORE,
21338 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21339 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21340 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
21341 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021342
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021343 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021344
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021345 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021346
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021347 VkSubpassDependency dep = {0,
21348 0,
21349 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21350 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21351 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21352 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21353 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021354
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021355 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021356
21357 VkResult err;
21358 VkRenderPass rp;
21359 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21360 ASSERT_VK_SUCCESS(err);
21361
21362 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021363 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
21364 0x26, // usage
21365 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021366 ASSERT_TRUE(image.initialized());
21367 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
21368
21369 VkImageViewCreateInfo ivci = {
21370 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21371 nullptr,
21372 0,
21373 image.handle(),
21374 VK_IMAGE_VIEW_TYPE_2D,
21375 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021376 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
21377 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021378 };
21379 VkImageView view;
21380 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21381 ASSERT_VK_SUCCESS(err);
21382
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021383 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021384 VkFramebuffer fb;
21385 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21386 ASSERT_VK_SUCCESS(err);
21387
Tony Barbour552f6c02016-12-21 14:34:07 -070021388 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021389
21390 VkImageMemoryBarrier imb = {};
21391 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21392 imb.pNext = nullptr;
21393 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21394 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21395 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21396 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
21397 imb.srcQueueFamilyIndex = 0;
21398 imb.dstQueueFamilyIndex = 0;
21399 imb.image = image.handle();
21400 imb.subresourceRange.aspectMask = 0x6;
21401 imb.subresourceRange.baseMipLevel = 0;
21402 imb.subresourceRange.levelCount = 0x1;
21403 imb.subresourceRange.baseArrayLayer = 0;
21404 imb.subresourceRange.layerCount = 0x1;
21405
21406 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021407 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21408 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021409
Tony Barbour552f6c02016-12-21 14:34:07 -070021410 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021411 QueueCommandBuffer(false);
21412 m_errorMonitor->VerifyNotFound();
21413
21414 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21415 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21416 vkDestroyImageView(m_device->device(), view, nullptr);
21417}
21418
21419TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021420 TEST_DESCRIPTION(
21421 "Ensure that layout transitions work correctly without "
21422 "errors, when an attachment reference is "
21423 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021424
21425 m_errorMonitor->ExpectSuccess();
21426
Tony Barbour1fa09702017-03-16 12:09:08 -060021427 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021428
21429 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021430 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021431
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021432 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021433
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021434 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021435
21436 VkRenderPass rp;
21437 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21438 ASSERT_VK_SUCCESS(err);
21439
21440 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021441 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021442 VkFramebuffer fb;
21443 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21444 ASSERT_VK_SUCCESS(err);
21445
21446 // Record a command buffer which just begins and ends the renderpass. The
21447 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021448 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 -070021449 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021450 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21451 vkCmdEndRenderPass(m_commandBuffer->handle());
21452 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021453 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021454
21455 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21456 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21457}
21458
21459// This is a positive test. No errors are expected.
21460TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021461 TEST_DESCRIPTION(
21462 "Create a stencil-only attachment with a LOAD_OP set to "
21463 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021464 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060021465 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021466 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021467 if (!depth_format) {
21468 printf(" No Depth + Stencil format found. Skipped.\n");
21469 return;
21470 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021471 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070021472 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021473 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
21474 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021475 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
21476 return;
21477 }
21478
Tony Barbourf887b162017-03-09 10:06:46 -070021479 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021480 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021481 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021482 VkAttachmentDescription att = {};
21483 VkAttachmentReference ref = {};
21484 att.format = depth_stencil_fmt;
21485 att.samples = VK_SAMPLE_COUNT_1_BIT;
21486 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
21487 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21488 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21489 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
21490 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21491 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21492
21493 VkClearValue clear;
21494 clear.depthStencil.depth = 1.0;
21495 clear.depthStencil.stencil = 0;
21496 ref.attachment = 0;
21497 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21498
21499 VkSubpassDescription subpass = {};
21500 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
21501 subpass.flags = 0;
21502 subpass.inputAttachmentCount = 0;
21503 subpass.pInputAttachments = NULL;
21504 subpass.colorAttachmentCount = 0;
21505 subpass.pColorAttachments = NULL;
21506 subpass.pResolveAttachments = NULL;
21507 subpass.pDepthStencilAttachment = &ref;
21508 subpass.preserveAttachmentCount = 0;
21509 subpass.pPreserveAttachments = NULL;
21510
21511 VkRenderPass rp;
21512 VkRenderPassCreateInfo rp_info = {};
21513 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21514 rp_info.attachmentCount = 1;
21515 rp_info.pAttachments = &att;
21516 rp_info.subpassCount = 1;
21517 rp_info.pSubpasses = &subpass;
21518 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
21519 ASSERT_VK_SUCCESS(result);
21520
21521 VkImageView *depthView = m_depthStencil->BindInfo();
21522 VkFramebufferCreateInfo fb_info = {};
21523 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
21524 fb_info.pNext = NULL;
21525 fb_info.renderPass = rp;
21526 fb_info.attachmentCount = 1;
21527 fb_info.pAttachments = depthView;
21528 fb_info.width = 100;
21529 fb_info.height = 100;
21530 fb_info.layers = 1;
21531 VkFramebuffer fb;
21532 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
21533 ASSERT_VK_SUCCESS(result);
21534
21535 VkRenderPassBeginInfo rpbinfo = {};
21536 rpbinfo.clearValueCount = 1;
21537 rpbinfo.pClearValues = &clear;
21538 rpbinfo.pNext = NULL;
21539 rpbinfo.renderPass = rp;
21540 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
21541 rpbinfo.renderArea.extent.width = 100;
21542 rpbinfo.renderArea.extent.height = 100;
21543 rpbinfo.renderArea.offset.x = 0;
21544 rpbinfo.renderArea.offset.y = 0;
21545 rpbinfo.framebuffer = fb;
21546
21547 VkFence fence = {};
21548 VkFenceCreateInfo fence_ci = {};
21549 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21550 fence_ci.pNext = nullptr;
21551 fence_ci.flags = 0;
21552 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
21553 ASSERT_VK_SUCCESS(result);
21554
21555 m_commandBuffer->BeginCommandBuffer();
21556 m_commandBuffer->BeginRenderPass(rpbinfo);
21557 m_commandBuffer->EndRenderPass();
21558 m_commandBuffer->EndCommandBuffer();
21559 m_commandBuffer->QueueCommandBuffer(fence);
21560
21561 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021562 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 -070021563 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021564 VkImageMemoryBarrier barrier = {};
21565 VkImageSubresourceRange range;
21566 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21567 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21568 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
21569 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21570 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
21571 barrier.image = m_depthStencil->handle();
21572 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21573 range.baseMipLevel = 0;
21574 range.levelCount = 1;
21575 range.baseArrayLayer = 0;
21576 range.layerCount = 1;
21577 barrier.subresourceRange = range;
21578 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21579 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
21580 cmdbuf.BeginCommandBuffer();
21581 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 -070021582 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021583 barrier.srcAccessMask = 0;
21584 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
21585 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
21586 barrier.image = destImage.handle();
21587 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21588 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 -070021589 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021590 VkImageCopy cregion;
21591 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21592 cregion.srcSubresource.mipLevel = 0;
21593 cregion.srcSubresource.baseArrayLayer = 0;
21594 cregion.srcSubresource.layerCount = 1;
21595 cregion.srcOffset.x = 0;
21596 cregion.srcOffset.y = 0;
21597 cregion.srcOffset.z = 0;
21598 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21599 cregion.dstSubresource.mipLevel = 0;
21600 cregion.dstSubresource.baseArrayLayer = 0;
21601 cregion.dstSubresource.layerCount = 1;
21602 cregion.dstOffset.x = 0;
21603 cregion.dstOffset.y = 0;
21604 cregion.dstOffset.z = 0;
21605 cregion.extent.width = 100;
21606 cregion.extent.height = 100;
21607 cregion.extent.depth = 1;
21608 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021609 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021610 cmdbuf.EndCommandBuffer();
21611
21612 VkSubmitInfo submit_info;
21613 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21614 submit_info.pNext = NULL;
21615 submit_info.waitSemaphoreCount = 0;
21616 submit_info.pWaitSemaphores = NULL;
21617 submit_info.pWaitDstStageMask = NULL;
21618 submit_info.commandBufferCount = 1;
21619 submit_info.pCommandBuffers = &cmdbuf.handle();
21620 submit_info.signalSemaphoreCount = 0;
21621 submit_info.pSignalSemaphores = NULL;
21622
21623 m_errorMonitor->ExpectSuccess();
21624 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21625 m_errorMonitor->VerifyNotFound();
21626
21627 vkQueueWaitIdle(m_device->m_queue);
21628 vkDestroyFence(m_device->device(), fence, nullptr);
21629 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21630 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21631}
21632
21633// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070021634TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
21635 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
21636
21637 m_errorMonitor->ExpectSuccess();
21638
Tony Barbour1fa09702017-03-16 12:09:08 -060021639 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021640 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060021641 if (!depth_format) {
21642 printf(" No Depth + Stencil format found. Skipped.\n");
21643 return;
21644 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070021645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21646
21647 VkImageMemoryBarrier img_barrier = {};
21648 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21649 img_barrier.pNext = NULL;
21650 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
21651 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21652 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21653 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21654 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21655 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21656 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
21657 img_barrier.subresourceRange.baseArrayLayer = 0;
21658 img_barrier.subresourceRange.baseMipLevel = 0;
21659 img_barrier.subresourceRange.layerCount = 1;
21660 img_barrier.subresourceRange.levelCount = 1;
21661
21662 {
21663 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021664 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 -070021665 ASSERT_TRUE(img_color.initialized());
21666
21667 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021668 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 -070021669 ASSERT_TRUE(img_ds1.initialized());
21670
21671 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021672 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 -070021673 ASSERT_TRUE(img_ds2.initialized());
21674
21675 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021676 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 -070021677 ASSERT_TRUE(img_xfer_src.initialized());
21678
21679 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021680 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 -070021681 ASSERT_TRUE(img_xfer_dst.initialized());
21682
21683 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021684 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 -070021685 ASSERT_TRUE(img_sampled.initialized());
21686
21687 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021688 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 -070021689 ASSERT_TRUE(img_input.initialized());
21690
21691 const struct {
21692 VkImageObj &image_obj;
21693 VkImageLayout old_layout;
21694 VkImageLayout new_layout;
21695 } buffer_layouts[] = {
21696 // clang-format off
21697 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21698 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21699 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21700 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21701 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21702 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21703 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21704 // clang-format on
21705 };
21706 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
21707
21708 m_commandBuffer->BeginCommandBuffer();
21709 for (uint32_t i = 0; i < layout_count; ++i) {
21710 img_barrier.image = buffer_layouts[i].image_obj.handle();
21711 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
21712 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
21713 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
21714 : VK_IMAGE_ASPECT_COLOR_BIT;
21715
21716 img_barrier.oldLayout = buffer_layouts[i].old_layout;
21717 img_barrier.newLayout = buffer_layouts[i].new_layout;
21718 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21719 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21720
21721 img_barrier.oldLayout = buffer_layouts[i].new_layout;
21722 img_barrier.newLayout = buffer_layouts[i].old_layout;
21723 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21724 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21725 }
21726 m_commandBuffer->EndCommandBuffer();
21727
21728 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
21729 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
21730 }
21731 m_errorMonitor->VerifyNotFound();
21732}
21733
21734// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021735TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
21736 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
21737
21738 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021739 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021740
21741 VkEvent event;
21742 VkEventCreateInfo event_create_info{};
21743 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21744 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21745
21746 VkCommandPool command_pool;
21747 VkCommandPoolCreateInfo pool_create_info{};
21748 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21749 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21750 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21751 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21752
21753 VkCommandBuffer command_buffer;
21754 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21755 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21756 command_buffer_allocate_info.commandPool = command_pool;
21757 command_buffer_allocate_info.commandBufferCount = 1;
21758 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21759 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21760
21761 VkQueue queue = VK_NULL_HANDLE;
21762 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21763
21764 {
21765 VkCommandBufferBeginInfo begin_info{};
21766 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21767 vkBeginCommandBuffer(command_buffer, &begin_info);
21768
21769 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 -070021770 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021771 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
21772 vkEndCommandBuffer(command_buffer);
21773 }
21774 {
21775 VkSubmitInfo submit_info{};
21776 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21777 submit_info.commandBufferCount = 1;
21778 submit_info.pCommandBuffers = &command_buffer;
21779 submit_info.signalSemaphoreCount = 0;
21780 submit_info.pSignalSemaphores = nullptr;
21781 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21782 }
21783 { vkSetEvent(m_device->device(), event); }
21784
21785 vkQueueWaitIdle(queue);
21786
21787 vkDestroyEvent(m_device->device(), event, nullptr);
21788 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21789 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21790
21791 m_errorMonitor->VerifyNotFound();
21792}
21793// This is a positive test. No errors should be generated.
21794TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
21795 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
21796
Tony Barbour1fa09702017-03-16 12:09:08 -060021797 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021798 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021799
21800 m_errorMonitor->ExpectSuccess();
21801
21802 VkQueryPool query_pool;
21803 VkQueryPoolCreateInfo query_pool_create_info{};
21804 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21805 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21806 query_pool_create_info.queryCount = 1;
21807 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21808
21809 VkCommandPool command_pool;
21810 VkCommandPoolCreateInfo pool_create_info{};
21811 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21812 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21813 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21814 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21815
21816 VkCommandBuffer command_buffer;
21817 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21818 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21819 command_buffer_allocate_info.commandPool = command_pool;
21820 command_buffer_allocate_info.commandBufferCount = 1;
21821 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21822 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21823
21824 VkCommandBuffer secondary_command_buffer;
21825 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
21826 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
21827
21828 VkQueue queue = VK_NULL_HANDLE;
21829 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21830
21831 uint32_t qfi = 0;
21832 VkBufferCreateInfo buff_create_info = {};
21833 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21834 buff_create_info.size = 1024;
21835 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21836 buff_create_info.queueFamilyIndexCount = 1;
21837 buff_create_info.pQueueFamilyIndices = &qfi;
21838
21839 VkResult err;
21840 VkBuffer buffer;
21841 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21842 ASSERT_VK_SUCCESS(err);
21843 VkMemoryAllocateInfo mem_alloc = {};
21844 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21845 mem_alloc.pNext = NULL;
21846 mem_alloc.allocationSize = 1024;
21847 mem_alloc.memoryTypeIndex = 0;
21848
21849 VkMemoryRequirements memReqs;
21850 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21851 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21852 if (!pass) {
21853 vkDestroyBuffer(m_device->device(), buffer, NULL);
21854 return;
21855 }
21856
21857 VkDeviceMemory mem;
21858 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21859 ASSERT_VK_SUCCESS(err);
21860 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21861 ASSERT_VK_SUCCESS(err);
21862
21863 VkCommandBufferInheritanceInfo hinfo = {};
21864 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
21865 hinfo.renderPass = VK_NULL_HANDLE;
21866 hinfo.subpass = 0;
21867 hinfo.framebuffer = VK_NULL_HANDLE;
21868 hinfo.occlusionQueryEnable = VK_FALSE;
21869 hinfo.queryFlags = 0;
21870 hinfo.pipelineStatistics = 0;
21871
21872 {
21873 VkCommandBufferBeginInfo begin_info{};
21874 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21875 begin_info.pInheritanceInfo = &hinfo;
21876 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
21877
21878 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
21879 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21880
21881 vkEndCommandBuffer(secondary_command_buffer);
21882
21883 begin_info.pInheritanceInfo = nullptr;
21884 vkBeginCommandBuffer(command_buffer, &begin_info);
21885
21886 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
21887 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
21888
21889 vkEndCommandBuffer(command_buffer);
21890 }
21891 {
21892 VkSubmitInfo submit_info{};
21893 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21894 submit_info.commandBufferCount = 1;
21895 submit_info.pCommandBuffers = &command_buffer;
21896 submit_info.signalSemaphoreCount = 0;
21897 submit_info.pSignalSemaphores = nullptr;
21898 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21899 }
21900
21901 vkQueueWaitIdle(queue);
21902
21903 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21904 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21905 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21906 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21907 vkDestroyBuffer(m_device->device(), buffer, NULL);
21908 vkFreeMemory(m_device->device(), mem, NULL);
21909
21910 m_errorMonitor->VerifyNotFound();
21911}
21912
21913// This is a positive test. No errors should be generated.
21914TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21915 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21916
Tony Barbour1fa09702017-03-16 12:09:08 -060021917 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021918 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021919
21920 m_errorMonitor->ExpectSuccess();
21921
21922 VkQueryPool query_pool;
21923 VkQueryPoolCreateInfo query_pool_create_info{};
21924 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21925 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21926 query_pool_create_info.queryCount = 1;
21927 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21928
21929 VkCommandPool command_pool;
21930 VkCommandPoolCreateInfo pool_create_info{};
21931 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21932 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21933 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21934 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21935
21936 VkCommandBuffer command_buffer[2];
21937 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21938 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21939 command_buffer_allocate_info.commandPool = command_pool;
21940 command_buffer_allocate_info.commandBufferCount = 2;
21941 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21942 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21943
21944 VkQueue queue = VK_NULL_HANDLE;
21945 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21946
21947 uint32_t qfi = 0;
21948 VkBufferCreateInfo buff_create_info = {};
21949 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21950 buff_create_info.size = 1024;
21951 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21952 buff_create_info.queueFamilyIndexCount = 1;
21953 buff_create_info.pQueueFamilyIndices = &qfi;
21954
21955 VkResult err;
21956 VkBuffer buffer;
21957 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21958 ASSERT_VK_SUCCESS(err);
21959 VkMemoryAllocateInfo mem_alloc = {};
21960 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21961 mem_alloc.pNext = NULL;
21962 mem_alloc.allocationSize = 1024;
21963 mem_alloc.memoryTypeIndex = 0;
21964
21965 VkMemoryRequirements memReqs;
21966 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21967 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21968 if (!pass) {
21969 vkDestroyBuffer(m_device->device(), buffer, NULL);
21970 return;
21971 }
21972
21973 VkDeviceMemory mem;
21974 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21975 ASSERT_VK_SUCCESS(err);
21976 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21977 ASSERT_VK_SUCCESS(err);
21978
21979 {
21980 VkCommandBufferBeginInfo begin_info{};
21981 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21982 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21983
21984 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21985 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21986
21987 vkEndCommandBuffer(command_buffer[0]);
21988
21989 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21990
21991 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21992
21993 vkEndCommandBuffer(command_buffer[1]);
21994 }
21995 {
21996 VkSubmitInfo submit_info{};
21997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21998 submit_info.commandBufferCount = 2;
21999 submit_info.pCommandBuffers = command_buffer;
22000 submit_info.signalSemaphoreCount = 0;
22001 submit_info.pSignalSemaphores = nullptr;
22002 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22003 }
22004
22005 vkQueueWaitIdle(queue);
22006
22007 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
22008 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
22009 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22010 vkDestroyBuffer(m_device->device(), buffer, NULL);
22011 vkFreeMemory(m_device->device(), mem, NULL);
22012
22013 m_errorMonitor->VerifyNotFound();
22014}
22015
Tony Barbourc46924f2016-11-04 11:49:52 -060022016TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022017 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
22018
Tony Barbour1fa09702017-03-16 12:09:08 -060022019 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022020 VkEvent event;
22021 VkEventCreateInfo event_create_info{};
22022 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
22023 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
22024
22025 VkCommandPool command_pool;
22026 VkCommandPoolCreateInfo pool_create_info{};
22027 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22028 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22029 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22030 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22031
22032 VkCommandBuffer command_buffer;
22033 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22034 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22035 command_buffer_allocate_info.commandPool = command_pool;
22036 command_buffer_allocate_info.commandBufferCount = 1;
22037 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22038 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
22039
22040 VkQueue queue = VK_NULL_HANDLE;
22041 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
22042
22043 {
22044 VkCommandBufferBeginInfo begin_info{};
22045 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22046 vkBeginCommandBuffer(command_buffer, &begin_info);
22047
22048 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022049 vkEndCommandBuffer(command_buffer);
22050 }
22051 {
22052 VkSubmitInfo submit_info{};
22053 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22054 submit_info.commandBufferCount = 1;
22055 submit_info.pCommandBuffers = &command_buffer;
22056 submit_info.signalSemaphoreCount = 0;
22057 submit_info.pSignalSemaphores = nullptr;
22058 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22059 }
22060 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
22062 "that is already in use by a "
22063 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022064 vkSetEvent(m_device->device(), event);
22065 m_errorMonitor->VerifyFound();
22066 }
22067
22068 vkQueueWaitIdle(queue);
22069
22070 vkDestroyEvent(m_device->device(), event, nullptr);
22071 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
22072 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22073}
22074
22075// This is a positive test. No errors should be generated.
22076TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022077 TEST_DESCRIPTION(
22078 "Two command buffers with two separate fences are each "
22079 "run through a Submit & WaitForFences cycle 3 times. This "
22080 "previously revealed a bug so running this positive test "
22081 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022082 m_errorMonitor->ExpectSuccess();
22083
Tony Barbour1fa09702017-03-16 12:09:08 -060022084 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022085 VkQueue queue = VK_NULL_HANDLE;
22086 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
22087
22088 static const uint32_t NUM_OBJECTS = 2;
22089 static const uint32_t NUM_FRAMES = 3;
22090 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
22091 VkFence fences[NUM_OBJECTS] = {};
22092
22093 VkCommandPool cmd_pool;
22094 VkCommandPoolCreateInfo cmd_pool_ci = {};
22095 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22096 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
22097 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22098 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
22099 ASSERT_VK_SUCCESS(err);
22100
22101 VkCommandBufferAllocateInfo cmd_buf_info = {};
22102 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22103 cmd_buf_info.commandPool = cmd_pool;
22104 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22105 cmd_buf_info.commandBufferCount = 1;
22106
22107 VkFenceCreateInfo fence_ci = {};
22108 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22109 fence_ci.pNext = nullptr;
22110 fence_ci.flags = 0;
22111
22112 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22113 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
22114 ASSERT_VK_SUCCESS(err);
22115 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
22116 ASSERT_VK_SUCCESS(err);
22117 }
22118
22119 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
22120 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
22121 // Create empty cmd buffer
22122 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
22123 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22124
22125 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
22126 ASSERT_VK_SUCCESS(err);
22127 err = vkEndCommandBuffer(cmd_buffers[obj]);
22128 ASSERT_VK_SUCCESS(err);
22129
22130 VkSubmitInfo submit_info = {};
22131 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22132 submit_info.commandBufferCount = 1;
22133 submit_info.pCommandBuffers = &cmd_buffers[obj];
22134 // Submit cmd buffer and wait for fence
22135 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
22136 ASSERT_VK_SUCCESS(err);
22137 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
22138 ASSERT_VK_SUCCESS(err);
22139 err = vkResetFences(m_device->device(), 1, &fences[obj]);
22140 ASSERT_VK_SUCCESS(err);
22141 }
22142 }
22143 m_errorMonitor->VerifyNotFound();
22144 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
22145 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22146 vkDestroyFence(m_device->device(), fences[i], nullptr);
22147 }
22148}
22149// This is a positive test. No errors should be generated.
22150TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022151 TEST_DESCRIPTION(
22152 "Two command buffers, each in a separate QueueSubmit call "
22153 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022154
Tony Barbour1fa09702017-03-16 12:09:08 -060022155 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022156 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022157
22158 m_errorMonitor->ExpectSuccess();
22159
22160 VkSemaphore semaphore;
22161 VkSemaphoreCreateInfo semaphore_create_info{};
22162 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22163 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22164
22165 VkCommandPool command_pool;
22166 VkCommandPoolCreateInfo pool_create_info{};
22167 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22168 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22169 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22170 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22171
22172 VkCommandBuffer command_buffer[2];
22173 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22174 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22175 command_buffer_allocate_info.commandPool = command_pool;
22176 command_buffer_allocate_info.commandBufferCount = 2;
22177 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22178 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22179
22180 VkQueue queue = VK_NULL_HANDLE;
22181 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22182
22183 {
22184 VkCommandBufferBeginInfo begin_info{};
22185 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22186 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22187
22188 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 -070022189 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022190
22191 VkViewport viewport{};
22192 viewport.maxDepth = 1.0f;
22193 viewport.minDepth = 0.0f;
22194 viewport.width = 512;
22195 viewport.height = 512;
22196 viewport.x = 0;
22197 viewport.y = 0;
22198 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22199 vkEndCommandBuffer(command_buffer[0]);
22200 }
22201 {
22202 VkCommandBufferBeginInfo begin_info{};
22203 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22204 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22205
22206 VkViewport viewport{};
22207 viewport.maxDepth = 1.0f;
22208 viewport.minDepth = 0.0f;
22209 viewport.width = 512;
22210 viewport.height = 512;
22211 viewport.x = 0;
22212 viewport.y = 0;
22213 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22214 vkEndCommandBuffer(command_buffer[1]);
22215 }
22216 {
22217 VkSubmitInfo submit_info{};
22218 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22219 submit_info.commandBufferCount = 1;
22220 submit_info.pCommandBuffers = &command_buffer[0];
22221 submit_info.signalSemaphoreCount = 1;
22222 submit_info.pSignalSemaphores = &semaphore;
22223 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22224 }
22225 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022226 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022227 VkSubmitInfo submit_info{};
22228 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22229 submit_info.commandBufferCount = 1;
22230 submit_info.pCommandBuffers = &command_buffer[1];
22231 submit_info.waitSemaphoreCount = 1;
22232 submit_info.pWaitSemaphores = &semaphore;
22233 submit_info.pWaitDstStageMask = flags;
22234 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22235 }
22236
22237 vkQueueWaitIdle(m_device->m_queue);
22238
22239 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22240 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22241 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22242
22243 m_errorMonitor->VerifyNotFound();
22244}
22245
22246// This is a positive test. No errors should be generated.
22247TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022248 TEST_DESCRIPTION(
22249 "Two command buffers, each in a separate QueueSubmit call "
22250 "submitted on separate queues, the second having a fence"
22251 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022252
Tony Barbour1fa09702017-03-16 12:09:08 -060022253 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022254 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022255
22256 m_errorMonitor->ExpectSuccess();
22257
22258 VkFence fence;
22259 VkFenceCreateInfo fence_create_info{};
22260 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22261 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22262
22263 VkSemaphore semaphore;
22264 VkSemaphoreCreateInfo semaphore_create_info{};
22265 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22266 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22267
22268 VkCommandPool command_pool;
22269 VkCommandPoolCreateInfo pool_create_info{};
22270 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22271 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22272 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22273 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22274
22275 VkCommandBuffer command_buffer[2];
22276 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22277 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22278 command_buffer_allocate_info.commandPool = command_pool;
22279 command_buffer_allocate_info.commandBufferCount = 2;
22280 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22281 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22282
22283 VkQueue queue = VK_NULL_HANDLE;
22284 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22285
22286 {
22287 VkCommandBufferBeginInfo begin_info{};
22288 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22289 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22290
22291 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 -070022292 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022293
22294 VkViewport viewport{};
22295 viewport.maxDepth = 1.0f;
22296 viewport.minDepth = 0.0f;
22297 viewport.width = 512;
22298 viewport.height = 512;
22299 viewport.x = 0;
22300 viewport.y = 0;
22301 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22302 vkEndCommandBuffer(command_buffer[0]);
22303 }
22304 {
22305 VkCommandBufferBeginInfo begin_info{};
22306 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22307 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22308
22309 VkViewport viewport{};
22310 viewport.maxDepth = 1.0f;
22311 viewport.minDepth = 0.0f;
22312 viewport.width = 512;
22313 viewport.height = 512;
22314 viewport.x = 0;
22315 viewport.y = 0;
22316 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22317 vkEndCommandBuffer(command_buffer[1]);
22318 }
22319 {
22320 VkSubmitInfo submit_info{};
22321 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22322 submit_info.commandBufferCount = 1;
22323 submit_info.pCommandBuffers = &command_buffer[0];
22324 submit_info.signalSemaphoreCount = 1;
22325 submit_info.pSignalSemaphores = &semaphore;
22326 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22327 }
22328 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022329 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022330 VkSubmitInfo submit_info{};
22331 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22332 submit_info.commandBufferCount = 1;
22333 submit_info.pCommandBuffers = &command_buffer[1];
22334 submit_info.waitSemaphoreCount = 1;
22335 submit_info.pWaitSemaphores = &semaphore;
22336 submit_info.pWaitDstStageMask = flags;
22337 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22338 }
22339
22340 vkQueueWaitIdle(m_device->m_queue);
22341
22342 vkDestroyFence(m_device->device(), fence, nullptr);
22343 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22344 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22345 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22346
22347 m_errorMonitor->VerifyNotFound();
22348}
22349
22350// This is a positive test. No errors should be generated.
22351TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022352 TEST_DESCRIPTION(
22353 "Two command buffers, each in a separate QueueSubmit call "
22354 "submitted on separate queues, the second having a fence"
22355 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022356
Tony Barbour1fa09702017-03-16 12:09:08 -060022357 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022358 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022359
22360 m_errorMonitor->ExpectSuccess();
22361
22362 VkFence fence;
22363 VkFenceCreateInfo fence_create_info{};
22364 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22365 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22366
22367 VkSemaphore semaphore;
22368 VkSemaphoreCreateInfo semaphore_create_info{};
22369 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22370 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22371
22372 VkCommandPool command_pool;
22373 VkCommandPoolCreateInfo pool_create_info{};
22374 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22375 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22376 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22377 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22378
22379 VkCommandBuffer command_buffer[2];
22380 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22381 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22382 command_buffer_allocate_info.commandPool = command_pool;
22383 command_buffer_allocate_info.commandBufferCount = 2;
22384 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22385 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22386
22387 VkQueue queue = VK_NULL_HANDLE;
22388 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22389
22390 {
22391 VkCommandBufferBeginInfo begin_info{};
22392 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22393 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22394
22395 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 -070022396 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022397
22398 VkViewport viewport{};
22399 viewport.maxDepth = 1.0f;
22400 viewport.minDepth = 0.0f;
22401 viewport.width = 512;
22402 viewport.height = 512;
22403 viewport.x = 0;
22404 viewport.y = 0;
22405 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22406 vkEndCommandBuffer(command_buffer[0]);
22407 }
22408 {
22409 VkCommandBufferBeginInfo begin_info{};
22410 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22411 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22412
22413 VkViewport viewport{};
22414 viewport.maxDepth = 1.0f;
22415 viewport.minDepth = 0.0f;
22416 viewport.width = 512;
22417 viewport.height = 512;
22418 viewport.x = 0;
22419 viewport.y = 0;
22420 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22421 vkEndCommandBuffer(command_buffer[1]);
22422 }
22423 {
22424 VkSubmitInfo submit_info{};
22425 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22426 submit_info.commandBufferCount = 1;
22427 submit_info.pCommandBuffers = &command_buffer[0];
22428 submit_info.signalSemaphoreCount = 1;
22429 submit_info.pSignalSemaphores = &semaphore;
22430 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22431 }
22432 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022433 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022434 VkSubmitInfo submit_info{};
22435 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22436 submit_info.commandBufferCount = 1;
22437 submit_info.pCommandBuffers = &command_buffer[1];
22438 submit_info.waitSemaphoreCount = 1;
22439 submit_info.pWaitSemaphores = &semaphore;
22440 submit_info.pWaitDstStageMask = flags;
22441 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22442 }
22443
22444 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22445 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22446
22447 vkDestroyFence(m_device->device(), fence, nullptr);
22448 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22449 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22450 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22451
22452 m_errorMonitor->VerifyNotFound();
22453}
22454
22455TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060022456 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022457 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022458 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022459 return;
22460 }
22461
22462 VkResult err;
22463
22464 m_errorMonitor->ExpectSuccess();
22465
22466 VkQueue q0 = m_device->m_queue;
22467 VkQueue q1 = nullptr;
22468 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
22469 ASSERT_NE(q1, nullptr);
22470
22471 // An (empty) command buffer. We must have work in the first submission --
22472 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022473 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022474 VkCommandPool pool;
22475 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
22476 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022477 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
22478 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022479 VkCommandBuffer cb;
22480 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
22481 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022482 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022483 err = vkBeginCommandBuffer(cb, &cbbi);
22484 ASSERT_VK_SUCCESS(err);
22485 err = vkEndCommandBuffer(cb);
22486 ASSERT_VK_SUCCESS(err);
22487
22488 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022489 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022490 VkSemaphore s;
22491 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
22492 ASSERT_VK_SUCCESS(err);
22493
22494 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022495 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022496
22497 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
22498 ASSERT_VK_SUCCESS(err);
22499
22500 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022501 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022502 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022503
22504 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
22505 ASSERT_VK_SUCCESS(err);
22506
22507 // Wait for q0 idle
22508 err = vkQueueWaitIdle(q0);
22509 ASSERT_VK_SUCCESS(err);
22510
22511 // Command buffer should have been completed (it was on q0); reset the pool.
22512 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
22513
22514 m_errorMonitor->VerifyNotFound();
22515
22516 // Force device completely idle and clean up resources
22517 vkDeviceWaitIdle(m_device->device());
22518 vkDestroyCommandPool(m_device->device(), pool, nullptr);
22519 vkDestroySemaphore(m_device->device(), s, nullptr);
22520}
22521
22522// This is a positive test. No errors should be generated.
22523TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022524 TEST_DESCRIPTION(
22525 "Two command buffers, each in a separate QueueSubmit call "
22526 "submitted on separate queues, the second having a fence, "
22527 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022528
Tony Barbour1fa09702017-03-16 12:09:08 -060022529 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022530 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022531
22532 m_errorMonitor->ExpectSuccess();
22533
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022534 VkFence fence;
22535 VkFenceCreateInfo fence_create_info{};
22536 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22537 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22538
22539 VkSemaphore semaphore;
22540 VkSemaphoreCreateInfo semaphore_create_info{};
22541 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22542 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22543
22544 VkCommandPool command_pool;
22545 VkCommandPoolCreateInfo pool_create_info{};
22546 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22547 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22548 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22549 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22550
22551 VkCommandBuffer command_buffer[2];
22552 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22553 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22554 command_buffer_allocate_info.commandPool = command_pool;
22555 command_buffer_allocate_info.commandBufferCount = 2;
22556 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22557 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22558
22559 VkQueue queue = VK_NULL_HANDLE;
22560 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22561
22562 {
22563 VkCommandBufferBeginInfo begin_info{};
22564 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22565 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22566
22567 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 -070022568 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022569
22570 VkViewport viewport{};
22571 viewport.maxDepth = 1.0f;
22572 viewport.minDepth = 0.0f;
22573 viewport.width = 512;
22574 viewport.height = 512;
22575 viewport.x = 0;
22576 viewport.y = 0;
22577 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22578 vkEndCommandBuffer(command_buffer[0]);
22579 }
22580 {
22581 VkCommandBufferBeginInfo begin_info{};
22582 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22583 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22584
22585 VkViewport viewport{};
22586 viewport.maxDepth = 1.0f;
22587 viewport.minDepth = 0.0f;
22588 viewport.width = 512;
22589 viewport.height = 512;
22590 viewport.x = 0;
22591 viewport.y = 0;
22592 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22593 vkEndCommandBuffer(command_buffer[1]);
22594 }
22595 {
22596 VkSubmitInfo submit_info{};
22597 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22598 submit_info.commandBufferCount = 1;
22599 submit_info.pCommandBuffers = &command_buffer[0];
22600 submit_info.signalSemaphoreCount = 1;
22601 submit_info.pSignalSemaphores = &semaphore;
22602 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22603 }
22604 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022605 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022606 VkSubmitInfo submit_info{};
22607 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22608 submit_info.commandBufferCount = 1;
22609 submit_info.pCommandBuffers = &command_buffer[1];
22610 submit_info.waitSemaphoreCount = 1;
22611 submit_info.pWaitSemaphores = &semaphore;
22612 submit_info.pWaitDstStageMask = flags;
22613 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22614 }
22615
22616 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22617
22618 vkDestroyFence(m_device->device(), fence, nullptr);
22619 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22620 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22621 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22622
22623 m_errorMonitor->VerifyNotFound();
22624}
22625
22626// This is a positive test. No errors should be generated.
22627TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022628 TEST_DESCRIPTION(
22629 "Two command buffers, each in a separate QueueSubmit call "
22630 "on the same queue, sharing a signal/wait semaphore, the "
22631 "second having a fence, "
22632 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022633
22634 m_errorMonitor->ExpectSuccess();
22635
Tony Barbour1fa09702017-03-16 12:09:08 -060022636 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022637 VkFence fence;
22638 VkFenceCreateInfo fence_create_info{};
22639 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22640 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22641
22642 VkSemaphore semaphore;
22643 VkSemaphoreCreateInfo semaphore_create_info{};
22644 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22645 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
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 = 1;
22701 submit_info.pSignalSemaphores = &semaphore;
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 = 1;
22711 submit_info.pWaitSemaphores = &semaphore;
22712 submit_info.pWaitDstStageMask = flags;
22713 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22714 }
22715
22716 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22717
22718 vkDestroyFence(m_device->device(), fence, nullptr);
22719 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22720 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22721 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22722
22723 m_errorMonitor->VerifyNotFound();
22724}
22725
22726// This is a positive test. No errors should be generated.
22727TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022728 TEST_DESCRIPTION(
22729 "Two command buffers, each in a separate QueueSubmit call "
22730 "on the same queue, no fences, followed by a third QueueSubmit with NO "
22731 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022732
22733 m_errorMonitor->ExpectSuccess();
22734
Tony Barbour1fa09702017-03-16 12:09:08 -060022735 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022736 VkFence fence;
22737 VkFenceCreateInfo fence_create_info{};
22738 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22739 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22740
22741 VkCommandPool command_pool;
22742 VkCommandPoolCreateInfo pool_create_info{};
22743 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22744 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22745 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22746 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22747
22748 VkCommandBuffer command_buffer[2];
22749 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22750 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22751 command_buffer_allocate_info.commandPool = command_pool;
22752 command_buffer_allocate_info.commandBufferCount = 2;
22753 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22754 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22755
22756 {
22757 VkCommandBufferBeginInfo begin_info{};
22758 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22759 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22760
22761 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 -070022762 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022763
22764 VkViewport viewport{};
22765 viewport.maxDepth = 1.0f;
22766 viewport.minDepth = 0.0f;
22767 viewport.width = 512;
22768 viewport.height = 512;
22769 viewport.x = 0;
22770 viewport.y = 0;
22771 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22772 vkEndCommandBuffer(command_buffer[0]);
22773 }
22774 {
22775 VkCommandBufferBeginInfo begin_info{};
22776 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22777 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22778
22779 VkViewport viewport{};
22780 viewport.maxDepth = 1.0f;
22781 viewport.minDepth = 0.0f;
22782 viewport.width = 512;
22783 viewport.height = 512;
22784 viewport.x = 0;
22785 viewport.y = 0;
22786 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22787 vkEndCommandBuffer(command_buffer[1]);
22788 }
22789 {
22790 VkSubmitInfo submit_info{};
22791 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22792 submit_info.commandBufferCount = 1;
22793 submit_info.pCommandBuffers = &command_buffer[0];
22794 submit_info.signalSemaphoreCount = 0;
22795 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22796 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22797 }
22798 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022799 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022800 VkSubmitInfo submit_info{};
22801 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22802 submit_info.commandBufferCount = 1;
22803 submit_info.pCommandBuffers = &command_buffer[1];
22804 submit_info.waitSemaphoreCount = 0;
22805 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22806 submit_info.pWaitDstStageMask = flags;
22807 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22808 }
22809
22810 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
22811
22812 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22813 ASSERT_VK_SUCCESS(err);
22814
22815 vkDestroyFence(m_device->device(), fence, nullptr);
22816 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22817 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22818
22819 m_errorMonitor->VerifyNotFound();
22820}
22821
22822// This is a positive test. No errors should be generated.
22823TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022824 TEST_DESCRIPTION(
22825 "Two command buffers, each in a separate QueueSubmit call "
22826 "on the same queue, the second having a fence, followed "
22827 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022828
22829 m_errorMonitor->ExpectSuccess();
22830
Tony Barbour1fa09702017-03-16 12:09:08 -060022831 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022832 VkFence fence;
22833 VkFenceCreateInfo fence_create_info{};
22834 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22835 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22836
22837 VkCommandPool command_pool;
22838 VkCommandPoolCreateInfo pool_create_info{};
22839 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22840 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22841 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22842 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22843
22844 VkCommandBuffer command_buffer[2];
22845 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22846 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22847 command_buffer_allocate_info.commandPool = command_pool;
22848 command_buffer_allocate_info.commandBufferCount = 2;
22849 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22850 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22851
22852 {
22853 VkCommandBufferBeginInfo begin_info{};
22854 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22855 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22856
22857 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 -070022858 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022859
22860 VkViewport viewport{};
22861 viewport.maxDepth = 1.0f;
22862 viewport.minDepth = 0.0f;
22863 viewport.width = 512;
22864 viewport.height = 512;
22865 viewport.x = 0;
22866 viewport.y = 0;
22867 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22868 vkEndCommandBuffer(command_buffer[0]);
22869 }
22870 {
22871 VkCommandBufferBeginInfo begin_info{};
22872 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22873 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22874
22875 VkViewport viewport{};
22876 viewport.maxDepth = 1.0f;
22877 viewport.minDepth = 0.0f;
22878 viewport.width = 512;
22879 viewport.height = 512;
22880 viewport.x = 0;
22881 viewport.y = 0;
22882 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22883 vkEndCommandBuffer(command_buffer[1]);
22884 }
22885 {
22886 VkSubmitInfo submit_info{};
22887 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22888 submit_info.commandBufferCount = 1;
22889 submit_info.pCommandBuffers = &command_buffer[0];
22890 submit_info.signalSemaphoreCount = 0;
22891 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22892 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22893 }
22894 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022895 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022896 VkSubmitInfo submit_info{};
22897 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22898 submit_info.commandBufferCount = 1;
22899 submit_info.pCommandBuffers = &command_buffer[1];
22900 submit_info.waitSemaphoreCount = 0;
22901 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22902 submit_info.pWaitDstStageMask = flags;
22903 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22904 }
22905
22906 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22907
22908 vkDestroyFence(m_device->device(), fence, nullptr);
22909 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22910 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22911
22912 m_errorMonitor->VerifyNotFound();
22913}
22914
22915// This is a positive test. No errors should be generated.
22916TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022917 TEST_DESCRIPTION(
22918 "Two command buffers each in a separate SubmitInfo sent in a single "
22919 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022920 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022921
22922 m_errorMonitor->ExpectSuccess();
22923
22924 VkFence fence;
22925 VkFenceCreateInfo fence_create_info{};
22926 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22927 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22928
22929 VkSemaphore semaphore;
22930 VkSemaphoreCreateInfo semaphore_create_info{};
22931 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22932 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22933
22934 VkCommandPool command_pool;
22935 VkCommandPoolCreateInfo pool_create_info{};
22936 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22937 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22938 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22939 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22940
22941 VkCommandBuffer command_buffer[2];
22942 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22943 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22944 command_buffer_allocate_info.commandPool = command_pool;
22945 command_buffer_allocate_info.commandBufferCount = 2;
22946 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22947 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22948
22949 {
22950 VkCommandBufferBeginInfo begin_info{};
22951 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22952 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22953
22954 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 -070022955 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022956
22957 VkViewport viewport{};
22958 viewport.maxDepth = 1.0f;
22959 viewport.minDepth = 0.0f;
22960 viewport.width = 512;
22961 viewport.height = 512;
22962 viewport.x = 0;
22963 viewport.y = 0;
22964 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22965 vkEndCommandBuffer(command_buffer[0]);
22966 }
22967 {
22968 VkCommandBufferBeginInfo begin_info{};
22969 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22970 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22971
22972 VkViewport viewport{};
22973 viewport.maxDepth = 1.0f;
22974 viewport.minDepth = 0.0f;
22975 viewport.width = 512;
22976 viewport.height = 512;
22977 viewport.x = 0;
22978 viewport.y = 0;
22979 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22980 vkEndCommandBuffer(command_buffer[1]);
22981 }
22982 {
22983 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022984 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022985
22986 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22987 submit_info[0].pNext = NULL;
22988 submit_info[0].commandBufferCount = 1;
22989 submit_info[0].pCommandBuffers = &command_buffer[0];
22990 submit_info[0].signalSemaphoreCount = 1;
22991 submit_info[0].pSignalSemaphores = &semaphore;
22992 submit_info[0].waitSemaphoreCount = 0;
22993 submit_info[0].pWaitSemaphores = NULL;
22994 submit_info[0].pWaitDstStageMask = 0;
22995
22996 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22997 submit_info[1].pNext = NULL;
22998 submit_info[1].commandBufferCount = 1;
22999 submit_info[1].pCommandBuffers = &command_buffer[1];
23000 submit_info[1].waitSemaphoreCount = 1;
23001 submit_info[1].pWaitSemaphores = &semaphore;
23002 submit_info[1].pWaitDstStageMask = flags;
23003 submit_info[1].signalSemaphoreCount = 0;
23004 submit_info[1].pSignalSemaphores = NULL;
23005 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
23006 }
23007
23008 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23009
23010 vkDestroyFence(m_device->device(), fence, nullptr);
23011 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
23012 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
23013 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
23014
23015 m_errorMonitor->VerifyNotFound();
23016}
23017
23018TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
23019 m_errorMonitor->ExpectSuccess();
23020
Tony Barbour1fa09702017-03-16 12:09:08 -060023021 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023022 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23023
Tony Barbour552f6c02016-12-21 14:34:07 -070023024 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023025
23026 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
23027 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
23028 m_errorMonitor->VerifyNotFound();
23029 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
23030 m_errorMonitor->VerifyNotFound();
23031 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
23032 m_errorMonitor->VerifyNotFound();
23033
23034 m_commandBuffer->EndCommandBuffer();
23035 m_errorMonitor->VerifyNotFound();
23036}
23037
23038TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023039 TEST_DESCRIPTION(
23040 "Positive test where we create a renderpass with an "
23041 "attachment that uses LOAD_OP_CLEAR, the first subpass "
23042 "has a valid layout, and a second subpass then uses a "
23043 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023044 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060023045 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060023046 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070023047 if (!depth_format) {
23048 printf(" No Depth + Stencil format found. Skipped.\n");
23049 return;
23050 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023051
23052 VkAttachmentReference attach[2] = {};
23053 attach[0].attachment = 0;
23054 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
23055 attach[1].attachment = 0;
23056 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
23057 VkSubpassDescription subpasses[2] = {};
23058 // First subpass clears DS attach on load
23059 subpasses[0].pDepthStencilAttachment = &attach[0];
23060 // 2nd subpass reads in DS as input attachment
23061 subpasses[1].inputAttachmentCount = 1;
23062 subpasses[1].pInputAttachments = &attach[1];
23063 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070023064 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023065 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
23066 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
23067 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
23068 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
23069 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
23070 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
23071 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
23072 VkRenderPassCreateInfo rpci = {};
23073 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
23074 rpci.attachmentCount = 1;
23075 rpci.pAttachments = &attach_desc;
23076 rpci.subpassCount = 2;
23077 rpci.pSubpasses = subpasses;
23078
23079 // Now create RenderPass and verify no errors
23080 VkRenderPass rp;
23081 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
23082 m_errorMonitor->VerifyNotFound();
23083
23084 vkDestroyRenderPass(m_device->device(), rp, NULL);
23085}
23086
Tobin Ehlis01103de2017-02-16 13:22:47 -070023087TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
23088 TEST_DESCRIPTION(
23089 "Create a render pass with depth-stencil attachment where layout transition "
23090 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
23091 "transition has correctly occurred at queue submit time with no validation errors.");
23092
Tony Barbour1fa09702017-03-16 12:09:08 -060023093 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060023094 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070023095 if (!depth_format) {
23096 printf(" No Depth + Stencil format found. Skipped.\n");
23097 return;
23098 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070023099 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070023100 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023101 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
23102 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070023103 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070023104 return;
23105 }
23106
23107 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070023108 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23109
23110 // A renderpass with one depth/stencil attachment.
23111 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070023112 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023113 VK_SAMPLE_COUNT_1_BIT,
23114 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23115 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23116 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23117 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23118 VK_IMAGE_LAYOUT_UNDEFINED,
23119 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23120
23121 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23122
23123 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
23124
23125 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
23126
23127 VkRenderPass rp;
23128 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23129 ASSERT_VK_SUCCESS(err);
23130 // A compatible ds image.
23131 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060023132 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 -070023133 ASSERT_TRUE(image.initialized());
23134
23135 VkImageViewCreateInfo ivci = {
23136 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
23137 nullptr,
23138 0,
23139 image.handle(),
23140 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070023141 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023142 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
23143 VK_COMPONENT_SWIZZLE_IDENTITY},
23144 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
23145 };
23146 VkImageView view;
23147 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
23148 ASSERT_VK_SUCCESS(err);
23149
23150 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
23151 VkFramebuffer fb;
23152 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
23153 ASSERT_VK_SUCCESS(err);
23154
23155 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
23156 m_commandBuffer->BeginCommandBuffer();
23157 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
23158 vkCmdEndRenderPass(m_commandBuffer->handle());
23159 m_commandBuffer->EndCommandBuffer();
23160 QueueCommandBuffer(false);
23161 m_errorMonitor->VerifyNotFound();
23162
23163 // Cleanup
23164 vkDestroyImageView(m_device->device(), view, NULL);
23165 vkDestroyRenderPass(m_device->device(), rp, NULL);
23166 vkDestroyFramebuffer(m_device->device(), fb, NULL);
23167}
23168
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023169TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023170 TEST_DESCRIPTION(
23171 "Test that pipeline validation accepts matrices passed "
23172 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023173 m_errorMonitor->ExpectSuccess();
23174
Tony Barbour1fa09702017-03-16 12:09:08 -060023175 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023176 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23177
23178 VkVertexInputBindingDescription input_binding;
23179 memset(&input_binding, 0, sizeof(input_binding));
23180
23181 VkVertexInputAttributeDescription input_attribs[2];
23182 memset(input_attribs, 0, sizeof(input_attribs));
23183
23184 for (int i = 0; i < 2; i++) {
23185 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23186 input_attribs[i].location = i;
23187 }
23188
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023189 char const *vsSource =
23190 "#version 450\n"
23191 "\n"
23192 "layout(location=0) in mat2x4 x;\n"
23193 "out gl_PerVertex {\n"
23194 " vec4 gl_Position;\n"
23195 "};\n"
23196 "void main(){\n"
23197 " gl_Position = x[0] + x[1];\n"
23198 "}\n";
23199 char const *fsSource =
23200 "#version 450\n"
23201 "\n"
23202 "layout(location=0) out vec4 color;\n"
23203 "void main(){\n"
23204 " color = vec4(1);\n"
23205 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023206
23207 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23208 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23209
23210 VkPipelineObj pipe(m_device);
23211 pipe.AddColorAttachment();
23212 pipe.AddShader(&vs);
23213 pipe.AddShader(&fs);
23214
23215 pipe.AddVertexInputBindings(&input_binding, 1);
23216 pipe.AddVertexInputAttribs(input_attribs, 2);
23217
23218 VkDescriptorSetObj descriptorSet(m_device);
23219 descriptorSet.AppendDummy();
23220 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23221
23222 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23223
23224 /* expect success */
23225 m_errorMonitor->VerifyNotFound();
23226}
23227
23228TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
23229 m_errorMonitor->ExpectSuccess();
23230
Tony Barbour1fa09702017-03-16 12:09:08 -060023231 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023232 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23233
23234 VkVertexInputBindingDescription input_binding;
23235 memset(&input_binding, 0, sizeof(input_binding));
23236
23237 VkVertexInputAttributeDescription input_attribs[2];
23238 memset(input_attribs, 0, sizeof(input_attribs));
23239
23240 for (int i = 0; i < 2; i++) {
23241 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23242 input_attribs[i].location = i;
23243 }
23244
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023245 char const *vsSource =
23246 "#version 450\n"
23247 "\n"
23248 "layout(location=0) in vec4 x[2];\n"
23249 "out gl_PerVertex {\n"
23250 " vec4 gl_Position;\n"
23251 "};\n"
23252 "void main(){\n"
23253 " gl_Position = x[0] + x[1];\n"
23254 "}\n";
23255 char const *fsSource =
23256 "#version 450\n"
23257 "\n"
23258 "layout(location=0) out vec4 color;\n"
23259 "void main(){\n"
23260 " color = vec4(1);\n"
23261 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023262
23263 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23264 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23265
23266 VkPipelineObj pipe(m_device);
23267 pipe.AddColorAttachment();
23268 pipe.AddShader(&vs);
23269 pipe.AddShader(&fs);
23270
23271 pipe.AddVertexInputBindings(&input_binding, 1);
23272 pipe.AddVertexInputAttribs(input_attribs, 2);
23273
23274 VkDescriptorSetObj descriptorSet(m_device);
23275 descriptorSet.AppendDummy();
23276 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23277
23278 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23279
23280 m_errorMonitor->VerifyNotFound();
23281}
23282
23283TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023284 TEST_DESCRIPTION(
23285 "Test that pipeline validation accepts consuming a vertex attribute "
23286 "through multiple vertex shader inputs, each consuming a different "
23287 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023288 m_errorMonitor->ExpectSuccess();
23289
Tony Barbour1fa09702017-03-16 12:09:08 -060023290 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023291 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23292
23293 VkVertexInputBindingDescription input_binding;
23294 memset(&input_binding, 0, sizeof(input_binding));
23295
23296 VkVertexInputAttributeDescription input_attribs[3];
23297 memset(input_attribs, 0, sizeof(input_attribs));
23298
23299 for (int i = 0; i < 3; i++) {
23300 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23301 input_attribs[i].location = i;
23302 }
23303
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023304 char const *vsSource =
23305 "#version 450\n"
23306 "\n"
23307 "layout(location=0) in vec4 x;\n"
23308 "layout(location=1) in vec3 y1;\n"
23309 "layout(location=1, component=3) in float y2;\n"
23310 "layout(location=2) in vec4 z;\n"
23311 "out gl_PerVertex {\n"
23312 " vec4 gl_Position;\n"
23313 "};\n"
23314 "void main(){\n"
23315 " gl_Position = x + vec4(y1, y2) + z;\n"
23316 "}\n";
23317 char const *fsSource =
23318 "#version 450\n"
23319 "\n"
23320 "layout(location=0) out vec4 color;\n"
23321 "void main(){\n"
23322 " color = vec4(1);\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 pipe.AddVertexInputBindings(&input_binding, 1);
23334 pipe.AddVertexInputAttribs(input_attribs, 3);
23335
23336 VkDescriptorSetObj descriptorSet(m_device);
23337 descriptorSet.AppendDummy();
23338 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23339
23340 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23341
23342 m_errorMonitor->VerifyNotFound();
23343}
23344
23345TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
23346 m_errorMonitor->ExpectSuccess();
23347
Tony Barbour1fa09702017-03-16 12:09:08 -060023348 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23350
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023351 char const *vsSource =
23352 "#version 450\n"
23353 "out gl_PerVertex {\n"
23354 " vec4 gl_Position;\n"
23355 "};\n"
23356 "void main(){\n"
23357 " gl_Position = vec4(0);\n"
23358 "}\n";
23359 char const *fsSource =
23360 "#version 450\n"
23361 "\n"
23362 "layout(location=0) out vec4 color;\n"
23363 "void main(){\n"
23364 " color = vec4(1);\n"
23365 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023366
23367 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23368 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23369
23370 VkPipelineObj pipe(m_device);
23371 pipe.AddColorAttachment();
23372 pipe.AddShader(&vs);
23373 pipe.AddShader(&fs);
23374
23375 VkDescriptorSetObj descriptorSet(m_device);
23376 descriptorSet.AppendDummy();
23377 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23378
23379 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23380
23381 m_errorMonitor->VerifyNotFound();
23382}
23383
23384TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023385 TEST_DESCRIPTION(
23386 "Test that pipeline validation accepts the relaxed type matching rules "
23387 "set out in 14.1.3: fundamental type must match, and producer side must "
23388 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023389 m_errorMonitor->ExpectSuccess();
23390
23391 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
23392
Tony Barbour1fa09702017-03-16 12:09:08 -060023393 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23395
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023396 char const *vsSource =
23397 "#version 450\n"
23398 "out gl_PerVertex {\n"
23399 " vec4 gl_Position;\n"
23400 "};\n"
23401 "layout(location=0) out vec3 x;\n"
23402 "layout(location=1) out ivec3 y;\n"
23403 "layout(location=2) out vec3 z;\n"
23404 "void main(){\n"
23405 " gl_Position = vec4(0);\n"
23406 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
23407 "}\n";
23408 char const *fsSource =
23409 "#version 450\n"
23410 "\n"
23411 "layout(location=0) out vec4 color;\n"
23412 "layout(location=0) in float x;\n"
23413 "layout(location=1) flat in int y;\n"
23414 "layout(location=2) in vec2 z;\n"
23415 "void main(){\n"
23416 " color = vec4(1 + x + y + z.x);\n"
23417 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023418
23419 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23420 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23421
23422 VkPipelineObj pipe(m_device);
23423 pipe.AddColorAttachment();
23424 pipe.AddShader(&vs);
23425 pipe.AddShader(&fs);
23426
23427 VkDescriptorSetObj descriptorSet(m_device);
23428 descriptorSet.AppendDummy();
23429 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23430
23431 VkResult err = VK_SUCCESS;
23432 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23433 ASSERT_VK_SUCCESS(err);
23434
23435 m_errorMonitor->VerifyNotFound();
23436}
23437
23438TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023439 TEST_DESCRIPTION(
23440 "Test that pipeline validation accepts per-vertex variables "
23441 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023442 m_errorMonitor->ExpectSuccess();
23443
Tony Barbour1fa09702017-03-16 12:09:08 -060023444 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23446
23447 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023448 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023449 return;
23450 }
23451
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023452 char const *vsSource =
23453 "#version 450\n"
23454 "void main(){}\n";
23455 char const *tcsSource =
23456 "#version 450\n"
23457 "layout(location=0) out int x[];\n"
23458 "layout(vertices=3) out;\n"
23459 "void main(){\n"
23460 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
23461 " gl_TessLevelInner[0] = 1;\n"
23462 " x[gl_InvocationID] = gl_InvocationID;\n"
23463 "}\n";
23464 char const *tesSource =
23465 "#version 450\n"
23466 "layout(triangles, equal_spacing, cw) in;\n"
23467 "layout(location=0) in int x[];\n"
23468 "out gl_PerVertex { vec4 gl_Position; };\n"
23469 "void main(){\n"
23470 " gl_Position.xyz = gl_TessCoord;\n"
23471 " gl_Position.w = x[0] + x[1] + x[2];\n"
23472 "}\n";
23473 char const *fsSource =
23474 "#version 450\n"
23475 "layout(location=0) out vec4 color;\n"
23476 "void main(){\n"
23477 " color = vec4(1);\n"
23478 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023479
23480 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23481 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
23482 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
23483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23484
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023485 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
23486 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023487
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023488 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023489
23490 VkPipelineObj pipe(m_device);
23491 pipe.SetInputAssembly(&iasci);
23492 pipe.SetTessellation(&tsci);
23493 pipe.AddColorAttachment();
23494 pipe.AddShader(&vs);
23495 pipe.AddShader(&tcs);
23496 pipe.AddShader(&tes);
23497 pipe.AddShader(&fs);
23498
23499 VkDescriptorSetObj descriptorSet(m_device);
23500 descriptorSet.AppendDummy();
23501 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23502
23503 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23504
23505 m_errorMonitor->VerifyNotFound();
23506}
23507
23508TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023509 TEST_DESCRIPTION(
23510 "Test that pipeline validation accepts a user-defined "
23511 "interface block passed into the geometry shader. This "
23512 "is interesting because the 'extra' array level is not "
23513 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023514 m_errorMonitor->ExpectSuccess();
23515
Tony Barbour1fa09702017-03-16 12:09:08 -060023516 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23518
23519 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023520 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023521 return;
23522 }
23523
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023524 char const *vsSource =
23525 "#version 450\n"
23526 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
23527 "void main(){\n"
23528 " vs_out.x = vec4(1);\n"
23529 "}\n";
23530 char const *gsSource =
23531 "#version 450\n"
23532 "layout(triangles) in;\n"
23533 "layout(triangle_strip, max_vertices=3) out;\n"
23534 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
23535 "out gl_PerVertex { vec4 gl_Position; };\n"
23536 "void main() {\n"
23537 " gl_Position = gs_in[0].x;\n"
23538 " EmitVertex();\n"
23539 "}\n";
23540 char const *fsSource =
23541 "#version 450\n"
23542 "layout(location=0) out vec4 color;\n"
23543 "void main(){\n"
23544 " color = vec4(1);\n"
23545 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023546
23547 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23548 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
23549 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23550
23551 VkPipelineObj pipe(m_device);
23552 pipe.AddColorAttachment();
23553 pipe.AddShader(&vs);
23554 pipe.AddShader(&gs);
23555 pipe.AddShader(&fs);
23556
23557 VkDescriptorSetObj descriptorSet(m_device);
23558 descriptorSet.AppendDummy();
23559 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23560
23561 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23562
23563 m_errorMonitor->VerifyNotFound();
23564}
23565
23566TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023567 TEST_DESCRIPTION(
23568 "Test that pipeline validation accepts basic use of 64bit vertex "
23569 "attributes. This is interesting because they consume multiple "
23570 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023571 m_errorMonitor->ExpectSuccess();
23572
Tony Barbour1fa09702017-03-16 12:09:08 -060023573 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23575
23576 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023577 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023578 return;
23579 }
23580
23581 VkVertexInputBindingDescription input_bindings[1];
23582 memset(input_bindings, 0, sizeof(input_bindings));
23583
23584 VkVertexInputAttributeDescription input_attribs[4];
23585 memset(input_attribs, 0, sizeof(input_attribs));
23586 input_attribs[0].location = 0;
23587 input_attribs[0].offset = 0;
23588 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23589 input_attribs[1].location = 2;
23590 input_attribs[1].offset = 32;
23591 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23592 input_attribs[2].location = 4;
23593 input_attribs[2].offset = 64;
23594 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23595 input_attribs[3].location = 6;
23596 input_attribs[3].offset = 96;
23597 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23598
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023599 char const *vsSource =
23600 "#version 450\n"
23601 "\n"
23602 "layout(location=0) in dmat4 x;\n"
23603 "out gl_PerVertex {\n"
23604 " vec4 gl_Position;\n"
23605 "};\n"
23606 "void main(){\n"
23607 " gl_Position = vec4(x[0][0]);\n"
23608 "}\n";
23609 char const *fsSource =
23610 "#version 450\n"
23611 "\n"
23612 "layout(location=0) out vec4 color;\n"
23613 "void main(){\n"
23614 " color = vec4(1);\n"
23615 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023616
23617 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23618 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23619
23620 VkPipelineObj pipe(m_device);
23621 pipe.AddColorAttachment();
23622 pipe.AddShader(&vs);
23623 pipe.AddShader(&fs);
23624
23625 pipe.AddVertexInputBindings(input_bindings, 1);
23626 pipe.AddVertexInputAttribs(input_attribs, 4);
23627
23628 VkDescriptorSetObj descriptorSet(m_device);
23629 descriptorSet.AppendDummy();
23630 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23631
23632 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23633
23634 m_errorMonitor->VerifyNotFound();
23635}
23636
23637TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
23638 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
23639 m_errorMonitor->ExpectSuccess();
23640
Tony Barbour1fa09702017-03-16 12:09:08 -060023641 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023642
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023643 char const *vsSource =
23644 "#version 450\n"
23645 "\n"
23646 "out gl_PerVertex {\n"
23647 " vec4 gl_Position;\n"
23648 "};\n"
23649 "void main(){\n"
23650 " gl_Position = vec4(1);\n"
23651 "}\n";
23652 char const *fsSource =
23653 "#version 450\n"
23654 "\n"
23655 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
23656 "layout(location=0) out vec4 color;\n"
23657 "void main() {\n"
23658 " color = subpassLoad(x);\n"
23659 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023660
23661 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23662 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23663
23664 VkPipelineObj pipe(m_device);
23665 pipe.AddShader(&vs);
23666 pipe.AddShader(&fs);
23667 pipe.AddColorAttachment();
23668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23669
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023670 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
23671 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023672 VkDescriptorSetLayout dsl;
23673 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23674 ASSERT_VK_SUCCESS(err);
23675
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023676 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023677 VkPipelineLayout pl;
23678 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23679 ASSERT_VK_SUCCESS(err);
23680
23681 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023682 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23683 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23684 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
23685 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23686 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 -060023687 };
23688 VkAttachmentReference color = {
23689 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23690 };
23691 VkAttachmentReference input = {
23692 1, VK_IMAGE_LAYOUT_GENERAL,
23693 };
23694
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023695 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023696
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023697 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023698 VkRenderPass rp;
23699 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23700 ASSERT_VK_SUCCESS(err);
23701
23702 // should be OK. would go wrong here if it's going to...
23703 pipe.CreateVKPipeline(pl, rp);
23704
23705 m_errorMonitor->VerifyNotFound();
23706
23707 vkDestroyRenderPass(m_device->device(), rp, nullptr);
23708 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23709 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23710}
23711
23712TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023713 TEST_DESCRIPTION(
23714 "Test that pipeline validation accepts a compute pipeline which declares a "
23715 "descriptor-backed resource which is not provided, but the shader does not "
23716 "statically use it. This is interesting because it requires compute pipelines "
23717 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023718 m_errorMonitor->ExpectSuccess();
23719
Tony Barbour1fa09702017-03-16 12:09:08 -060023720 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023721
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023722 char const *csSource =
23723 "#version 450\n"
23724 "\n"
23725 "layout(local_size_x=1) in;\n"
23726 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
23727 "void main(){\n"
23728 " // x is not used.\n"
23729 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023730
23731 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23732
23733 VkDescriptorSetObj descriptorSet(m_device);
23734 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23735
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023736 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23737 nullptr,
23738 0,
23739 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23740 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23741 descriptorSet.GetPipelineLayout(),
23742 VK_NULL_HANDLE,
23743 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023744
23745 VkPipeline pipe;
23746 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23747
23748 m_errorMonitor->VerifyNotFound();
23749
23750 if (err == VK_SUCCESS) {
23751 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23752 }
23753}
23754
23755TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023756 TEST_DESCRIPTION(
23757 "Test that pipeline validation accepts a shader consuming only the "
23758 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023759 m_errorMonitor->ExpectSuccess();
23760
Tony Barbour1fa09702017-03-16 12:09:08 -060023761 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023762
23763 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023764 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23765 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23766 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023767 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023768 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023769 VkDescriptorSetLayout dsl;
23770 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23771 ASSERT_VK_SUCCESS(err);
23772
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023773 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023774 VkPipelineLayout pl;
23775 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23776 ASSERT_VK_SUCCESS(err);
23777
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023778 char const *csSource =
23779 "#version 450\n"
23780 "\n"
23781 "layout(local_size_x=1) in;\n"
23782 "layout(set=0, binding=0) uniform sampler s;\n"
23783 "layout(set=0, binding=1) uniform texture2D t;\n"
23784 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23785 "void main() {\n"
23786 " x = texture(sampler2D(t, s), vec2(0));\n"
23787 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023788 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23789
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023790 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23791 nullptr,
23792 0,
23793 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23794 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23795 pl,
23796 VK_NULL_HANDLE,
23797 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023798
23799 VkPipeline pipe;
23800 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23801
23802 m_errorMonitor->VerifyNotFound();
23803
23804 if (err == VK_SUCCESS) {
23805 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23806 }
23807
23808 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23809 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23810}
23811
23812TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023813 TEST_DESCRIPTION(
23814 "Test that pipeline validation accepts a shader consuming only the "
23815 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023816 m_errorMonitor->ExpectSuccess();
23817
Tony Barbour1fa09702017-03-16 12:09:08 -060023818 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023819
23820 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023821 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23822 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23823 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023824 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023825 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023826 VkDescriptorSetLayout dsl;
23827 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23828 ASSERT_VK_SUCCESS(err);
23829
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023830 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023831 VkPipelineLayout pl;
23832 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23833 ASSERT_VK_SUCCESS(err);
23834
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023835 char const *csSource =
23836 "#version 450\n"
23837 "\n"
23838 "layout(local_size_x=1) in;\n"
23839 "layout(set=0, binding=0) uniform texture2D t;\n"
23840 "layout(set=0, binding=1) uniform sampler s;\n"
23841 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23842 "void main() {\n"
23843 " x = texture(sampler2D(t, s), vec2(0));\n"
23844 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023845 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23846
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023847 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23848 nullptr,
23849 0,
23850 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23851 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23852 pl,
23853 VK_NULL_HANDLE,
23854 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023855
23856 VkPipeline pipe;
23857 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23858
23859 m_errorMonitor->VerifyNotFound();
23860
23861 if (err == VK_SUCCESS) {
23862 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23863 }
23864
23865 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23866 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23867}
23868
23869TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023870 TEST_DESCRIPTION(
23871 "Test that pipeline validation accepts a shader consuming "
23872 "both the sampler and the image of a combined image+sampler "
23873 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023874 m_errorMonitor->ExpectSuccess();
23875
Tony Barbour1fa09702017-03-16 12:09:08 -060023876 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023877
23878 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023879 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23880 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023881 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023882 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023883 VkDescriptorSetLayout dsl;
23884 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23885 ASSERT_VK_SUCCESS(err);
23886
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023887 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023888 VkPipelineLayout pl;
23889 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23890 ASSERT_VK_SUCCESS(err);
23891
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023892 char const *csSource =
23893 "#version 450\n"
23894 "\n"
23895 "layout(local_size_x=1) in;\n"
23896 "layout(set=0, binding=0) uniform texture2D t;\n"
23897 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23898 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23899 "void main() {\n"
23900 " x = texture(sampler2D(t, s), vec2(0));\n"
23901 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023902 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23903
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023904 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23905 nullptr,
23906 0,
23907 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23908 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23909 pl,
23910 VK_NULL_HANDLE,
23911 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023912
23913 VkPipeline pipe;
23914 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23915
23916 m_errorMonitor->VerifyNotFound();
23917
23918 if (err == VK_SUCCESS) {
23919 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23920 }
23921
23922 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23923 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23924}
23925
Tony Barbour3ed87a02017-03-15 16:19:02 -060023926TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023927 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23928
Tony Barbour3ed87a02017-03-15 16:19:02 -060023929 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023930 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023931
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023932 // Ensure that extension is available and enabled.
23933 uint32_t extension_count = 0;
23934 bool supports_maintenance1_extension = false;
23935 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23936 ASSERT_VK_SUCCESS(err);
23937 if (extension_count > 0) {
23938 std::vector<VkExtensionProperties> available_extensions(extension_count);
23939
23940 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23941 ASSERT_VK_SUCCESS(err);
23942 for (const auto &extension_props : available_extensions) {
23943 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23944 supports_maintenance1_extension = true;
23945 }
23946 }
23947 }
23948
23949 // Proceed if extension is supported by hardware
23950 if (!supports_maintenance1_extension) {
23951 printf(" Maintenance1 Extension not supported, skipping tests\n");
23952 return;
23953 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023954
23955 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023956 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023957 VkCommandBuffer cmd_buf;
23958 VkCommandBufferAllocateInfo alloc_info;
23959 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23960 alloc_info.pNext = NULL;
23961 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023962 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023963 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23964 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23965
23966 VkCommandBufferBeginInfo cb_binfo;
23967 cb_binfo.pNext = NULL;
23968 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23969 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23970 cb_binfo.flags = 0;
23971 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23972 // Set Negative height, should give error if Maintenance 1 is not enabled
23973 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23974 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23975 vkEndCommandBuffer(cmd_buf);
23976
23977 m_errorMonitor->VerifyNotFound();
23978}
23979
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023980TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23981 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23982
23983 ASSERT_NO_FATAL_FAILURE(Init());
23984
23985 uint32_t extension_count = 0;
23986 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23987 ASSERT_VK_SUCCESS(err);
23988
23989 if (extension_count > 0) {
23990 std::vector<VkExtensionProperties> available_extensions(extension_count);
23991 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23992 ASSERT_VK_SUCCESS(err);
23993
23994 for (const auto &extension_props : available_extensions) {
23995 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23996 // Create two pNext structures which by themselves would be valid
23997 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23998 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23999 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24000 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
24001 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
24002
24003 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24004 dedicated_buffer_create_info_2.pNext = nullptr;
24005 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
24006
24007 uint32_t queue_family_index = 0;
24008 VkBufferCreateInfo buffer_create_info = {};
24009 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
24010 buffer_create_info.pNext = &dedicated_buffer_create_info;
24011 buffer_create_info.size = 1024;
24012 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
24013 buffer_create_info.queueFamilyIndexCount = 1;
24014 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
24015
24016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
24017 VkBuffer buffer;
24018 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
24019 m_errorMonitor->VerifyFound();
24020 }
24021 }
24022 }
24023}
24024
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024025TEST_F(VkPositiveLayerTest, ValidStructPNext) {
24026 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
24027
Tony Barbour1fa09702017-03-16 12:09:08 -060024028 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024029
24030 // Positive test to check parameter_validation and unique_objects support
24031 // for NV_dedicated_allocation
24032 uint32_t extension_count = 0;
24033 bool supports_nv_dedicated_allocation = false;
24034 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
24035 ASSERT_VK_SUCCESS(err);
24036
24037 if (extension_count > 0) {
24038 std::vector<VkExtensionProperties> available_extensions(extension_count);
24039
24040 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
24041 ASSERT_VK_SUCCESS(err);
24042
24043 for (const auto &extension_props : available_extensions) {
24044 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
24045 supports_nv_dedicated_allocation = true;
24046 }
24047 }
24048 }
24049
24050 if (supports_nv_dedicated_allocation) {
24051 m_errorMonitor->ExpectSuccess();
24052
24053 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
24054 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24055 dedicated_buffer_create_info.pNext = nullptr;
24056 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
24057
24058 uint32_t queue_family_index = 0;
24059 VkBufferCreateInfo buffer_create_info = {};
24060 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
24061 buffer_create_info.pNext = &dedicated_buffer_create_info;
24062 buffer_create_info.size = 1024;
24063 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
24064 buffer_create_info.queueFamilyIndexCount = 1;
24065 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
24066
24067 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070024068 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024069 ASSERT_VK_SUCCESS(err);
24070
24071 VkMemoryRequirements memory_reqs;
24072 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
24073
24074 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
24075 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
24076 dedicated_memory_info.pNext = nullptr;
24077 dedicated_memory_info.buffer = buffer;
24078 dedicated_memory_info.image = VK_NULL_HANDLE;
24079
24080 VkMemoryAllocateInfo memory_info = {};
24081 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
24082 memory_info.pNext = &dedicated_memory_info;
24083 memory_info.allocationSize = memory_reqs.size;
24084
24085 bool pass;
24086 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
24087 ASSERT_TRUE(pass);
24088
24089 VkDeviceMemory buffer_memory;
24090 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
24091 ASSERT_VK_SUCCESS(err);
24092
24093 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
24094 ASSERT_VK_SUCCESS(err);
24095
24096 vkDestroyBuffer(m_device->device(), buffer, NULL);
24097 vkFreeMemory(m_device->device(), buffer_memory, NULL);
24098
24099 m_errorMonitor->VerifyNotFound();
24100 }
24101}
24102
24103TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
24104 VkResult err;
24105
24106 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
24107
Tony Barbour1fa09702017-03-16 12:09:08 -060024108 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024109 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
24110
24111 std::vector<const char *> device_extension_names;
24112 auto features = m_device->phy().features();
24113 // Artificially disable support for non-solid fill modes
24114 features.fillModeNonSolid = false;
24115 // The sacrificial device object
24116 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
24117
24118 VkRenderpassObj render_pass(&test_device);
24119
24120 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
24121 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
24122 pipeline_layout_ci.setLayoutCount = 0;
24123 pipeline_layout_ci.pSetLayouts = NULL;
24124
24125 VkPipelineLayout pipeline_layout;
24126 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
24127 ASSERT_VK_SUCCESS(err);
24128
24129 VkPipelineRasterizationStateCreateInfo rs_ci = {};
24130 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
24131 rs_ci.pNext = nullptr;
24132 rs_ci.lineWidth = 1.0f;
24133 rs_ci.rasterizerDiscardEnable = true;
24134
24135 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
24136 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
24137
24138 // Set polygonMode=FILL. No error is expected
24139 m_errorMonitor->ExpectSuccess();
24140 {
24141 VkPipelineObj pipe(&test_device);
24142 pipe.AddShader(&vs);
24143 pipe.AddShader(&fs);
24144 pipe.AddColorAttachment();
24145 // Set polygonMode to a good value
24146 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
24147 pipe.SetRasterization(&rs_ci);
24148 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
24149 }
24150 m_errorMonitor->VerifyNotFound();
24151
24152 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
24153}
24154
Dave Houlton1150cf52017-04-27 14:38:11 -060024155TEST_F(VkPositiveLayerTest, LongSemaphoreChain) {
Chris Forbes94196952017-04-06 16:30:59 -070024156 m_errorMonitor->ExpectSuccess();
24157
24158 ASSERT_NO_FATAL_FAILURE(Init());
24159 VkResult err;
24160
24161 std::vector<VkSemaphore> semaphores;
24162
24163 const int chainLength = 32768;
24164 VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
24165
24166 for (int i = 0; i < chainLength; i++) {
Dave Houlton1150cf52017-04-27 14:38:11 -060024167 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024168 VkSemaphore semaphore;
24169 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &semaphore);
24170 ASSERT_VK_SUCCESS(err);
24171
24172 semaphores.push_back(semaphore);
24173
Chris Forbesfc50aaa2017-05-01 10:20:17 -070024174 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO,
24175 nullptr,
24176 semaphores.size() > 1 ? 1u : 0u,
24177 semaphores.size() > 1 ? &semaphores[semaphores.size() - 2] : nullptr,
24178 &flags,
24179 0,
24180 nullptr,
24181 1,
24182 &semaphores[semaphores.size() - 1]};
Chris Forbes94196952017-04-06 16:30:59 -070024183 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
24184 ASSERT_VK_SUCCESS(err);
24185 }
24186
Dave Houlton1150cf52017-04-27 14:38:11 -060024187 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024188 VkFence fence;
24189 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24190 ASSERT_VK_SUCCESS(err);
Dave Houlton1150cf52017-04-27 14:38:11 -060024191 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &semaphores.back(), &flags, 0, nullptr, 0, nullptr};
Chris Forbes94196952017-04-06 16:30:59 -070024192 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24193 ASSERT_VK_SUCCESS(err);
24194
24195 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
24196
Dave Houlton1150cf52017-04-27 14:38:11 -060024197 for (auto semaphore : semaphores) vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Chris Forbes94196952017-04-06 16:30:59 -070024198
24199 vkDestroyFence(m_device->device(), fence, nullptr);
24200
24201 m_errorMonitor->VerifyNotFound();
24202}
24203
Mike Stroyanca855662017-05-02 11:06:27 -060024204extern "C" void *ReleaseNullFence(void *arg) {
24205 struct thread_data_struct *data = (struct thread_data_struct *)arg;
24206
24207 for (int i = 0; i < 40000; i++) {
24208 vkDestroyFence(data->device, VK_NULL_HANDLE, NULL);
24209 if (data->bailout) {
24210 break;
24211 }
24212 }
24213 return NULL;
24214}
24215
24216TEST_F(VkPositiveLayerTest, ThreadNullFenceCollision) {
24217 test_platform_thread thread;
24218
24219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
24220
24221 ASSERT_NO_FATAL_FAILURE(Init());
24222
24223 struct thread_data_struct data;
24224 data.device = m_device->device();
24225 data.bailout = false;
24226 m_errorMonitor->SetBailout(&data.bailout);
24227
24228 // Call vkDestroyFence of VK_NULL_HANDLE repeatedly using multiple threads.
24229 // There should be no validation error from collision of that non-object.
24230 test_platform_thread_create(&thread, ReleaseNullFence, (void *)&data);
24231 for (int i = 0; i < 40000; i++) {
24232 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
24233 }
24234 test_platform_thread_join(thread, NULL);
24235
24236 m_errorMonitor->SetBailout(NULL);
24237
24238 m_errorMonitor->VerifyNotFound();
24239}
24240
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024241#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024242TEST_F(VkPositiveLayerTest, LongFenceChain)
24243{
24244 m_errorMonitor->ExpectSuccess();
24245
Tony Barbour1fa09702017-03-16 12:09:08 -060024246 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024247 VkResult err;
24248
24249 std::vector<VkFence> fences;
24250
24251 const int chainLength = 32768;
24252
24253 for (int i = 0; i < chainLength; i++) {
24254 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
24255 VkFence fence;
24256 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24257 ASSERT_VK_SUCCESS(err);
24258
24259 fences.push_back(fence);
24260
24261 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
24262 0, nullptr, 0, nullptr };
24263 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24264 ASSERT_VK_SUCCESS(err);
24265
24266 }
24267
24268 // BOOM, stack overflow.
24269 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
24270
24271 for (auto fence : fences)
24272 vkDestroyFence(m_device->device(), fence, nullptr);
24273
24274 m_errorMonitor->VerifyNotFound();
24275}
24276#endif
24277
Cody Northrop1242dfd2016-07-13 17:24:59 -060024278#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060024279const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060024280static bool initialized = false;
24281static bool active = false;
24282
24283// Convert Intents to argv
24284// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024285std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024286 std::vector<std::string> args;
24287 JavaVM &vm = *app.activity->vm;
24288 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024289 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024290
24291 JNIEnv &env = *p_env;
24292 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024293 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024294 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024295 jmethodID get_string_extra_method =
24296 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024297 jvalue get_string_extra_args;
24298 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024299 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060024300
24301 std::string args_str;
24302 if (extra_str) {
24303 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
24304 args_str = extra_utf;
24305 env.ReleaseStringUTFChars(extra_str, extra_utf);
24306 env.DeleteLocalRef(extra_str);
24307 }
24308
24309 env.DeleteLocalRef(get_string_extra_args.l);
24310 env.DeleteLocalRef(intent);
24311 vm.DetachCurrentThread();
24312
24313 // split args_str
24314 std::stringstream ss(args_str);
24315 std::string arg;
24316 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024317 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024318 }
24319
24320 return args;
24321}
24322
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024323void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
24324 const char *const type_param = test_info.type_param();
24325 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060024326
24327 if (type_param != NULL || value_param != NULL) {
24328 error_message.append(", where ");
24329 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024330 error_message.append("TypeParam = ").append(type_param);
24331 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060024332 }
24333 if (value_param != NULL) {
24334 error_message.append("GetParam() = ").append(value_param);
24335 }
24336 }
24337}
24338
24339// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
24340class LogcatPrinter : public ::testing::EmptyTestEventListener {
24341 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024342 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024343 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
24344 }
24345
24346 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024347 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060024348 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024349 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060024350
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024351 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
24352 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060024353 }
24354
24355 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024356 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024357 std::string result;
24358 if (info.result()->Passed()) {
24359 result.append("[ OK ]");
24360 } else {
24361 result.append("[ FAILED ]");
24362 }
24363 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024364 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060024365
24366 if (::testing::GTEST_FLAG(print_time)) {
24367 std::ostringstream os;
24368 os << info.result()->elapsed_time();
24369 result.append(" (").append(os.str()).append(" ms)");
24370 }
24371
24372 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
24373 };
24374};
24375
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024376static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024377
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024378static void processCommand(struct android_app *app, int32_t cmd) {
24379 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024380 case APP_CMD_INIT_WINDOW: {
24381 if (app->window) {
24382 initialized = true;
24383 }
24384 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024385 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024386 case APP_CMD_GAINED_FOCUS: {
24387 active = true;
24388 break;
24389 }
24390 case APP_CMD_LOST_FOCUS: {
24391 active = false;
24392 break;
24393 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024394 }
24395}
24396
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024397void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024398 app_dummy();
24399
Cody Northrop1242dfd2016-07-13 17:24:59 -060024400 int vulkanSupport = InitVulkan();
24401 if (vulkanSupport == 0) {
24402 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
24403 return;
24404 }
24405
24406 app->onAppCmd = processCommand;
24407 app->onInputEvent = processInput;
24408
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024409 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024410 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024411 struct android_poll_source *source;
24412 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024413 if (source) {
24414 source->process(app, source);
24415 }
24416
24417 if (app->destroyRequested != 0) {
24418 VkTestFramework::Finish();
24419 return;
24420 }
24421 }
24422
24423 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024424 // Use the following key to send arguments to gtest, i.e.
24425 // --es args "--gtest_filter=-VkLayerTest.foo"
24426 const char key[] = "args";
24427 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024429 std::string filter = "";
24430 if (args.size() > 0) {
24431 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
24432 filter += args[0];
24433 } else {
24434 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
24435 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024436
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024437 int argc = 2;
24438 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
24439 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024440
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024441 // Route output to files until we can override the gtest output
24442 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
24443 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024444
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024445 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060024446
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024447 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060024448 listeners.Append(new LogcatPrinter);
24449
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024450 VkTestFramework::InitArgs(&argc, argv);
24451 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024452
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024453 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024455 if (result != 0) {
24456 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
24457 } else {
24458 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
24459 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024460
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024461 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024462
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024463 fclose(stdout);
24464 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024465
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024466 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024467 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024468 }
24469 }
24470}
24471#endif
24472
Tony Barbour300a6082015-04-07 13:44:53 -060024473int main(int argc, char **argv) {
24474 int result;
24475
Cody Northrop8e54a402016-03-08 22:25:52 -070024476#ifdef ANDROID
24477 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024478 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070024479#endif
24480
Tony Barbour300a6082015-04-07 13:44:53 -060024481 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060024482 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060024483
24484 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
24485
24486 result = RUN_ALL_TESTS();
24487
Tony Barbour6918cd52015-04-09 12:58:51 -060024488 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060024489 return result;
24490}