blob: c32a6375a701724a9b81fca1b891e897f1be0c62 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600341#ifdef _DEBUG
342 char embedded_code_string[2048];
343 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
344 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
345#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600346 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600347#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600348 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600349 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600350}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700353 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
355 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700356 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600357 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
358 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 }
Tony Barbour300a6082015-04-07 13:44:53 -0600360
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
362 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700363 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600364 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700365 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600366 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700367 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
369 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
370 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700371 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
372 }
373 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
374 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
375 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600376 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
378 InitState(features, flags);
379 }
380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700381 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700382 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600384 std::vector<const char *> instance_layer_names;
385 std::vector<const char *> instance_extension_names;
386 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600387
388 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700389 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600390 /*
391 * Since CreateDbgMsgCallback is an instance level extension call
392 * any extension / layer that utilizes that feature also needs
393 * to be enabled at create instance time.
394 */
Karl Schultz6addd812016-02-02 17:17:23 -0700395 // Use Threading layer first to protect others from
396 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700397 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800399 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700400 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600401 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700402 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600403
Ian Elliott2c1daf52016-05-12 09:41:46 -0600404 if (m_enableWSI) {
405 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
406 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
407#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
408#if defined(VK_USE_PLATFORM_ANDROID_KHR)
409 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_MIR_KHR)
412 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
415 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600417#if defined(VK_USE_PLATFORM_WIN32_KHR)
418 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_WIN32_KHR
420#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600421#if defined(VK_USE_PLATFORM_XCB_KHR)
422 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
423#elif defined(VK_USE_PLATFORM_XLIB_KHR)
424 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700425#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600426 }
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800430 this->app_info.pApplicationName = "layer_tests";
431 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600432 this->app_info.pEngineName = "unittest";
433 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600434 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600435
Tony Barbour15524c32015-04-29 17:34:29 -0600436 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
438
439 virtual void TearDown() {
440 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600441 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600442 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600443 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600446};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600448void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449 // Create identity matrix
450 int i;
451 struct vktriangle_vs_uniform data;
452
453 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700454 glm::mat4 View = glm::mat4(1.0f);
455 glm::mat4 Model = glm::mat4(1.0f);
456 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700458 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
460 memcpy(&data.mvp, &MVP[0][0], matrixSize);
461
Karl Schultz6addd812016-02-02 17:17:23 -0700462 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600463 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464 };
465
Karl Schultz6addd812016-02-02 17:17:23 -0700466 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 data.position[i][0] = tri_data[i].posX;
468 data.position[i][1] = tri_data[i].posY;
469 data.position[i][2] = tri_data[i].posZ;
470 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700471 data.color[i][0] = tri_data[i].r;
472 data.color[i][1] = tri_data[i].g;
473 data.color[i][2] = tri_data[i].b;
474 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475 }
476
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477 ASSERT_NO_FATAL_FAILURE(InitViewport());
478
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200479 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
480 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Karl Schultz6addd812016-02-02 17:17:23 -0700482 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800486 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487 pipelineobj.AddShader(&vs);
488 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 if (failMask & BsoFailLineWidth) {
490 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600492 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
494 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600495 }
496 if (failMask & BsoFailDepthBias) {
497 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600498 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600499 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600500 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600501 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600502 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700504 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700505 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600506 if (failMask & BsoFailViewport) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
508 }
509 if (failMask & BsoFailScissor) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
511 }
512 if (failMask & BsoFailBlend) {
513 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600514 VkPipelineColorBlendAttachmentState att_state = {};
515 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
516 att_state.blendEnable = VK_TRUE;
517 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 }
519 if (failMask & BsoFailDepthBounds) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
521 }
522 if (failMask & BsoFailStencilReadMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
524 }
525 if (failMask & BsoFailStencilWriteMask) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
527 }
528 if (failMask & BsoFailStencilReference) {
529 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
530 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600533 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700536 m_commandBuffer->BeginCommandBuffer();
537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538
Tony Barbourfe3351b2015-07-28 10:17:20 -0600539 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500540
541 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600542 if (failMask & BsoFailIndexBuffer) {
543 // Use DrawIndexed w/o an index buffer bound
544 DrawIndexed(3, 1, 0, 0, 0);
545 } else {
546 Draw(3, 1, 0, 0);
547 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500548
Mark Muellerd4914412016-06-13 17:52:06 -0600549 if (failMask & BsoFailCmdClearAttachments) {
550 VkClearAttachment color_attachment = {};
551 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700552 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600553 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
554
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600555 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600556 }
557
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500558 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700559 m_commandBuffer->EndRenderPass();
560 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600561 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562}
563
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
565 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500568 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600569 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500570 }
571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700573 // Make sure depthWriteEnable is set so that Depth fail test will work
574 // correctly
575 // Make sure stencilTestEnable is set so that Stencil fail test will work
576 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600577 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800578 stencil.failOp = VK_STENCIL_OP_KEEP;
579 stencil.passOp = VK_STENCIL_OP_KEEP;
580 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
581 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600582
583 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
584 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600585 ds_ci.pNext = NULL;
586 ds_ci.depthTestEnable = VK_FALSE;
587 ds_ci.depthWriteEnable = VK_TRUE;
588 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
589 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600590 if (failMask & BsoFailDepthBounds) {
591 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600592 ds_ci.maxDepthBounds = 0.0f;
593 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600594 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600595 ds_ci.stencilTestEnable = VK_TRUE;
596 ds_ci.front = stencil;
597 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600598
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600599 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600600 pipelineobj.SetViewport(m_viewports);
601 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600603 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 commandBuffer->BindPipeline(pipelineobj);
606 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500607}
608
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700610 public:
611 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600612};
613
Ian Elliott2c1daf52016-05-12 09:41:46 -0600614class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
616 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600617 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600618};
619
Mark Muellerdfe37552016-07-07 14:47:42 -0600620class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700621 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600622 enum eTestEnFlags {
623 eDoubleDelete,
624 eInvalidDeviceOffset,
625 eInvalidMemoryOffset,
626 eBindNullBuffer,
627 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600628 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 };
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
634 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635 return true;
636 }
637 VkDeviceSize offset_limit = 0;
638 if (eInvalidMemoryOffset == aTestFlag) {
639 VkBuffer vulkanBuffer;
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600646 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
650 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
652 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600654 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600656 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 }
658 if (eOffsetAlignment < offset_limit) {
659 return true;
660 }
661 return false;
662 }
663
664 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
666 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (eBindNullBuffer == aTestFlag) {
668 VulkanMemory = 0;
669 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
670 } else {
671 VkBufferCreateInfo buffer_create_info = {};
672 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
673 buffer_create_info.size = 32;
674 buffer_create_info.usage = aBufferUsage;
675
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600676 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677
678 CreateCurrent = true;
679
680 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 VkMemoryAllocateInfo memory_allocate_info = {};
684 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800685 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600686 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
687 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 if (!pass) {
689 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
690 return;
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 AllocateCurrent = true;
695 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600696 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
697 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 BoundCurrent = true;
699
700 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
701 }
702 }
703
704 ~VkBufferTest() {
705 if (CreateCurrent) {
706 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
707 }
708 if (AllocateCurrent) {
709 if (InvalidDeleteEn) {
710 union {
711 VkDeviceMemory device_memory;
712 unsigned long long index_access;
713 } bad_index;
714
715 bad_index.device_memory = VulkanMemory;
716 bad_index.index_access++;
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 }
720 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
721 }
722 }
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600725
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600727
728 void TestDoubleDestroy() {
729 // Destroy the buffer but leave the flag set, which will cause
730 // the buffer to be destroyed again in the destructor.
731 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
732 }
733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700734 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600735 bool AllocateCurrent;
736 bool BoundCurrent;
737 bool CreateCurrent;
738 bool InvalidDeleteEn;
739
740 VkBuffer VulkanBuffer;
741 VkDevice VulkanDevice;
742 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600743};
744
745class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600748 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700749 : BoundCurrent(false),
750 AttributeCount(aAttributeCount),
751 BindingCount(aBindingCount),
752 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600754 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
755 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700756 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
759 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
762 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
763 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
764 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
765 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600766
767 unsigned i = 0;
768 do {
769 VertexInputAttributeDescription[i].binding = BindId;
770 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
772 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 i++;
774 } while (AttributeCount < i);
775
776 i = 0;
777 do {
778 VertexInputBindingDescription[i].binding = BindId;
779 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600780 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600781 i++;
782 } while (BindingCount < i);
783 }
784
785 ~VkVerticesObj() {
786 if (VertexInputAttributeDescription) {
787 delete[] VertexInputAttributeDescription;
788 }
789 if (VertexInputBindingDescription) {
790 delete[] VertexInputBindingDescription;
791 }
792 }
793
794 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
796 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 return true;
798 }
799
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600800 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600801 VkDeviceSize *offsetList;
802 unsigned offsetCount;
803
804 if (aOffsetCount) {
805 offsetList = aOffsetList;
806 offsetCount = aOffsetCount;
807 } else {
808 offsetList = new VkDeviceSize[1]();
809 offsetCount = 1;
810 }
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600813 BoundCurrent = true;
814
815 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600817 }
818 }
819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700820 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600821 static uint32_t BindIdGenerator;
822
823 bool BoundCurrent;
824 unsigned AttributeCount;
825 unsigned BindingCount;
826 uint32_t BindId;
827
828 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
829 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
830 VkVertexInputBindingDescription *VertexInputBindingDescription;
831 VkConstantBufferObj VulkanMemoryBuffer;
832};
833
834uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500835// ********************************************************************************************************************
836// ********************************************************************************************************************
837// ********************************************************************************************************************
838// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700840 TEST_DESCRIPTION(
841 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
842 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600843
Tony Barbour1fa09702017-03-16 12:09:08 -0600844 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a pointer to a handle
848 // Expected to trigger an error with
849 // parameter_validation::validate_required_pointer
850 vkGetPhysicalDeviceFeatures(gpu(), NULL);
851 m_errorMonitor->VerifyFound();
852
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
854 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify NULL for pointer to array count
856 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600857 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify 0 for a required array count
862 // Expected to trigger an error with parameter_validation::validate_array
863 VkViewport view_port = {};
864 m_commandBuffer->SetViewport(0, 0, &view_port);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify NULL for a required array
869 // Expected to trigger an error with parameter_validation::validate_array
870 m_commandBuffer->SetViewport(0, 1, NULL);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify VK_NULL_HANDLE for a required handle
875 // Expected to trigger an error with
876 // parameter_validation::validate_required_handle
877 vkUnmapMemory(device(), VK_NULL_HANDLE);
878 m_errorMonitor->VerifyFound();
879
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
881 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882 // Specify VK_NULL_HANDLE for a required handle array entry
883 // Expected to trigger an error with
884 // parameter_validation::validate_required_handle_array
885 VkFence fence = VK_NULL_HANDLE;
886 vkResetFences(device(), 1, &fence);
887 m_errorMonitor->VerifyFound();
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags parameter
899 // Expected to trigger an error with parameter_validation::validate_flags
900 m_commandBuffer->SetStencilReference(0, 0);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600904 // Specify 0 for a required VkFlags array entry
905 // Expected to trigger an error with
906 // parameter_validation::validate_flags_array
907 VkSemaphore semaphore = VK_NULL_HANDLE;
908 VkPipelineStageFlags stageFlags = 0;
909 VkSubmitInfo submitInfo = {};
910 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
911 submitInfo.waitSemaphoreCount = 1;
912 submitInfo.pWaitSemaphores = &semaphore;
913 submitInfo.pWaitDstStageMask = &stageFlags;
914 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600917
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918TEST_F(VkLayerTest, ReservedParameter) {
919 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
920
Tony Barbour1fa09702017-03-16 12:09:08 -0600921 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600922
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600924 // Specify 0 for a reserved VkFlags parameter
925 // Expected to trigger an error with
926 // parameter_validation::validate_reserved_flags
927 VkEvent event_handle = VK_NULL_HANDLE;
928 VkEventCreateInfo event_info = {};
929 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
930 event_info.flags = 1;
931 vkCreateEvent(device(), &event_info, NULL, &event_handle);
932 m_errorMonitor->VerifyFound();
933}
934
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700936 TEST_DESCRIPTION(
937 "Specify an invalid VkStructureType for a Vulkan "
938 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939
Tony Barbour1fa09702017-03-16 12:09:08 -0600940 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600941
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943 // Zero struct memory, effectively setting sType to
944 // VK_STRUCTURE_TYPE_APPLICATION_INFO
945 // Expected to trigger an error with
946 // parameter_validation::validate_struct_type
947 VkMemoryAllocateInfo alloc_info = {};
948 VkDeviceMemory memory = VK_NULL_HANDLE;
949 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
950 m_errorMonitor->VerifyFound();
951
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600953 // Zero struct memory, effectively setting sType to
954 // VK_STRUCTURE_TYPE_APPLICATION_INFO
955 // Expected to trigger an error with
956 // parameter_validation::validate_struct_type_array
957 VkSubmitInfo submit_info = {};
958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
959 m_errorMonitor->VerifyFound();
960}
961
962TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600963 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600964
Tony Barbour1fa09702017-03-16 12:09:08 -0600965 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600966
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600968 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600969 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600970 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600971 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600972 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600973 // Zero-initialization will provide the correct sType
974 VkApplicationInfo app_info = {};
975 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
976 event_alloc_info.pNext = &app_info;
977 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
978 m_errorMonitor->VerifyFound();
979
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
981 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
983 // a function that has allowed pNext structure types and specify
984 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600985 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600987 VkMemoryAllocateInfo memory_alloc_info = {};
988 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
989 memory_alloc_info.pNext = &app_info;
990 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600991 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600992}
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
994TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600995 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600996
Tony Barbour1fa09702017-03-16 12:09:08 -0600997 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "does not fall within the begin..end "
1001 "range of the core VkFormat "
1002 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 // Specify an invalid VkFormat value
1004 // Expected to trigger an error with
1005 // parameter_validation::validate_ranged_enum
1006 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001008 m_errorMonitor->VerifyFound();
1009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001011 // Specify an invalid VkFlags bitmask value
1012 // Expected to trigger an error with parameter_validation::validate_flags
1013 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1015 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001016 m_errorMonitor->VerifyFound();
1017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001019 // Specify an invalid VkFlags array entry
1020 // Expected to trigger an error with
1021 // parameter_validation::validate_flags_array
1022 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001024 VkSubmitInfo submit_info = {};
1025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1026 submit_info.waitSemaphoreCount = 1;
1027 submit_info.pWaitSemaphores = &semaphore;
1028 submit_info.pWaitDstStageMask = &stage_flags;
1029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1030 m_errorMonitor->VerifyFound();
1031
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 // Specify an invalid VkBool32 value
1034 // Expected to trigger a warning with
1035 // parameter_validation::validate_bool32
1036 VkSampler sampler = VK_NULL_HANDLE;
1037 VkSamplerCreateInfo sampler_info = {};
1038 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1039 sampler_info.pNext = NULL;
1040 sampler_info.magFilter = VK_FILTER_NEAREST;
1041 sampler_info.minFilter = VK_FILTER_NEAREST;
1042 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1043 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1044 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1045 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1046 sampler_info.mipLodBias = 1.0;
1047 sampler_info.maxAnisotropy = 1;
1048 sampler_info.compareEnable = VK_FALSE;
1049 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1050 sampler_info.minLod = 1.0;
1051 sampler_info.maxLod = 1.0;
1052 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1053 sampler_info.unnormalizedCoordinates = VK_FALSE;
1054 // Not VK_TRUE or VK_FALSE
1055 sampler_info.anisotropyEnable = 3;
1056 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1057 m_errorMonitor->VerifyFound();
1058}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001059
1060TEST_F(VkLayerTest, FailedReturnValue) {
1061 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1062
Tony Barbour1fa09702017-03-16 12:09:08 -06001063 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001064
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 // Find an unsupported image format
1066 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1067 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1068 VkFormat format = static_cast<VkFormat>(f);
1069 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001070 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001071 unsupported = format;
1072 break;
1073 }
1074 }
1075
1076 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1078 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001079 // Specify an unsupported VkFormat value to generate a
1080 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1081 // Expected to trigger a warning from
1082 // parameter_validation::validate_result
1083 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001084 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1085 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001086 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1087 m_errorMonitor->VerifyFound();
1088 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001089}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090
1091TEST_F(VkLayerTest, UpdateBufferAlignment) {
1092 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094
Tony Barbour1fa09702017-03-16 12:09:08 -06001095 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096
1097 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1098 vk_testing::Buffer buffer;
1099 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1100
Tony Barbour552f6c02016-12-21 14:34:07 -07001101 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001102 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using dataSize that is < 0
1113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001114 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1116 m_errorMonitor->VerifyFound();
1117
1118 // Introduce failure by using dataSize that is > 65536
1119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001120 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001121 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1122 m_errorMonitor->VerifyFound();
1123
Tony Barbour552f6c02016-12-21 14:34:07 -07001124 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125}
1126
1127TEST_F(VkLayerTest, FillBufferAlignment) {
1128 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1129
Tony Barbour1fa09702017-03-16 12:09:08 -06001130 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001131
1132 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1133 vk_testing::Buffer buffer;
1134 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1135
Tony Barbour552f6c02016-12-21 14:34:07 -07001136 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001137
1138 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001140 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1141 m_errorMonitor->VerifyFound();
1142
1143 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001145 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1146 m_errorMonitor->VerifyFound();
1147
1148 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001150 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1151 m_errorMonitor->VerifyFound();
1152
Tony Barbour552f6c02016-12-21 14:34:07 -07001153 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001154}
Dustin Graves40f35822016-06-23 11:12:53 -06001155
Cortd889ff92016-07-27 09:51:27 -07001156TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1157 VkResult err;
1158
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001159 TEST_DESCRIPTION(
1160 "Attempt to use a non-solid polygon fill mode in a "
1161 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001162
Tony Barbour1fa09702017-03-16 12:09:08 -06001163 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1165
1166 std::vector<const char *> device_extension_names;
1167 auto features = m_device->phy().features();
1168 // Artificially disable support for non-solid fill modes
1169 features.fillModeNonSolid = false;
1170 // The sacrificial device object
1171 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1172
1173 VkRenderpassObj render_pass(&test_device);
1174
1175 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1176 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1177 pipeline_layout_ci.setLayoutCount = 0;
1178 pipeline_layout_ci.pSetLayouts = NULL;
1179
1180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001181 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001182 ASSERT_VK_SUCCESS(err);
1183
1184 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1185 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1186 rs_ci.pNext = nullptr;
1187 rs_ci.lineWidth = 1.0f;
1188 rs_ci.rasterizerDiscardEnable = true;
1189
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001190 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1191 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001192
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001193 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1195 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001196 {
1197 VkPipelineObj pipe(&test_device);
1198 pipe.AddShader(&vs);
1199 pipe.AddShader(&fs);
1200 pipe.AddColorAttachment();
1201 // Introduce failure by setting unsupported polygon mode
1202 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1203 pipe.SetRasterization(&rs_ci);
1204 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1205 }
1206 m_errorMonitor->VerifyFound();
1207
1208 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1210 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001211 {
1212 VkPipelineObj pipe(&test_device);
1213 pipe.AddShader(&vs);
1214 pipe.AddShader(&fs);
1215 pipe.AddColorAttachment();
1216 // Introduce failure by setting unsupported polygon mode
1217 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1218 pipe.SetRasterization(&rs_ci);
1219 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1220 }
1221 m_errorMonitor->VerifyFound();
1222
Cortd889ff92016-07-27 09:51:27 -07001223 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1224}
1225
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001226#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001228{
1229 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001230 VkFenceCreateInfo fenceInfo = {};
1231 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1232 fenceInfo.pNext = NULL;
1233 fenceInfo.flags = 0;
1234
Mike Weiblencce7ec72016-10-17 19:33:05 -06001235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001236
Tony Barbour1fa09702017-03-16 12:09:08 -06001237 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001238
1239 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1240 vk_testing::Buffer buffer;
1241 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242
Tony Barbourfe3351b2015-07-28 10:17:20 -06001243 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001244 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001245 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
1247 testFence.init(*m_device, fenceInfo);
1248
1249 // Bypass framework since it does the waits automatically
1250 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001251 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001252 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1253 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001254 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001255 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001256 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001257 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001258 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001259 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001260 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001261
1262 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263 ASSERT_VK_SUCCESS( err );
1264
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001265 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001266 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001268 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001269}
1270
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001271TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001272{
1273 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 VkFenceCreateInfo fenceInfo = {};
1275 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1276 fenceInfo.pNext = NULL;
1277 fenceInfo.flags = 0;
1278
Mike Weiblencce7ec72016-10-17 19:33:05 -06001279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001280
Tony Barbour1fa09702017-03-16 12:09:08 -06001281 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001282 ASSERT_NO_FATAL_FAILURE(InitViewport());
1283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1284
Tony Barbourfe3351b2015-07-28 10:17:20 -06001285 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001286 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001287 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001288
1289 testFence.init(*m_device, fenceInfo);
1290
1291 // Bypass framework since it does the waits automatically
1292 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001293 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001294 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1295 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001296 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001297 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001298 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001299 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001300 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001301 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001302 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001303
1304 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001305 ASSERT_VK_SUCCESS( err );
1306
Jon Ashburnf19916e2016-01-11 13:12:43 -07001307 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001308 VkCommandBufferBeginInfo info = {};
1309 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1310 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001311 info.renderPass = VK_NULL_HANDLE;
1312 info.subpass = 0;
1313 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001314 info.occlusionQueryEnable = VK_FALSE;
1315 info.queryFlags = 0;
1316 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001317
1318 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001319 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001320
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001321 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001322}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001323#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001324
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001325TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1326 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1327
Tony Barbour1fa09702017-03-16 12:09:08 -06001328 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001329
1330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1331 VkBuffer buffer;
1332 VkBufferCreateInfo buf_info = {};
1333 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1334 buf_info.pNext = NULL;
1335 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1336 buf_info.size = 2048;
1337 buf_info.queueFamilyIndexCount = 0;
1338 buf_info.pQueueFamilyIndices = NULL;
1339 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1340 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1341 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1342 m_errorMonitor->VerifyFound();
1343
1344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1345 VkImage image;
1346 VkImageCreateInfo image_create_info = {};
1347 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1348 image_create_info.pNext = NULL;
1349 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1350 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1351 image_create_info.extent.width = 512;
1352 image_create_info.extent.height = 64;
1353 image_create_info.extent.depth = 1;
1354 image_create_info.mipLevels = 1;
1355 image_create_info.arrayLayers = 1;
1356 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1357 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1358 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1359 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1360 image_create_info.queueFamilyIndexCount = 0;
1361 image_create_info.pQueueFamilyIndices = NULL;
1362 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1363 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1364 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1365 m_errorMonitor->VerifyFound();
1366}
1367
Dave Houlton829c0d82017-01-24 15:09:17 -07001368TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1369 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1370
1371 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001372 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001373 ASSERT_NO_FATAL_FAILURE(
1374 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001375 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001376
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001377 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001378 device_features.sparseResidencyImage2D = VK_FALSE;
1379 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001380 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001381
1382 VkImage image = VK_NULL_HANDLE;
1383 VkResult result = VK_RESULT_MAX_ENUM;
1384 VkImageCreateInfo image_create_info = {};
1385 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1386 image_create_info.pNext = NULL;
1387 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1388 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1389 image_create_info.extent.width = 512;
1390 image_create_info.extent.height = 1;
1391 image_create_info.extent.depth = 1;
1392 image_create_info.mipLevels = 1;
1393 image_create_info.arrayLayers = 1;
1394 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1395 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1396 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1397 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1398 image_create_info.queueFamilyIndexCount = 0;
1399 image_create_info.pQueueFamilyIndices = NULL;
1400 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1401 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1402
1403 // 1D image w/ sparse residency is an error
1404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1405 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1406 m_errorMonitor->VerifyFound();
1407 if (VK_SUCCESS == result) {
1408 vkDestroyImage(m_device->device(), image, NULL);
1409 image = VK_NULL_HANDLE;
1410 }
1411
1412 // 2D image w/ sparse residency when feature isn't available
1413 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1414 image_create_info.extent.height = 64;
1415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1416 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1417 m_errorMonitor->VerifyFound();
1418 if (VK_SUCCESS == result) {
1419 vkDestroyImage(m_device->device(), image, NULL);
1420 image = VK_NULL_HANDLE;
1421 }
1422
1423 // 3D image w/ sparse residency when feature isn't available
1424 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1425 image_create_info.extent.depth = 8;
1426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1427 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1428 m_errorMonitor->VerifyFound();
1429 if (VK_SUCCESS == result) {
1430 vkDestroyImage(m_device->device(), image, NULL);
1431 image = VK_NULL_HANDLE;
1432 }
1433}
1434
1435TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1436 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1437
1438 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001439 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001440 ASSERT_NO_FATAL_FAILURE(
1441 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001442 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001443
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001444 // These tests require that the device support sparse residency for 2D images
1445 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1446 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001447 return;
1448 }
1449
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001450 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001451 device_features.sparseResidency2Samples = VK_FALSE;
1452 device_features.sparseResidency4Samples = VK_FALSE;
1453 device_features.sparseResidency8Samples = VK_FALSE;
1454 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001455 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001456
1457 VkImage image = VK_NULL_HANDLE;
1458 VkResult result = VK_RESULT_MAX_ENUM;
1459 VkImageCreateInfo image_create_info = {};
1460 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1461 image_create_info.pNext = NULL;
1462 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1463 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1464 image_create_info.extent.width = 64;
1465 image_create_info.extent.height = 64;
1466 image_create_info.extent.depth = 1;
1467 image_create_info.mipLevels = 1;
1468 image_create_info.arrayLayers = 1;
1469 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1470 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1471 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1472 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1473 image_create_info.queueFamilyIndexCount = 0;
1474 image_create_info.pQueueFamilyIndices = NULL;
1475 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1476 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1477
1478 // 2D image w/ sparse residency and linear tiling is an error
1479 m_errorMonitor->SetDesiredFailureMsg(
1480 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1481 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1482 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1483 m_errorMonitor->VerifyFound();
1484 if (VK_SUCCESS == result) {
1485 vkDestroyImage(m_device->device(), image, NULL);
1486 image = VK_NULL_HANDLE;
1487 }
1488 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1489
1490 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1491 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1493 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1494 m_errorMonitor->VerifyFound();
1495 if (VK_SUCCESS == result) {
1496 vkDestroyImage(m_device->device(), image, NULL);
1497 image = VK_NULL_HANDLE;
1498 }
1499
1500 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1502 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1503 m_errorMonitor->VerifyFound();
1504 if (VK_SUCCESS == result) {
1505 vkDestroyImage(m_device->device(), image, NULL);
1506 image = VK_NULL_HANDLE;
1507 }
1508
1509 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1511 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1512 m_errorMonitor->VerifyFound();
1513 if (VK_SUCCESS == result) {
1514 vkDestroyImage(m_device->device(), image, NULL);
1515 image = VK_NULL_HANDLE;
1516 }
1517
1518 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1520 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1521 m_errorMonitor->VerifyFound();
1522 if (VK_SUCCESS == result) {
1523 vkDestroyImage(m_device->device(), image, NULL);
1524 image = VK_NULL_HANDLE;
1525 }
1526}
1527
Tobin Ehlisf11be982016-05-11 13:52:53 -06001528TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001529 TEST_DESCRIPTION(
1530 "Create a buffer and image, allocate memory, and bind the "
1531 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001532 VkResult err;
1533 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001534 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
Tobin Ehlis077ded32016-05-12 17:39:13 -06001536 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001537 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001538 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001539 VkDeviceMemory mem; // buffer will be bound first
1540 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001541 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001542 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001543
1544 VkBufferCreateInfo buf_info = {};
1545 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1546 buf_info.pNext = NULL;
1547 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1548 buf_info.size = 256;
1549 buf_info.queueFamilyIndexCount = 0;
1550 buf_info.pQueueFamilyIndices = NULL;
1551 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1552 buf_info.flags = 0;
1553 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1554 ASSERT_VK_SUCCESS(err);
1555
Tobin Ehlis077ded32016-05-12 17:39:13 -06001556 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001557
1558 VkImageCreateInfo image_create_info = {};
1559 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1560 image_create_info.pNext = NULL;
1561 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1562 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1563 image_create_info.extent.width = 64;
1564 image_create_info.extent.height = 64;
1565 image_create_info.extent.depth = 1;
1566 image_create_info.mipLevels = 1;
1567 image_create_info.arrayLayers = 1;
1568 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001569 // Image tiling must be optimal to trigger error when aliasing linear buffer
1570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1572 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1573 image_create_info.queueFamilyIndexCount = 0;
1574 image_create_info.pQueueFamilyIndices = NULL;
1575 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1576 image_create_info.flags = 0;
1577
Tobin Ehlisf11be982016-05-11 13:52:53 -06001578 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1579 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1581 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001582
Tobin Ehlis077ded32016-05-12 17:39:13 -06001583 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1584
1585 VkMemoryAllocateInfo alloc_info = {};
1586 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1587 alloc_info.pNext = NULL;
1588 alloc_info.memoryTypeIndex = 0;
1589 // Ensure memory is big enough for both bindings
1590 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001591 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1592 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 return;
1598 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1600 ASSERT_VK_SUCCESS(err);
1601 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1602 ASSERT_VK_SUCCESS(err);
1603
Rene Lindsayd14f5572016-12-16 14:57:18 -07001604 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1605
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001607 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001608 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1609 m_errorMonitor->VerifyFound();
1610
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001611 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001612 // aliasing buffer2
1613 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1614 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001615 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1616 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001617 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001618 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001620 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001621 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001622 m_errorMonitor->VerifyFound();
1623
1624 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001625 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001626 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001627 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001628 vkFreeMemory(m_device->device(), mem, NULL);
1629 vkFreeMemory(m_device->device(), mem_img, NULL);
1630}
1631
Tobin Ehlis35372522016-05-12 08:32:31 -06001632TEST_F(VkLayerTest, InvalidMemoryMapping) {
1633 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1634 VkResult err;
1635 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001636 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001637
1638 VkBuffer buffer;
1639 VkDeviceMemory mem;
1640 VkMemoryRequirements mem_reqs;
1641
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001642 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1643
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 VkBufferCreateInfo buf_info = {};
1645 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1646 buf_info.pNext = NULL;
1647 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1648 buf_info.size = 256;
1649 buf_info.queueFamilyIndexCount = 0;
1650 buf_info.pQueueFamilyIndices = NULL;
1651 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1652 buf_info.flags = 0;
1653 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1654 ASSERT_VK_SUCCESS(err);
1655
1656 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1657 VkMemoryAllocateInfo alloc_info = {};
1658 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1659 alloc_info.pNext = NULL;
1660 alloc_info.memoryTypeIndex = 0;
1661
1662 // Ensure memory is big enough for both bindings
1663 static const VkDeviceSize allocation_size = 0x10000;
1664 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001665 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001666 if (!pass) {
1667 vkDestroyBuffer(m_device->device(), buffer, NULL);
1668 return;
1669 }
1670 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1671 ASSERT_VK_SUCCESS(err);
1672
1673 uint8_t *pData;
1674 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1677 m_errorMonitor->VerifyFound();
1678 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001679 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1682 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1683 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001684 m_errorMonitor->VerifyFound();
1685
1686 // Unmap the memory to avoid re-map error
1687 vkUnmapMemory(m_device->device(), mem);
1688 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1690 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1691 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001692 m_errorMonitor->VerifyFound();
1693 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1695 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001696 m_errorMonitor->VerifyFound();
1697 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkUnmapMemory(m_device->device(), mem);
1700 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001701
Tobin Ehlis35372522016-05-12 08:32:31 -06001702 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001704 ASSERT_VK_SUCCESS(err);
1705 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001706 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001707 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001708 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001710 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1711 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001712
Tobin Ehlis35372522016-05-12 08:32:31 -06001713 // Now flush range that oversteps mapped range
1714 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001715 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001716 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001717 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001718 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1720 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1721 m_errorMonitor->VerifyFound();
1722
1723 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1724 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001725 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001726 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001727 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001728 mmr.size = VK_WHOLE_SIZE;
1729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001730 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1731 m_errorMonitor->VerifyFound();
1732
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001733#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001734 // Some platforms have an atomsize of 1 which makes the test meaningless
1735 if (atom_size > 3) {
1736 // Now with an offset NOT a multiple of the device limit
1737 vkUnmapMemory(m_device->device(), mem);
1738 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1739 ASSERT_VK_SUCCESS(err);
1740 mmr.offset = 3; // Not a multiple of atom_size
1741 mmr.size = VK_WHOLE_SIZE;
1742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1743 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1744 m_errorMonitor->VerifyFound();
1745
1746 // Now with a size NOT a multiple of the device limit
1747 vkUnmapMemory(m_device->device(), mem);
1748 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1749 ASSERT_VK_SUCCESS(err);
1750 mmr.offset = atom_size;
1751 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1753 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1754 m_errorMonitor->VerifyFound();
1755 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001756#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001757 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1758 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001759 if (!pass) {
1760 vkFreeMemory(m_device->device(), mem, NULL);
1761 vkDestroyBuffer(m_device->device(), buffer, NULL);
1762 return;
1763 }
1764 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1765 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1766
1767 vkDestroyBuffer(m_device->device(), buffer, NULL);
1768 vkFreeMemory(m_device->device(), mem, NULL);
1769}
1770
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001771#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001772TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1773 VkResult err;
1774 bool pass;
1775
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001776 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1777 // following declaration (which is temporarily being moved below):
1778 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001779 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001780 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001781 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001782 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001783 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001784 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001785
Tony Barbour1fa09702017-03-16 12:09:08 -06001786 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001787
Ian Elliott3f06ce52016-04-29 14:46:21 -06001788#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1789#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1790 // Use the functions from the VK_KHR_android_surface extension without
1791 // enabling that extension:
1792
1793 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001794 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1796 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001797 pass = (err != VK_SUCCESS);
1798 ASSERT_TRUE(pass);
1799 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001800#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001801
Ian Elliott3f06ce52016-04-29 14:46:21 -06001802#if defined(VK_USE_PLATFORM_MIR_KHR)
1803 // Use the functions from the VK_KHR_mir_surface extension without enabling
1804 // that extension:
1805
1806 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001807 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1810 pass = (err != VK_SUCCESS);
1811 ASSERT_TRUE(pass);
1812 m_errorMonitor->VerifyFound();
1813
1814 // Tell whether an mir_connection supports presentation:
1815 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1817 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001819#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001820
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1822 // Use the functions from the VK_KHR_wayland_surface extension without
1823 // enabling that extension:
1824
1825 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001826 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1828 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001829 pass = (err != VK_SUCCESS);
1830 ASSERT_TRUE(pass);
1831 m_errorMonitor->VerifyFound();
1832
1833 // Tell whether an wayland_display supports presentation:
1834 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1836 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001838#endif // VK_USE_PLATFORM_WAYLAND_KHR
1839#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001840
Ian Elliott3f06ce52016-04-29 14:46:21 -06001841#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001845 // Use the functions from the VK_KHR_win32_surface extension without
1846 // enabling that extension:
1847
1848 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001849 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1851 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001852 pass = (err != VK_SUCCESS);
1853 ASSERT_TRUE(pass);
1854 m_errorMonitor->VerifyFound();
1855
1856 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001858 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001860// Set this (for now, until all platforms are supported and tested):
1861#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001862#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001863#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001864 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1865 // TO NON-LINUX PLATFORMS:
1866 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001867#endif
1868#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001869 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001875 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001881 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001882 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1884 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001889
Ian Elliott12630812016-04-29 14:35:43 -06001890#if defined(VK_USE_PLATFORM_XLIB_KHR)
1891 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1892 // that extension:
1893
1894 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001895 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001897 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1898 pass = (err != VK_SUCCESS);
1899 ASSERT_TRUE(pass);
1900 m_errorMonitor->VerifyFound();
1901
1902 // Tell whether an Xlib VisualID supports presentation:
1903 Display *dpy = NULL;
1904 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001906 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1907 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001908// Set this (for now, until all platforms are supported and tested):
1909#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001910#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001911
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001912// Use the functions from the VK_KHR_surface extension without enabling
1913// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001914
Ian Elliott489eec02016-05-05 14:12:44 -06001915#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001916 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001918 vkDestroySurfaceKHR(instance(), surface, NULL);
1919 m_errorMonitor->VerifyFound();
1920
1921 // Check if surface supports presentation:
1922 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001924 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1925 pass = (err != VK_SUCCESS);
1926 ASSERT_TRUE(pass);
1927 m_errorMonitor->VerifyFound();
1928
1929 // Check surface capabilities:
1930 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1932 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Check surface formats:
1938 uint32_t format_count = 0;
1939 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1941 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Check surface present modes:
1947 uint32_t present_mode_count = 0;
1948 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1950 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001951 pass = (err != VK_SUCCESS);
1952 ASSERT_TRUE(pass);
1953 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001954#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001955
Ian Elliott1c32c772016-04-28 14:47:13 -06001956 // Use the functions from the VK_KHR_swapchain extension without enabling
1957 // that extension:
1958
1959 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1962 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001963 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001964 pass = (err != VK_SUCCESS);
1965 ASSERT_TRUE(pass);
1966 m_errorMonitor->VerifyFound();
1967
1968 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1970 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001971 pass = (err != VK_SUCCESS);
1972 ASSERT_TRUE(pass);
1973 m_errorMonitor->VerifyFound();
1974
Chris Forbeseb7d5502016-09-13 18:19:21 +12001975 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1976 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1977 VkFence fence;
1978 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1979
Ian Elliott1c32c772016-04-28 14:47:13 -06001980 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001982 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001983 pass = (err != VK_SUCCESS);
1984 ASSERT_TRUE(pass);
1985 m_errorMonitor->VerifyFound();
1986
Chris Forbeseb7d5502016-09-13 18:19:21 +12001987 vkDestroyFence(m_device->device(), fence, nullptr);
1988
Ian Elliott1c32c772016-04-28 14:47:13 -06001989 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001990 //
1991 // NOTE: Currently can't test this because a real swapchain is needed (as
1992 // opposed to the fake one we created) in order for the layer to lookup the
1993 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001994
1995 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001997 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1998 m_errorMonitor->VerifyFound();
1999}
Chris Forbes09368e42016-10-13 11:59:22 +13002000#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06002001
Karl Schultz6addd812016-02-02 17:17:23 -07002002TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2003 VkResult err;
2004 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002005
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2007 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002008
Tony Barbour1fa09702017-03-16 12:09:08 -06002009 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002010
2011 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002012 VkImage image;
2013 VkDeviceMemory mem;
2014 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002015
Karl Schultz6addd812016-02-02 17:17:23 -07002016 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2017 const int32_t tex_width = 32;
2018 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002019
Tony Barboureb254902015-07-15 12:50:33 -06002020 VkImageCreateInfo image_create_info = {};
2021 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002022 image_create_info.pNext = NULL;
2023 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2024 image_create_info.format = tex_format;
2025 image_create_info.extent.width = tex_width;
2026 image_create_info.extent.height = tex_height;
2027 image_create_info.extent.depth = 1;
2028 image_create_info.mipLevels = 1;
2029 image_create_info.arrayLayers = 1;
2030 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2031 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2032 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2033 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002034 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002035
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002036 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002037 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002038 mem_alloc.pNext = NULL;
2039 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040
Chia-I Wuf7458c52015-10-26 21:10:41 +08002041 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002042 ASSERT_VK_SUCCESS(err);
2043
Karl Schultz6addd812016-02-02 17:17:23 -07002044 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002045
Mark Lobodzinski23065352015-05-29 09:32:35 -05002046 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002047
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002048 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002049 if (!pass) { // If we can't find any unmappable memory this test doesn't
2050 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002051 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002052 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002053 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002054
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002055 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002056 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002057 ASSERT_VK_SUCCESS(err);
2058
2059 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002060 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002061 ASSERT_VK_SUCCESS(err);
2062
2063 // Map memory as if to initialize the image
2064 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002065 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002066
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002067 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002068
Chia-I Wuf7458c52015-10-26 21:10:41 +08002069 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002070 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002071}
2072
Karl Schultz6addd812016-02-02 17:17:23 -07002073TEST_F(VkLayerTest, RebindMemory) {
2074 VkResult err;
2075 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002078
Tony Barbour1fa09702017-03-16 12:09:08 -06002079 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002080
2081 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002082 VkImage image;
2083 VkDeviceMemory mem1;
2084 VkDeviceMemory mem2;
2085 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2088 const int32_t tex_width = 32;
2089 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002090
Tony Barboureb254902015-07-15 12:50:33 -06002091 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002092 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2093 image_create_info.pNext = NULL;
2094 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2095 image_create_info.format = tex_format;
2096 image_create_info.extent.width = tex_width;
2097 image_create_info.extent.height = tex_height;
2098 image_create_info.extent.depth = 1;
2099 image_create_info.mipLevels = 1;
2100 image_create_info.arrayLayers = 1;
2101 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2102 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2103 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2104 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002105
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002106 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002107 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2108 mem_alloc.pNext = NULL;
2109 mem_alloc.allocationSize = 0;
2110 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce failure, do NOT set memProps to
2113 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002114 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002115 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002116 ASSERT_VK_SUCCESS(err);
2117
Karl Schultz6addd812016-02-02 17:17:23 -07002118 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002119
2120 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002121 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002122 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002123
2124 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002125 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002126 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002127 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002128 ASSERT_VK_SUCCESS(err);
2129
2130 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002131 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002132 ASSERT_VK_SUCCESS(err);
2133
Karl Schultz6addd812016-02-02 17:17:23 -07002134 // Introduce validation failure, try to bind a different memory object to
2135 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002136 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002137
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002138 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002139
Chia-I Wuf7458c52015-10-26 21:10:41 +08002140 vkDestroyImage(m_device->device(), image, NULL);
2141 vkFreeMemory(m_device->device(), mem1, NULL);
2142 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002143}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002144
Karl Schultz6addd812016-02-02 17:17:23 -07002145TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002146 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002147
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2149 "submitted in SIGNALED state. Fences "
2150 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002151
2152 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002153 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2154 fenceInfo.pNext = NULL;
2155 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002156
Tony Barbour1fa09702017-03-16 12:09:08 -06002157 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002158 ASSERT_NO_FATAL_FAILURE(InitViewport());
2159 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2160
Tony Barbour552f6c02016-12-21 14:34:07 -07002161 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002163 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002164
2165 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002166
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002167 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002168 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2169 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002170 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002171 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002172 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002173 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002174 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002175 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002176 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002177
2178 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002179 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002180
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002181 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002182}
Chris Forbes4e44c912016-06-16 10:20:00 +12002183
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002184TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002185 TEST_DESCRIPTION(
2186 "Specify wrong usage for image then create conflicting view of image "
2187 "Initialize buffer with wrong usage then perform copy expecting errors "
2188 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002190
Tony Barbour1fa09702017-03-16 12:09:08 -06002191 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002192 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002193 if (!format) {
2194 printf(" No Depth + Stencil format found. Skipped.\n");
2195 return;
2196 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002197
Tony Barbourf92621a2016-05-02 14:28:12 -06002198 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002199 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002200 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002201 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002202
Tony Barbourf92621a2016-05-02 14:28:12 -06002203 VkImageView dsv;
2204 VkImageViewCreateInfo dsvci = {};
2205 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2206 dsvci.image = image.handle();
2207 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002208 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002209 dsvci.subresourceRange.layerCount = 1;
2210 dsvci.subresourceRange.baseMipLevel = 0;
2211 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002212 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002213
Tony Barbourf92621a2016-05-02 14:28:12 -06002214 // Create a view with depth / stencil aspect for image with different usage
2215 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002217 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002218
2219 // Initialize buffer with TRANSFER_DST usage
2220 vk_testing::Buffer buffer;
2221 VkMemoryPropertyFlags reqs = 0;
2222 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2223 VkBufferImageCopy region = {};
2224 region.bufferRowLength = 128;
2225 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002226 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002227 region.imageSubresource.layerCount = 1;
2228 region.imageExtent.height = 16;
2229 region.imageExtent.width = 16;
2230 region.imageExtent.depth = 1;
2231
Mark Lobodzinski80871462017-02-16 10:37:27 -07002232 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002233 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002234
Chris Forbesda581202016-10-06 18:25:26 +13002235 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Chris Forbesda581202016-10-06 18:25:26 +13002238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002239 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2240 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002241 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002242}
Tony Barbour75d79f02016-08-30 09:39:07 -06002243
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002244TEST_F(VkLayerTest, LeakAnObject) {
2245 VkResult err;
2246
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002247 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002248
2249 // Note that we have to create a new device since destroying the
2250 // framework's device causes Teardown() to fail and just calling Teardown
2251 // will destroy the errorMonitor.
2252
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002254
Tony Barbour1fa09702017-03-16 12:09:08 -06002255 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002256
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002257 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002258 std::vector<VkDeviceQueueCreateInfo> queue_info;
2259 queue_info.reserve(queue_props.size());
2260 std::vector<std::vector<float>> queue_priorities;
2261 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2262 VkDeviceQueueCreateInfo qi = {};
2263 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2264 qi.pNext = NULL;
2265 qi.queueFamilyIndex = i;
2266 qi.queueCount = queue_props[i].queueCount;
2267 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2268 qi.pQueuePriorities = queue_priorities[i].data();
2269 queue_info.push_back(qi);
2270 }
2271
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002272 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002273
2274 // The sacrificial device object
2275 VkDevice testDevice;
2276 VkDeviceCreateInfo device_create_info = {};
2277 auto features = m_device->phy().features();
2278 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2279 device_create_info.pNext = NULL;
2280 device_create_info.queueCreateInfoCount = queue_info.size();
2281 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002282 device_create_info.enabledLayerCount = 0;
2283 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284 device_create_info.pEnabledFeatures = &features;
2285 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2286 ASSERT_VK_SUCCESS(err);
2287
2288 VkFence fence;
2289 VkFenceCreateInfo fence_create_info = {};
2290 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2291 fence_create_info.pNext = NULL;
2292 fence_create_info.flags = 0;
2293 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2294 ASSERT_VK_SUCCESS(err);
2295
2296 // Induce failure by not calling vkDestroyFence
2297 vkDestroyDevice(testDevice, NULL);
2298 m_errorMonitor->VerifyFound();
2299}
2300
2301TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002302 TEST_DESCRIPTION(
2303 "Allocate command buffers from one command pool and "
2304 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Tony Barbour1fa09702017-03-16 12:09:08 -06002308 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309 VkCommandPool command_pool_one;
2310 VkCommandPool command_pool_two;
2311
2312 VkCommandPoolCreateInfo pool_create_info{};
2313 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2314 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2315 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2316
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002317 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002318
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002319 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002320
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002321 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002325 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002327 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002328
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002329 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002330
2331 m_errorMonitor->VerifyFound();
2332
2333 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2334 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2335}
2336
2337TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2338 VkResult err;
2339
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002340 TEST_DESCRIPTION(
2341 "Allocate descriptor sets from one DS pool and "
2342 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002343
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002345
Tony Barbour1fa09702017-03-16 12:09:08 -06002346 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2348
2349 VkDescriptorPoolSize ds_type_count = {};
2350 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2351 ds_type_count.descriptorCount = 1;
2352
2353 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2354 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2355 ds_pool_ci.pNext = NULL;
2356 ds_pool_ci.flags = 0;
2357 ds_pool_ci.maxSets = 1;
2358 ds_pool_ci.poolSizeCount = 1;
2359 ds_pool_ci.pPoolSizes = &ds_type_count;
2360
2361 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 // Create a second descriptor pool
2366 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002367 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002368 ASSERT_VK_SUCCESS(err);
2369
2370 VkDescriptorSetLayoutBinding dsl_binding = {};
2371 dsl_binding.binding = 0;
2372 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2373 dsl_binding.descriptorCount = 1;
2374 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2375 dsl_binding.pImmutableSamplers = NULL;
2376
2377 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2378 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2379 ds_layout_ci.pNext = NULL;
2380 ds_layout_ci.bindingCount = 1;
2381 ds_layout_ci.pBindings = &dsl_binding;
2382
2383 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002385 ASSERT_VK_SUCCESS(err);
2386
2387 VkDescriptorSet descriptorSet;
2388 VkDescriptorSetAllocateInfo alloc_info = {};
2389 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2390 alloc_info.descriptorSetCount = 1;
2391 alloc_info.descriptorPool = ds_pool_one;
2392 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002394 ASSERT_VK_SUCCESS(err);
2395
2396 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2397
2398 m_errorMonitor->VerifyFound();
2399
2400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2401 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2402 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2403}
2404
2405TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002407
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002408 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002409
Tony Barbour1fa09702017-03-16 12:09:08 -06002410 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002411
2412 // Pass bogus handle into GetImageMemoryRequirements
2413 VkMemoryRequirements mem_reqs;
2414 uint64_t fakeImageHandle = 0xCADECADE;
2415 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2416
2417 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2418
2419 m_errorMonitor->VerifyFound();
2420}
2421
Mike Schuchardt17838902017-02-21 09:48:06 -07002422TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2423 TEST_DESCRIPTION(
2424 "Try to destroy a render pass object using a device other than the one it was created on. "
2425 "This should generate a distinct error from the invalid handle error.");
2426 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002427 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2429
2430 // Create second device
2431 float priorities[] = {1.0f};
2432 VkDeviceQueueCreateInfo queue_info{};
2433 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2434 queue_info.pNext = NULL;
2435 queue_info.flags = 0;
2436 queue_info.queueFamilyIndex = 0;
2437 queue_info.queueCount = 1;
2438 queue_info.pQueuePriorities = &priorities[0];
2439
2440 VkDeviceCreateInfo device_create_info = {};
2441 auto features = m_device->phy().features();
2442 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2443 device_create_info.pNext = NULL;
2444 device_create_info.queueCreateInfoCount = 1;
2445 device_create_info.pQueueCreateInfos = &queue_info;
2446 device_create_info.enabledLayerCount = 0;
2447 device_create_info.ppEnabledLayerNames = NULL;
2448 device_create_info.pEnabledFeatures = &features;
2449
2450 VkDevice second_device;
2451 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2452
2453 // Try to destroy the renderpass from the first device using the second device
2454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2455 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2456 m_errorMonitor->VerifyFound();
2457
2458 vkDestroyDevice(second_device, NULL);
2459}
2460
Karl Schultz6addd812016-02-02 17:17:23 -07002461TEST_F(VkLayerTest, PipelineNotBound) {
2462 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002464 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002465
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002467
Tony Barbour1fa09702017-03-16 12:09:08 -06002468 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002471 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002472 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2473 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002474
2475 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002476 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2477 ds_pool_ci.pNext = NULL;
2478 ds_pool_ci.maxSets = 1;
2479 ds_pool_ci.poolSizeCount = 1;
2480 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002481
2482 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002483 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002484 ASSERT_VK_SUCCESS(err);
2485
2486 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002487 dsl_binding.binding = 0;
2488 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2489 dsl_binding.descriptorCount = 1;
2490 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2491 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
2493 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002494 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2495 ds_layout_ci.pNext = NULL;
2496 ds_layout_ci.bindingCount = 1;
2497 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002498
2499 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002500 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002501 ASSERT_VK_SUCCESS(err);
2502
2503 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002504 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002505 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002506 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002507 alloc_info.descriptorPool = ds_pool;
2508 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002509 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002510 ASSERT_VK_SUCCESS(err);
2511
2512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2514 pipeline_layout_ci.pNext = NULL;
2515 pipeline_layout_ci.setLayoutCount = 1;
2516 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002517
2518 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002519 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002520 ASSERT_VK_SUCCESS(err);
2521
Mark Youngad779052016-01-06 14:26:04 -07002522 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002523
Tony Barbour552f6c02016-12-21 14:34:07 -07002524 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002525 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002526
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002527 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002528
Chia-I Wuf7458c52015-10-26 21:10:41 +08002529 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2531 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002532}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002533
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002534TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2535 VkResult err;
2536
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002537 TEST_DESCRIPTION(
2538 "Test validation check for an invalid memory type index "
2539 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002540
Tony Barbour1fa09702017-03-16 12:09:08 -06002541 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002542
2543 // Create an image, allocate memory, set a bad typeIndex and then try to
2544 // bind it
2545 VkImage image;
2546 VkDeviceMemory mem;
2547 VkMemoryRequirements mem_reqs;
2548 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2549 const int32_t tex_width = 32;
2550 const int32_t tex_height = 32;
2551
2552 VkImageCreateInfo image_create_info = {};
2553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2554 image_create_info.pNext = NULL;
2555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2556 image_create_info.format = tex_format;
2557 image_create_info.extent.width = tex_width;
2558 image_create_info.extent.height = tex_height;
2559 image_create_info.extent.depth = 1;
2560 image_create_info.mipLevels = 1;
2561 image_create_info.arrayLayers = 1;
2562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2563 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2564 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2565 image_create_info.flags = 0;
2566
2567 VkMemoryAllocateInfo mem_alloc = {};
2568 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2569 mem_alloc.pNext = NULL;
2570 mem_alloc.allocationSize = 0;
2571 mem_alloc.memoryTypeIndex = 0;
2572
2573 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2574 ASSERT_VK_SUCCESS(err);
2575
2576 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2577 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
2579 // Introduce Failure, select invalid TypeIndex
2580 VkPhysicalDeviceMemoryProperties memory_info;
2581
2582 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2583 unsigned int i;
2584 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2585 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2586 mem_alloc.memoryTypeIndex = i;
2587 break;
2588 }
2589 }
2590 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002591 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002592 vkDestroyImage(m_device->device(), image, NULL);
2593 return;
2594 }
2595
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002597
2598 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2599 ASSERT_VK_SUCCESS(err);
2600
2601 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2602 (void)err;
2603
2604 m_errorMonitor->VerifyFound();
2605
2606 vkDestroyImage(m_device->device(), image, NULL);
2607 vkFreeMemory(m_device->device(), mem, NULL);
2608}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002609
Karl Schultz6addd812016-02-02 17:17:23 -07002610TEST_F(VkLayerTest, BindInvalidMemory) {
2611 VkResult err;
2612 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Tony Barbour1fa09702017-03-16 12:09:08 -06002614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002615
Cortf801b982017-01-17 18:10:21 -08002616 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002617 const int32_t tex_width = 256;
2618 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002619
2620 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002621 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2622 image_create_info.pNext = NULL;
2623 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2624 image_create_info.format = tex_format;
2625 image_create_info.extent.width = tex_width;
2626 image_create_info.extent.height = tex_height;
2627 image_create_info.extent.depth = 1;
2628 image_create_info.mipLevels = 1;
2629 image_create_info.arrayLayers = 1;
2630 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002631 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002632 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2633 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002634
Cortf801b982017-01-17 18:10:21 -08002635 VkBufferCreateInfo buffer_create_info = {};
2636 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2637 buffer_create_info.pNext = NULL;
2638 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002639 buffer_create_info.size = 4 * 1024 * 1024;
2640 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002641 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 // Create an image/buffer, allocate memory, free it, and then try to bind it
2644 {
2645 VkImage image = VK_NULL_HANDLE;
2646 VkBuffer buffer = VK_NULL_HANDLE;
2647 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2648 ASSERT_VK_SUCCESS(err);
2649 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2650 ASSERT_VK_SUCCESS(err);
2651 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2652 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2653 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002654
Cortf801b982017-01-17 18:10:21 -08002655 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2656 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2657 image_mem_alloc.allocationSize = image_mem_reqs.size;
2658 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2659 ASSERT_TRUE(pass);
2660 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2661 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2662 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2663 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002664
Cortf801b982017-01-17 18:10:21 -08002665 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2666 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2667 ASSERT_VK_SUCCESS(err);
2668 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2669 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002670
Cortf801b982017-01-17 18:10:21 -08002671 vkFreeMemory(device(), image_mem, NULL);
2672 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002673
Cortf801b982017-01-17 18:10:21 -08002674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2675 err = vkBindImageMemory(device(), image, image_mem, 0);
2676 (void)err; // This may very well return an error.
2677 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002678
Cortf801b982017-01-17 18:10:21 -08002679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2680 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2681 (void)err; // This may very well return an error.
2682 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002683
Cortf801b982017-01-17 18:10:21 -08002684 vkDestroyImage(m_device->device(), image, NULL);
2685 vkDestroyBuffer(m_device->device(), buffer, NULL);
2686 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002687
2688 // Try to bind memory to an object that already has a memory binding
2689 {
2690 VkImage image = VK_NULL_HANDLE;
2691 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2692 ASSERT_VK_SUCCESS(err);
2693 VkBuffer buffer = VK_NULL_HANDLE;
2694 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2695 ASSERT_VK_SUCCESS(err);
2696 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2697 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2698 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2699 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2700 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2701 image_alloc_info.allocationSize = image_mem_reqs.size;
2702 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2703 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2704 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2705 ASSERT_TRUE(pass);
2706 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2707 ASSERT_TRUE(pass);
2708 VkDeviceMemory image_mem, buffer_mem;
2709 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2710 ASSERT_VK_SUCCESS(err);
2711 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2712 ASSERT_VK_SUCCESS(err);
2713
2714 err = vkBindImageMemory(device(), image, image_mem, 0);
2715 ASSERT_VK_SUCCESS(err);
2716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2717 err = vkBindImageMemory(device(), image, image_mem, 0);
2718 (void)err; // This may very well return an error.
2719 m_errorMonitor->VerifyFound();
2720
2721 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2722 ASSERT_VK_SUCCESS(err);
2723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2724 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2725 (void)err; // This may very well return an error.
2726 m_errorMonitor->VerifyFound();
2727
2728 vkFreeMemory(device(), image_mem, NULL);
2729 vkFreeMemory(device(), buffer_mem, NULL);
2730 vkDestroyImage(device(), image, NULL);
2731 vkDestroyBuffer(device(), buffer, NULL);
2732 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002733
Cort Strattonde748202017-02-17 12:50:01 -08002734 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002735 {
2736 VkImage image = VK_NULL_HANDLE;
2737 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2738 ASSERT_VK_SUCCESS(err);
2739 VkBuffer buffer = VK_NULL_HANDLE;
2740 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2741 ASSERT_VK_SUCCESS(err);
2742 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2743 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2744 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2745 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2746 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002747 // Leave some extra space for alignment wiggle room
2748 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002749 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002750 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002751 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2752 ASSERT_TRUE(pass);
2753 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2754 ASSERT_TRUE(pass);
2755 VkDeviceMemory image_mem, buffer_mem;
2756 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2757 ASSERT_VK_SUCCESS(err);
2758 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2759 ASSERT_VK_SUCCESS(err);
2760
Cort Strattonde748202017-02-17 12:50:01 -08002761 // Test unaligned memory offset
2762 {
2763 if (image_mem_reqs.alignment > 1) {
2764 VkDeviceSize image_offset = 1;
2765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2766 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2767 (void)err; // This may very well return an error.
2768 m_errorMonitor->VerifyFound();
2769 }
Cort6c7dff72017-01-27 18:34:50 -08002770
Cort Strattonde748202017-02-17 12:50:01 -08002771 if (buffer_mem_reqs.alignment > 1) {
2772 VkDeviceSize buffer_offset = 1;
2773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2774 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2775 (void)err; // This may very well return an error.
2776 m_errorMonitor->VerifyFound();
2777 }
2778 }
2779
2780 // Test memory offsets outside the memory allocation
2781 {
2782 VkDeviceSize image_offset =
2783 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2785 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2786 (void)err; // This may very well return an error.
2787 m_errorMonitor->VerifyFound();
2788
2789 VkDeviceSize buffer_offset =
2790 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2792 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2793 (void)err; // This may very well return an error.
2794 m_errorMonitor->VerifyFound();
2795 }
2796
2797 // Test memory offsets within the memory allocation, but which leave too little memory for
2798 // the resource.
2799 {
2800 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002801 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2803 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2804 (void)err; // This may very well return an error.
2805 m_errorMonitor->VerifyFound();
2806 }
2807
2808 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2809 if (buffer_offset > 0) {
2810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2811 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2812 (void)err; // This may very well return an error.
2813 m_errorMonitor->VerifyFound();
2814 }
2815 }
Cort6c7dff72017-01-27 18:34:50 -08002816
2817 vkFreeMemory(device(), image_mem, NULL);
2818 vkFreeMemory(device(), buffer_mem, NULL);
2819 vkDestroyImage(device(), image, NULL);
2820 vkDestroyBuffer(device(), buffer, NULL);
2821 }
2822
Cort Stratton4c38bb52017-01-28 13:33:10 -08002823 // Try to bind memory to an object with an invalid memory type
2824 {
2825 VkImage image = VK_NULL_HANDLE;
2826 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2827 ASSERT_VK_SUCCESS(err);
2828 VkBuffer buffer = VK_NULL_HANDLE;
2829 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2830 ASSERT_VK_SUCCESS(err);
2831 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2832 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2833 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2834 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2835 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2836 image_alloc_info.allocationSize = image_mem_reqs.size;
2837 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2838 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 // Create a mask of available memory types *not* supported by these resources,
2840 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 VkPhysicalDeviceMemoryProperties memory_properties = {};
2842 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002843 VkDeviceMemory image_mem, buffer_mem;
2844
Cort Stratton4c38bb52017-01-28 13:33:10 -08002845 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002846 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002847 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2848 ASSERT_TRUE(pass);
2849 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2850 ASSERT_VK_SUCCESS(err);
2851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2852 err = vkBindImageMemory(device(), image, image_mem, 0);
2853 (void)err; // This may very well return an error.
2854 m_errorMonitor->VerifyFound();
2855 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002856 }
2857
Cort Stratton4c38bb52017-01-28 13:33:10 -08002858 uint32_t buffer_unsupported_mem_type_bits =
2859 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002860 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002861 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2862 ASSERT_TRUE(pass);
2863 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2864 ASSERT_VK_SUCCESS(err);
2865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2866 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2867 (void)err; // This may very well return an error.
2868 m_errorMonitor->VerifyFound();
2869 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002870 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002871
Cort Stratton4c38bb52017-01-28 13:33:10 -08002872 vkDestroyImage(device(), image, NULL);
2873 vkDestroyBuffer(device(), buffer, NULL);
2874 }
2875
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002876 // Try to bind memory to an image created with sparse memory flags
2877 {
2878 VkImageCreateInfo sparse_image_create_info = image_create_info;
2879 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2880 VkImageFormatProperties image_format_properties = {};
2881 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2882 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2883 sparse_image_create_info.usage, sparse_image_create_info.flags,
2884 &image_format_properties);
2885 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2886 // most likely means sparse formats aren't supported here; skip this test.
2887 } else {
2888 ASSERT_VK_SUCCESS(err);
2889 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002890 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002891 return;
2892 } else {
2893 VkImage sparse_image = VK_NULL_HANDLE;
2894 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2895 ASSERT_VK_SUCCESS(err);
2896 VkMemoryRequirements sparse_mem_reqs = {};
2897 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2898 if (sparse_mem_reqs.memoryTypeBits != 0) {
2899 VkMemoryAllocateInfo sparse_mem_alloc = {};
2900 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2901 sparse_mem_alloc.pNext = NULL;
2902 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2903 sparse_mem_alloc.memoryTypeIndex = 0;
2904 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2905 ASSERT_TRUE(pass);
2906 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2907 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2908 ASSERT_VK_SUCCESS(err);
2909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2910 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2911 // This may very well return an error.
2912 (void)err;
2913 m_errorMonitor->VerifyFound();
2914 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2915 }
2916 vkDestroyImage(m_device->device(), sparse_image, NULL);
2917 }
2918 }
2919 }
2920
2921 // Try to bind memory to a buffer created with sparse memory flags
2922 {
2923 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2924 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2925 if (!m_device->phy().features().sparseResidencyBuffer) {
2926 // most likely means sparse formats aren't supported here; skip this test.
2927 } else {
2928 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2929 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2930 ASSERT_VK_SUCCESS(err);
2931 VkMemoryRequirements sparse_mem_reqs = {};
2932 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2933 if (sparse_mem_reqs.memoryTypeBits != 0) {
2934 VkMemoryAllocateInfo sparse_mem_alloc = {};
2935 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2936 sparse_mem_alloc.pNext = NULL;
2937 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2938 sparse_mem_alloc.memoryTypeIndex = 0;
2939 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2940 ASSERT_TRUE(pass);
2941 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2942 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2943 ASSERT_VK_SUCCESS(err);
2944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2945 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2946 // This may very well return an error.
2947 (void)err;
2948 m_errorMonitor->VerifyFound();
2949 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2950 }
2951 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2952 }
2953 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002954}
2955
Karl Schultz6addd812016-02-02 17:17:23 -07002956TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2957 VkResult err;
2958 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002959
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002961
Tony Barbour1fa09702017-03-16 12:09:08 -06002962 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 // Create an image object, allocate memory, destroy the object and then try
2965 // to bind it
2966 VkImage image;
2967 VkDeviceMemory mem;
2968 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002969
Karl Schultz6addd812016-02-02 17:17:23 -07002970 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2971 const int32_t tex_width = 32;
2972 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
2974 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002975 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2976 image_create_info.pNext = NULL;
2977 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2978 image_create_info.format = tex_format;
2979 image_create_info.extent.width = tex_width;
2980 image_create_info.extent.height = tex_height;
2981 image_create_info.extent.depth = 1;
2982 image_create_info.mipLevels = 1;
2983 image_create_info.arrayLayers = 1;
2984 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2985 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2986 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2987 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002988
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002989 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002990 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2991 mem_alloc.pNext = NULL;
2992 mem_alloc.allocationSize = 0;
2993 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002994
Chia-I Wuf7458c52015-10-26 21:10:41 +08002995 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002996 ASSERT_VK_SUCCESS(err);
2997
Karl Schultz6addd812016-02-02 17:17:23 -07002998 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002999
3000 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003001 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003002 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003003
3004 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003005 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003006 ASSERT_VK_SUCCESS(err);
3007
3008 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003009 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003010 ASSERT_VK_SUCCESS(err);
3011
3012 // Now Try to bind memory to this destroyed object
3013 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3014 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003015 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003017 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003018
Chia-I Wuf7458c52015-10-26 21:10:41 +08003019 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003020}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003021
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003022TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3023 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3024
Tony Barbour1fa09702017-03-16 12:09:08 -06003025 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3027
3028 VkVertexInputBindingDescription input_binding;
3029 memset(&input_binding, 0, sizeof(input_binding));
3030
3031 VkVertexInputAttributeDescription input_attribs;
3032 memset(&input_attribs, 0, sizeof(input_attribs));
3033
3034 // Pick a really bad format for this purpose and make sure it should fail
3035 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3036 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3037 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003038 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003039 return;
3040 }
3041
3042 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003043 char const *vsSource =
3044 "#version 450\n"
3045 "\n"
3046 "out gl_PerVertex {\n"
3047 " vec4 gl_Position;\n"
3048 "};\n"
3049 "void main(){\n"
3050 " gl_Position = vec4(1);\n"
3051 "}\n";
3052 char const *fsSource =
3053 "#version 450\n"
3054 "\n"
3055 "layout(location=0) out vec4 color;\n"
3056 "void main(){\n"
3057 " color = vec4(1);\n"
3058 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003059
3060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3061 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3062 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3063
3064 VkPipelineObj pipe(m_device);
3065 pipe.AddColorAttachment();
3066 pipe.AddShader(&vs);
3067 pipe.AddShader(&fs);
3068
3069 pipe.AddVertexInputBindings(&input_binding, 1);
3070 pipe.AddVertexInputAttribs(&input_attribs, 1);
3071
3072 VkDescriptorSetObj descriptorSet(m_device);
3073 descriptorSet.AppendDummy();
3074 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3075
3076 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3077
3078 m_errorMonitor->VerifyFound();
3079}
3080
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003081TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003082 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003083 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003084
3085 VkMemoryPropertyFlags reqs = 0;
3086 VkImageCreateInfo image_create_info = {};
3087 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3088 image_create_info.pNext = NULL;
3089 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3090 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3091 image_create_info.extent.width = 256;
3092 image_create_info.extent.height = 256;
3093 image_create_info.extent.depth = 1;
3094 image_create_info.mipLevels = 1;
3095 image_create_info.arrayLayers = 1;
3096 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3097 image_create_info.flags = 0;
3098
3099 VkImageBlit blit_region = {};
3100 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3101 blit_region.srcSubresource.baseArrayLayer = 0;
3102 blit_region.srcSubresource.layerCount = 1;
3103 blit_region.srcSubresource.mipLevel = 0;
3104 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3105 blit_region.dstSubresource.baseArrayLayer = 0;
3106 blit_region.dstSubresource.layerCount = 1;
3107 blit_region.dstSubresource.mipLevel = 0;
3108
3109 // Create two images, the source with sampleCount = 2, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 // Create two images, the dest with sampleCount = 4, and attempt to blit
3131 // between them
3132 {
3133 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003134 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003135 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003136 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003137 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003138 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003139 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003140 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003141 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003142 m_errorMonitor->SetDesiredFailureMsg(
3143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3144 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003145 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3146 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003147 m_errorMonitor->VerifyFound();
3148 m_commandBuffer->EndCommandBuffer();
3149 }
3150
3151 VkBufferImageCopy copy_region = {};
3152 copy_region.bufferRowLength = 128;
3153 copy_region.bufferImageHeight = 128;
3154 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3155 copy_region.imageSubresource.layerCount = 1;
3156 copy_region.imageExtent.height = 64;
3157 copy_region.imageExtent.width = 64;
3158 copy_region.imageExtent.depth = 1;
3159
3160 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3161 // buffer to image
3162 {
3163 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003164 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3165 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003168 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003169 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003170 m_errorMonitor->SetDesiredFailureMsg(
3171 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3172 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003173 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3174 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003175 m_errorMonitor->VerifyFound();
3176 m_commandBuffer->EndCommandBuffer();
3177 }
3178
3179 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3180 // image to buffer
3181 {
3182 vk_testing::Buffer dst_buffer;
3183 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3184 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003185 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003186 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003187 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003188 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003189 m_errorMonitor->SetDesiredFailureMsg(
3190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3191 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003192 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003193 dst_buffer.handle(), 1, &copy_region);
3194 m_errorMonitor->VerifyFound();
3195 m_commandBuffer->EndCommandBuffer();
3196 }
3197}
3198
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003199TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003200 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003201
3202 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003203 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003204 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003206 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003207 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003208
3209 VkImageBlit blitRegion = {};
3210 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3211 blitRegion.srcSubresource.baseArrayLayer = 0;
3212 blitRegion.srcSubresource.layerCount = 1;
3213 blitRegion.srcSubresource.mipLevel = 0;
3214 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3215 blitRegion.dstSubresource.baseArrayLayer = 0;
3216 blitRegion.dstSubresource.layerCount = 1;
3217 blitRegion.dstSubresource.mipLevel = 0;
3218
Dave Houlton34df4cb2016-12-01 16:43:06 -07003219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3220
3221 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3222 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223
3224 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003225 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003226 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003227 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003228
3229 m_errorMonitor->VerifyFound();
3230
Dave Houlton34df4cb2016-12-01 16:43:06 -07003231 // Test should generate 2 VU failures
3232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003234
3235 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003236 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003237 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003238
Dave Houlton34df4cb2016-12-01 16:43:06 -07003239 // TODO: Note that this only verifies that at least one of the VU enums was found
3240 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003241 m_errorMonitor->VerifyFound();
3242
Tony Barbour552f6c02016-12-21 14:34:07 -07003243 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003244}
3245
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003246TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3247 VkResult err;
3248 bool pass;
3249
3250 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003251 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003252
3253 // If w/d/h granularity is 1, test is not meaningful
3254 // TODO: When virtual device limits are available, create a set of limits for this test that
3255 // will always have a granularity of > 1 for w, h, and d
3256 auto index = m_device->graphics_queue_node_index_;
3257 auto queue_family_properties = m_device->phy().queue_properties();
3258
3259 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3260 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3261 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3262 return;
3263 }
3264
3265 // Create two images of different types and try to copy between them
3266 VkImage srcImage;
3267 VkImage dstImage;
3268 VkDeviceMemory srcMem;
3269 VkDeviceMemory destMem;
3270 VkMemoryRequirements memReqs;
3271
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 VkImageCreateInfo image_create_info = {};
3273 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3274 image_create_info.pNext = NULL;
3275 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3276 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3277 image_create_info.extent.width = 32;
3278 image_create_info.extent.height = 32;
3279 image_create_info.extent.depth = 1;
3280 image_create_info.mipLevels = 1;
3281 image_create_info.arrayLayers = 4;
3282 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3283 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3284 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3285 image_create_info.flags = 0;
3286
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003287 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003288 ASSERT_VK_SUCCESS(err);
3289
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003290 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003291 ASSERT_VK_SUCCESS(err);
3292
3293 // Allocate memory
3294 VkMemoryAllocateInfo memAlloc = {};
3295 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3296 memAlloc.pNext = NULL;
3297 memAlloc.allocationSize = 0;
3298 memAlloc.memoryTypeIndex = 0;
3299
3300 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3301 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003302 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003303 ASSERT_TRUE(pass);
3304 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3305 ASSERT_VK_SUCCESS(err);
3306
3307 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3308 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003309 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003310 ASSERT_VK_SUCCESS(err);
3311 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3312 ASSERT_VK_SUCCESS(err);
3313
3314 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3315 ASSERT_VK_SUCCESS(err);
3316 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3317 ASSERT_VK_SUCCESS(err);
3318
Tony Barbour552f6c02016-12-21 14:34:07 -07003319 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003320 VkImageCopy copyRegion;
3321 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3322 copyRegion.srcSubresource.mipLevel = 0;
3323 copyRegion.srcSubresource.baseArrayLayer = 0;
3324 copyRegion.srcSubresource.layerCount = 1;
3325 copyRegion.srcOffset.x = 0;
3326 copyRegion.srcOffset.y = 0;
3327 copyRegion.srcOffset.z = 0;
3328 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3329 copyRegion.dstSubresource.mipLevel = 0;
3330 copyRegion.dstSubresource.baseArrayLayer = 0;
3331 copyRegion.dstSubresource.layerCount = 1;
3332 copyRegion.dstOffset.x = 0;
3333 copyRegion.dstOffset.y = 0;
3334 copyRegion.dstOffset.z = 0;
3335 copyRegion.extent.width = 1;
3336 copyRegion.extent.height = 1;
3337 copyRegion.extent.depth = 1;
3338
3339 // Introduce failure by setting srcOffset to a bad granularity value
3340 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3342 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344
3345 // Introduce failure by setting extent to a bad granularity value
3346 copyRegion.srcOffset.y = 0;
3347 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003350 m_errorMonitor->VerifyFound();
3351
3352 // Now do some buffer/image copies
3353 vk_testing::Buffer buffer;
3354 VkMemoryPropertyFlags reqs = 0;
3355 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3356 VkBufferImageCopy region = {};
3357 region.bufferOffset = 0;
3358 region.bufferRowLength = 3;
3359 region.bufferImageHeight = 128;
3360 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3361 region.imageSubresource.layerCount = 1;
3362 region.imageExtent.height = 16;
3363 region.imageExtent.width = 16;
3364 region.imageExtent.depth = 1;
3365 region.imageOffset.x = 0;
3366 region.imageOffset.y = 0;
3367 region.imageOffset.z = 0;
3368
3369 // Introduce failure by setting bufferRowLength to a bad granularity value
3370 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3372 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3373 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003374 m_errorMonitor->VerifyFound();
3375 region.bufferRowLength = 128;
3376
3377 // Introduce failure by setting bufferOffset to a bad granularity value
3378 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3381 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003382 m_errorMonitor->VerifyFound();
3383 region.bufferOffset = 0;
3384
3385 // Introduce failure by setting bufferImageHeight to a bad granularity value
3386 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3389 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003390 m_errorMonitor->VerifyFound();
3391 region.bufferImageHeight = 128;
3392
3393 // Introduce failure by setting imageExtent to a bad granularity value
3394 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3396 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3397 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003398 m_errorMonitor->VerifyFound();
3399 region.imageExtent.width = 16;
3400
3401 // Introduce failure by setting imageOffset to a bad granularity value
3402 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3404 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3405 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003406 m_errorMonitor->VerifyFound();
3407
Tony Barbour552f6c02016-12-21 14:34:07 -07003408 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003409
3410 vkDestroyImage(m_device->device(), srcImage, NULL);
3411 vkDestroyImage(m_device->device(), dstImage, NULL);
3412 vkFreeMemory(m_device->device(), srcMem, NULL);
3413 vkFreeMemory(m_device->device(), destMem, NULL);
3414}
3415
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003417 TEST_DESCRIPTION(
3418 "Submit command buffer created using one queue family and "
3419 "attempt to submit them on a queue created in a different "
3420 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003421
Tony Barbour1fa09702017-03-16 12:09:08 -06003422 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003423
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003424 // This test is meaningless unless we have multiple queue families
3425 auto queue_family_properties = m_device->phy().queue_properties();
3426 if (queue_family_properties.size() < 2) {
3427 return;
3428 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430 // Get safe index of another queue family
3431 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003432 VkQueue other_queue;
3433 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3434
3435 // Record an empty cmd buffer
3436 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3437 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3438 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3439 vkEndCommandBuffer(m_commandBuffer->handle());
3440
3441 // And submit on the wrong queue
3442 VkSubmitInfo submit_info = {};
3443 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3444 submit_info.commandBufferCount = 1;
3445 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003446 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003447
3448 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003449}
3450
Chris Forbes4c24a922016-11-16 08:59:10 +13003451TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003453
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003454 // There are no attachments, but refer to attachment 0.
3455 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003456 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003457 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003458 };
3459
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003461 VkRenderPass rp;
3462
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003463 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003465 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3466 m_errorMonitor->VerifyFound();
3467}
3468
Chris Forbesa58c4522016-09-28 15:19:39 +13003469TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3470 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003471 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003472
3473 // A renderpass with two subpasses, both writing the same attachment.
3474 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003475 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3476 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3477 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003478 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003479 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003480 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3482 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003483 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003484 VkSubpassDependency dep = {0,
3485 1,
3486 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3487 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3488 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3489 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3490 VK_DEPENDENCY_BY_REGION_BIT};
3491 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003492 VkRenderPass rp;
3493 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3494 ASSERT_VK_SUCCESS(err);
3495
3496 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003497 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003498 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3499
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003500 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003501 VkFramebuffer fb;
3502 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3503 ASSERT_VK_SUCCESS(err);
3504
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003505 char const *vsSource =
3506 "#version 450\n"
3507 "void main() { gl_Position = vec4(1); }\n";
3508 char const *fsSource =
3509 "#version 450\n"
3510 "layout(location=0) out vec4 color;\n"
3511 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003512
3513 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3514 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3515 VkPipelineObj pipe(m_device);
3516 pipe.AddColorAttachment();
3517 pipe.AddShader(&vs);
3518 pipe.AddShader(&fs);
3519 VkViewport view_port = {};
3520 m_viewports.push_back(view_port);
3521 pipe.SetViewport(m_viewports);
3522 VkRect2D rect = {};
3523 m_scissors.push_back(rect);
3524 pipe.SetScissor(m_scissors);
3525
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003526 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003527 VkPipelineLayout pl;
3528 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3529 ASSERT_VK_SUCCESS(err);
3530 pipe.CreateVKPipeline(pl, rp);
3531
Tony Barbour552f6c02016-12-21 14:34:07 -07003532 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003533
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003534 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3535 nullptr,
3536 rp,
3537 fb,
3538 {{
3539 0, 0,
3540 },
3541 {32, 32}},
3542 0,
3543 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003544
3545 // subtest 1: bind in the wrong subpass
3546 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3547 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003549 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3550 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3551 m_errorMonitor->VerifyFound();
3552
3553 vkCmdEndRenderPass(m_commandBuffer->handle());
3554
3555 // subtest 2: bind in correct subpass, then transition to next subpass
3556 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3557 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3558 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003560 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3561 m_errorMonitor->VerifyFound();
3562
3563 vkCmdEndRenderPass(m_commandBuffer->handle());
3564
Tony Barbour552f6c02016-12-21 14:34:07 -07003565 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003566
3567 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3568 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3569 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3570}
3571
Tony Barbour4e919972016-08-09 13:27:40 -06003572TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3575 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003576 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3578
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3580 "Cannot execute a render pass with renderArea "
3581 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003582
3583 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3584 m_renderPassBeginInfo.renderArea.extent.width = 257;
3585 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003586 m_commandBuffer->BeginCommandBuffer();
3587 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003588 m_errorMonitor->VerifyFound();
3589}
3590
3591TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003592 TEST_DESCRIPTION(
3593 "Generate INDEPENDENT_BLEND by disabling independent "
3594 "blend and then specifying different blend states for two "
3595 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003596 VkPhysicalDeviceFeatures features = {};
3597 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003598 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003599
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3601 "Invalid Pipeline CreateInfo: If independent blend feature not "
3602 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003603
Cody Northropc31a84f2016-08-22 10:41:47 -06003604 VkDescriptorSetObj descriptorSet(m_device);
3605 descriptorSet.AppendDummy();
3606 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003607
Cody Northropc31a84f2016-08-22 10:41:47 -06003608 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003609 // Create a renderPass with two color attachments
3610 VkAttachmentReference attachments[2] = {};
3611 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003612 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003613 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3614
3615 VkSubpassDescription subpass = {};
3616 subpass.pColorAttachments = attachments;
3617 subpass.colorAttachmentCount = 2;
3618
3619 VkRenderPassCreateInfo rpci = {};
3620 rpci.subpassCount = 1;
3621 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003622 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003623
Tony Barbourffd60bd2017-03-09 12:04:55 -07003624 VkAttachmentDescription attach_desc[2] = {};
3625 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3626 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3627 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3628 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3629 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3630 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3631 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3632 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003633
Tony Barbourffd60bd2017-03-09 12:04:55 -07003634 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003635 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3636
3637 VkRenderPass renderpass;
3638 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003639 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003640 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003641
Cody Northropc31a84f2016-08-22 10:41:47 -06003642 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3643 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3644 att_state1.blendEnable = VK_TRUE;
3645 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3646 att_state2.blendEnable = VK_FALSE;
3647 pipeline.AddColorAttachment(0, &att_state1);
3648 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003649 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003650 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003651 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003652}
3653
Mike Weiblen40b160e2017-02-06 19:21:52 -07003654// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3655TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3656 TEST_DESCRIPTION(
3657 "Create a graphics pipeline that is incompatible with the requirements "
3658 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003659 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003660
3661 VkDescriptorSetObj ds_obj(m_device);
3662 ds_obj.AppendDummy();
3663 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3664
3665 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3666
3667 VkPipelineColorBlendAttachmentState att_state1 = {};
3668 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3669 att_state1.blendEnable = VK_TRUE;
3670
3671 VkRenderpassObj rp_obj(m_device);
3672
3673 {
3674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3675 VkPipelineObj pipeline(m_device);
3676 pipeline.AddShader(&vs_obj);
3677 pipeline.AddColorAttachment(0, &att_state1);
3678
3679 VkGraphicsPipelineCreateInfo info = {};
3680 pipeline.InitGraphicsPipelineCreateInfo(&info);
3681 info.pColorBlendState = nullptr;
3682
3683 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3684 m_errorMonitor->VerifyFound();
3685 }
3686}
3687
Chris Forbes26ec2122016-11-29 08:58:33 +13003688#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003689TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3690 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3691 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003692 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003693
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3695 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003696
3697 // Create a renderPass with a single color attachment
3698 VkAttachmentReference attach = {};
3699 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3700 VkSubpassDescription subpass = {};
3701 VkRenderPassCreateInfo rpci = {};
3702 rpci.subpassCount = 1;
3703 rpci.pSubpasses = &subpass;
3704 rpci.attachmentCount = 1;
3705 VkAttachmentDescription attach_desc = {};
3706 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3707 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3708 rpci.pAttachments = &attach_desc;
3709 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3710 VkRenderPass rp;
3711 subpass.pDepthStencilAttachment = &attach;
3712 subpass.pColorAttachments = NULL;
3713 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3714 m_errorMonitor->VerifyFound();
3715}
Chris Forbes26ec2122016-11-29 08:58:33 +13003716#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003717
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003718TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003719 TEST_DESCRIPTION(
3720 "Create a framebuffer where a subpass has a preserve "
3721 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003722
Tony Barbour1fa09702017-03-16 12:09:08 -06003723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3725
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003727
3728 VkAttachmentReference color_attach = {};
3729 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3730 color_attach.attachment = 0;
3731 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3732 VkSubpassDescription subpass = {};
3733 subpass.colorAttachmentCount = 1;
3734 subpass.pColorAttachments = &color_attach;
3735 subpass.preserveAttachmentCount = 1;
3736 subpass.pPreserveAttachments = &preserve_attachment;
3737
3738 VkRenderPassCreateInfo rpci = {};
3739 rpci.subpassCount = 1;
3740 rpci.pSubpasses = &subpass;
3741 rpci.attachmentCount = 1;
3742 VkAttachmentDescription attach_desc = {};
3743 attach_desc.format = VK_FORMAT_UNDEFINED;
3744 rpci.pAttachments = &attach_desc;
3745 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3746 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003747 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003748
3749 m_errorMonitor->VerifyFound();
3750
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003751 if (result == VK_SUCCESS) {
3752 vkDestroyRenderPass(m_device->device(), rp, NULL);
3753 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003754}
3755
Chris Forbesc5389742016-06-29 11:49:23 +12003756TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003757 TEST_DESCRIPTION(
3758 "Ensure that CreateRenderPass produces a validation error "
3759 "when the source of a subpass multisample resolve "
3760 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003761
Tony Barbour1fa09702017-03-16 12:09:08 -06003762 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003763
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3765 "Subpass 0 requests multisample resolve from attachment 0 which has "
3766 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003767
3768 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003769 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3770 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3771 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3772 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3773 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3774 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003775 };
3776
3777 VkAttachmentReference color = {
3778 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3779 };
3780
3781 VkAttachmentReference resolve = {
3782 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3783 };
3784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003785 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003788
3789 VkRenderPass rp;
3790 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3791
3792 m_errorMonitor->VerifyFound();
3793
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003794 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003795}
3796
3797TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003798 TEST_DESCRIPTION(
3799 "Ensure CreateRenderPass produces a validation error "
3800 "when a subpass multisample resolve operation is "
3801 "requested, and the destination of that resolve has "
3802 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003803
Tony Barbour1fa09702017-03-16 12:09:08 -06003804 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003805
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3807 "Subpass 0 requests multisample resolve into attachment 1, which "
3808 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003809
3810 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003811 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3812 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3813 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3814 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3815 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3816 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003817 };
3818
3819 VkAttachmentReference color = {
3820 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3821 };
3822
3823 VkAttachmentReference resolve = {
3824 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3825 };
3826
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003827 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003828
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003829 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003830
3831 VkRenderPass rp;
3832 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3833
3834 m_errorMonitor->VerifyFound();
3835
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003836 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003837}
3838
Chris Forbes3f128ef2016-06-29 14:58:53 +12003839TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003840 TEST_DESCRIPTION(
3841 "Ensure CreateRenderPass produces a validation error "
3842 "when the color and depth attachments used by a subpass "
3843 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003844
Tony Barbour1fa09702017-03-16 12:09:08 -06003845 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003846
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3848 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003849
3850 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3852 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3853 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3854 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3855 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3856 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003857 };
3858
3859 VkAttachmentReference color[] = {
3860 {
3861 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3862 },
3863 {
3864 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3865 },
3866 };
3867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003868 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003869
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003870 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003871
3872 VkRenderPass rp;
3873 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3874
3875 m_errorMonitor->VerifyFound();
3876
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003877 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003878}
3879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003881 TEST_DESCRIPTION(
3882 "Hit errors when attempting to create a framebuffer :\n"
3883 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3884 " 2. Use a color image as depthStencil attachment\n"
3885 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3886 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3887 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3888 " 6. Framebuffer attachment where dimensions don't match\n"
Cort Stratton8133ec22017-04-27 16:25:03 +02003889 " 7. Framebuffer attachment where dimensions don't match\n"
3890 " 8. Framebuffer attachment w/o identity swizzle\n"
3891 " 9. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892
Tony Barbour1fa09702017-03-16 12:09:08 -06003893 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003894 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3895
Cort Stratton8133ec22017-04-27 16:25:03 +02003896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00404);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003897
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003898 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003899 VkAttachmentReference attach = {};
3900 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3901 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003902 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003903 VkRenderPassCreateInfo rpci = {};
3904 rpci.subpassCount = 1;
3905 rpci.pSubpasses = &subpass;
3906 rpci.attachmentCount = 1;
3907 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003908 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003909 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003910 rpci.pAttachments = &attach_desc;
3911 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3912 VkRenderPass rp;
3913 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3914 ASSERT_VK_SUCCESS(err);
3915
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003916 VkImageView ivs[2];
3917 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3918 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003919 VkFramebufferCreateInfo fb_info = {};
3920 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3921 fb_info.pNext = NULL;
3922 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003923 // Set mis-matching attachmentCount
3924 fb_info.attachmentCount = 2;
3925 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003926 fb_info.width = 100;
3927 fb_info.height = 100;
3928 fb_info.layers = 1;
3929
3930 VkFramebuffer fb;
3931 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3932
3933 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003934 if (err == VK_SUCCESS) {
3935 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3936 }
3937 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003938
3939 // Create a renderPass with a depth-stencil attachment created with
3940 // IMAGE_USAGE_COLOR_ATTACHMENT
3941 // Add our color attachment to pDepthStencilAttachment
3942 subpass.pDepthStencilAttachment = &attach;
3943 subpass.pColorAttachments = NULL;
3944 VkRenderPass rp_ds;
3945 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3946 ASSERT_VK_SUCCESS(err);
3947 // Set correct attachment count, but attachment has COLOR usage bit set
3948 fb_info.attachmentCount = 1;
3949 fb_info.renderPass = rp_ds;
3950
Cort Stratton8133ec22017-04-27 16:25:03 +02003951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00406);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003952 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3953
3954 m_errorMonitor->VerifyFound();
3955 if (err == VK_SUCCESS) {
3956 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3957 }
3958 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003959
3960 // Create new renderpass with alternate attachment format from fb
3961 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3962 subpass.pDepthStencilAttachment = NULL;
3963 subpass.pColorAttachments = &attach;
3964 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3965 ASSERT_VK_SUCCESS(err);
3966
3967 // Cause error due to mis-matched formats between rp & fb
3968 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3969 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00408);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003971 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3972
3973 m_errorMonitor->VerifyFound();
3974 if (err == VK_SUCCESS) {
3975 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3976 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003977 vkDestroyRenderPass(m_device->device(), rp, NULL);
3978
3979 // Create new renderpass with alternate sample count from fb
3980 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3981 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3982 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3983 ASSERT_VK_SUCCESS(err);
3984
3985 // Cause error due to mis-matched sample count between rp & fb
3986 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00409);
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003988 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3989
3990 m_errorMonitor->VerifyFound();
3991 if (err == VK_SUCCESS) {
3992 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3993 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003994
3995 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003996
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003997 {
3998 // Create an image with 2 mip levels.
3999 VkImageObj image(m_device);
4000 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4001 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004002
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004003 // Create a image view with two mip levels.
4004 VkImageView view;
4005 VkImageViewCreateInfo ivci = {};
4006 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4007 ivci.image = image.handle();
4008 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4009 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4010 ivci.subresourceRange.layerCount = 1;
4011 ivci.subresourceRange.baseMipLevel = 0;
4012 // Set level count to 2 (only 1 is allowed for FB attachment)
4013 ivci.subresourceRange.levelCount = 2;
4014 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4015 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4016 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004017
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004018 // Re-create renderpass to have matching sample count
4019 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4020 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4021 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004022
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004023 fb_info.renderPass = rp;
4024 fb_info.pAttachments = &view;
Cort Stratton8133ec22017-04-27 16:25:03 +02004025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00411);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004026 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4027
4028 m_errorMonitor->VerifyFound();
4029 if (err == VK_SUCCESS) {
4030 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4031 }
4032 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004033 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004034
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004035 // Update view to original color buffer and grow FB dimensions too big
4036 fb_info.pAttachments = ivs;
4037 fb_info.height = 1024;
4038 fb_info.width = 1024;
4039 fb_info.layers = 2;
Cort Stratton8133ec22017-04-27 16:25:03 +02004040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004041 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4042
4043 m_errorMonitor->VerifyFound();
4044 if (err == VK_SUCCESS) {
4045 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4046 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004047
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004048 {
4049 // Create an image with one mip level.
4050 VkImageObj image(m_device);
4051 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4052 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004053
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004054 // Create view attachment with non-identity swizzle
4055 VkImageView view;
4056 VkImageViewCreateInfo ivci = {};
4057 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4058 ivci.image = image.handle();
4059 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4060 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4061 ivci.subresourceRange.layerCount = 1;
4062 ivci.subresourceRange.baseMipLevel = 0;
4063 ivci.subresourceRange.levelCount = 1;
4064 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4065 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4066 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4067 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4068 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4069 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4070 ASSERT_VK_SUCCESS(err);
4071
4072 fb_info.pAttachments = &view;
4073 fb_info.height = 100;
4074 fb_info.width = 100;
4075 fb_info.layers = 1;
4076
Cort Stratton8133ec22017-04-27 16:25:03 +02004077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00412);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004078 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4079
4080 m_errorMonitor->VerifyFound();
4081 if (err == VK_SUCCESS) {
4082 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4083 }
4084 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004085 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004086
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004087 // reset attachment to color attachment
4088 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004089
4090 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004091 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004092 fb_info.height = 100;
4093 fb_info.layers = 1;
4094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Cort Stratton8133ec22017-04-27 16:25:03 +02004095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004096 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004097 m_errorMonitor->VerifyFound();
4098 if (err == VK_SUCCESS) {
4099 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4100 }
4101 // and width=0
4102 fb_info.width = 0;
4103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02806);
4104 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004105 m_errorMonitor->VerifyFound();
4106 if (err == VK_SUCCESS) {
4107 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4108 }
4109
4110 // Request fb that exceeds max height
4111 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004112 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004113 fb_info.layers = 1;
4114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Cort Stratton8133ec22017-04-27 16:25:03 +02004115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004116 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004117 m_errorMonitor->VerifyFound();
4118 if (err == VK_SUCCESS) {
4119 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4120 }
4121 // and height=0
4122 fb_info.height = 0;
4123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02807);
4124 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004125 m_errorMonitor->VerifyFound();
4126 if (err == VK_SUCCESS) {
4127 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4128 }
4129
4130 // Request fb that exceeds max layers
4131 fb_info.width = 100;
4132 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004133 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Cort Stratton8133ec22017-04-27 16:25:03 +02004135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004136 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004137 m_errorMonitor->VerifyFound();
4138 if (err == VK_SUCCESS) {
4139 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4140 }
4141 // and layers=0
4142 fb_info.layers = 0;
4143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02808);
4144 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004145 m_errorMonitor->VerifyFound();
4146 if (err == VK_SUCCESS) {
4147 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4148 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004149
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004150 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004151}
4152
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004153TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004154 TEST_DESCRIPTION(
4155 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4156 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004157
Tony Barbour1fa09702017-03-16 12:09:08 -06004158 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4161 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004162 m_errorMonitor->VerifyFound();
4163}
4164
4165TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004166 TEST_DESCRIPTION(
4167 "Run a simple draw calls to validate failure when Line Width dynamic "
4168 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004169
Tony Barbour1fa09702017-03-16 12:09:08 -06004170 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004171 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4173 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004174 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004175}
4176
4177TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004178 TEST_DESCRIPTION(
4179 "Run a simple draw calls to validate failure when Viewport dynamic "
4180 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004181
Tony Barbour1fa09702017-03-16 12:09:08 -06004182 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004183 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4185 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004186 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004187 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004188}
4189
4190TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004191 TEST_DESCRIPTION(
4192 "Run a simple draw calls to validate failure when Scissor dynamic "
4193 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004194
Tony Barbour1fa09702017-03-16 12:09:08 -06004195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004196 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4198 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004199 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004200 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004201}
4202
Cortd713fe82016-07-27 09:51:27 -07004203TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004204 TEST_DESCRIPTION(
4205 "Run a simple draw calls to validate failure when Blend Constants "
4206 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004207
Tony Barbour1fa09702017-03-16 12:09:08 -06004208 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004209 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4211 "Dynamic blend constants state not set for this command buffer");
4212 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004213 m_errorMonitor->VerifyFound();
4214}
4215
4216TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004217 TEST_DESCRIPTION(
4218 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4219 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004220
Tony Barbour1fa09702017-03-16 12:09:08 -06004221 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004222 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004223 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004224 return;
4225 }
4226 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4228 "Dynamic depth bounds state not set for this command buffer");
4229 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004230 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004231}
4232
4233TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004234 TEST_DESCRIPTION(
4235 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4236 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004237
Tony Barbour1fa09702017-03-16 12:09:08 -06004238 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004239 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4241 "Dynamic stencil read mask state not set for this command buffer");
4242 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004243 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004244}
4245
4246TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004247 TEST_DESCRIPTION(
4248 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4249 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004250
Tony Barbour1fa09702017-03-16 12:09:08 -06004251 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004252 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4254 "Dynamic stencil write mask state not set for this command buffer");
4255 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004256 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004257}
4258
4259TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004260 TEST_DESCRIPTION(
4261 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4262 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004263
Tony Barbour1fa09702017-03-16 12:09:08 -06004264 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004265 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4267 "Dynamic stencil reference state not set for this command buffer");
4268 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004269 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004270}
4271
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004272TEST_F(VkLayerTest, IndexBufferNotBound) {
4273 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004274
Tony Barbour1fa09702017-03-16 12:09:08 -06004275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4277 "Index buffer object not bound to this command buffer when Indexed ");
4278 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004279 m_errorMonitor->VerifyFound();
4280}
4281
Karl Schultz6addd812016-02-02 17:17:23 -07004282TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4284 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4285 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004286
Tony Barbour1fa09702017-03-16 12:09:08 -06004287 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004288 ASSERT_NO_FATAL_FAILURE(InitViewport());
4289 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4290
Karl Schultz6addd812016-02-02 17:17:23 -07004291 // We luck out b/c by default the framework creates CB w/ the
4292 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004293 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004294 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004295 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004296
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004297 // Bypass framework since it does the waits automatically
4298 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004299 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004300 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4301 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004302 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004303 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004304 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004305 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004306 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004307 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004308 submit_info.pSignalSemaphores = NULL;
4309
Chris Forbes40028e22016-06-13 09:59:34 +12004310 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004311 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004312 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004313
Karl Schultz6addd812016-02-02 17:17:23 -07004314 // Cause validation error by re-submitting cmd buffer that should only be
4315 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004316 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004317 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004318
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004319 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004320}
4321
Karl Schultz6addd812016-02-02 17:17:23 -07004322TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004323 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004324 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004325
Tony Barbour1fa09702017-03-16 12:09:08 -06004326 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004328
Karl Schultz6addd812016-02-02 17:17:23 -07004329 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4330 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004331 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004332 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004333 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004334
4335 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004336 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4337 ds_pool_ci.pNext = NULL;
4338 ds_pool_ci.flags = 0;
4339 ds_pool_ci.maxSets = 1;
4340 ds_pool_ci.poolSizeCount = 1;
4341 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
4343 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004344 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345 ASSERT_VK_SUCCESS(err);
4346
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004347 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4348 dsl_binding_samp.binding = 0;
4349 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4350 dsl_binding_samp.descriptorCount = 1;
4351 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4352 dsl_binding_samp.pImmutableSamplers = NULL;
4353
4354 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4355 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4356 ds_layout_ci.pNext = NULL;
4357 ds_layout_ci.bindingCount = 1;
4358 ds_layout_ci.pBindings = &dsl_binding_samp;
4359
4360 VkDescriptorSetLayout ds_layout_samp;
4361 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4362 ASSERT_VK_SUCCESS(err);
4363
4364 // Try to allocate 2 sets when pool only has 1 set
4365 VkDescriptorSet descriptor_sets[2];
4366 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4367 VkDescriptorSetAllocateInfo alloc_info = {};
4368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4369 alloc_info.descriptorSetCount = 2;
4370 alloc_info.descriptorPool = ds_pool;
4371 alloc_info.pSetLayouts = set_layouts;
4372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4373 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4374 m_errorMonitor->VerifyFound();
4375
4376 alloc_info.descriptorSetCount = 1;
4377 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004378 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004379 dsl_binding.binding = 0;
4380 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4381 dsl_binding.descriptorCount = 1;
4382 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4383 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004384
Karl Schultz6addd812016-02-02 17:17:23 -07004385 ds_layout_ci.bindingCount = 1;
4386 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004387
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004388 VkDescriptorSetLayout ds_layout_ub;
4389 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004390 ASSERT_VK_SUCCESS(err);
4391
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004392 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004393 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004394 alloc_info.pSetLayouts = &ds_layout_ub;
4395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4396 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004397
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004398 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004399
Karl Schultz2825ab92016-12-02 08:23:14 -07004400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004401 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004402 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004403}
4404
Karl Schultz6addd812016-02-02 17:17:23 -07004405TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4406 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004407
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004409
Tony Barbour1fa09702017-03-16 12:09:08 -06004410 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004412
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004413 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004414 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4415 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004416
4417 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004418 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4419 ds_pool_ci.pNext = NULL;
4420 ds_pool_ci.maxSets = 1;
4421 ds_pool_ci.poolSizeCount = 1;
4422 ds_pool_ci.flags = 0;
4423 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4424 // app can only call vkResetDescriptorPool on this pool.;
4425 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004426
4427 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004428 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004429 ASSERT_VK_SUCCESS(err);
4430
4431 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004432 dsl_binding.binding = 0;
4433 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4434 dsl_binding.descriptorCount = 1;
4435 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4436 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004437
4438 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004439 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4440 ds_layout_ci.pNext = NULL;
4441 ds_layout_ci.bindingCount = 1;
4442 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004443
4444 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004445 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004446 ASSERT_VK_SUCCESS(err);
4447
4448 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004449 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004450 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004451 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004452 alloc_info.descriptorPool = ds_pool;
4453 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004454 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004455 ASSERT_VK_SUCCESS(err);
4456
4457 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004458 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004459
Chia-I Wuf7458c52015-10-26 21:10:41 +08004460 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4461 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004462}
4463
Karl Schultz6addd812016-02-02 17:17:23 -07004464TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004465 // Attempt to clear Descriptor Pool with bad object.
4466 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004467
Tony Barbour1fa09702017-03-16 12:09:08 -06004468 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004470 uint64_t fake_pool_handle = 0xbaad6001;
4471 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4472 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004473 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004474}
4475
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004476TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4478 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004480 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004481
4482 uint64_t fake_set_handle = 0xbaad6001;
4483 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004484 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004486
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488
4489 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4490 layout_bindings[0].binding = 0;
4491 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4492 layout_bindings[0].descriptorCount = 1;
4493 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4494 layout_bindings[0].pImmutableSamplers = NULL;
4495
4496 VkDescriptorSetLayout descriptor_set_layout;
4497 VkDescriptorSetLayoutCreateInfo dslci = {};
4498 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4499 dslci.pNext = NULL;
4500 dslci.bindingCount = 1;
4501 dslci.pBindings = layout_bindings;
4502 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004503 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004504
4505 VkPipelineLayout pipeline_layout;
4506 VkPipelineLayoutCreateInfo plci = {};
4507 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4508 plci.pNext = NULL;
4509 plci.setLayoutCount = 1;
4510 plci.pSetLayouts = &descriptor_set_layout;
4511 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004512 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004513
Tony Barbour552f6c02016-12-21 14:34:07 -07004514 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004515 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4516 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004517 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004518 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004519 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4520 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004521}
4522
Karl Schultz6addd812016-02-02 17:17:23 -07004523TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004524 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4525 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004526 uint64_t fake_layout_handle = 0xbaad6001;
4527 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004529 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004530 VkPipelineLayout pipeline_layout;
4531 VkPipelineLayoutCreateInfo plci = {};
4532 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4533 plci.pNext = NULL;
4534 plci.setLayoutCount = 1;
4535 plci.pSetLayouts = &bad_layout;
4536 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4537
4538 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004539}
4540
Mark Muellerd4914412016-06-13 17:52:06 -06004541TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004542 TEST_DESCRIPTION(
4543 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4544 "1) A uniform buffer update must have a valid buffer index."
4545 "2) When using an array of descriptors in a single WriteDescriptor,"
4546 " the descriptor types and stageflags must all be the same."
4547 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004548
Mike Weiblena6666382017-01-05 15:16:11 -07004549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004550
Tony Barbour1fa09702017-03-16 12:09:08 -06004551 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004552 VkDescriptorPoolSize ds_type_count[4] = {};
4553 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4554 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004555 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004556 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004557 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004558 ds_type_count[2].descriptorCount = 1;
4559 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4560 ds_type_count[3].descriptorCount = 1;
4561
4562 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4563 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4564 ds_pool_ci.maxSets = 1;
4565 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4566 ds_pool_ci.pPoolSizes = ds_type_count;
4567
4568 VkDescriptorPool ds_pool;
4569 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4570 ASSERT_VK_SUCCESS(err);
4571
Mark Muellerb9896722016-06-16 09:54:29 -06004572 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004573 layout_binding[0].binding = 0;
4574 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4575 layout_binding[0].descriptorCount = 1;
4576 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4577 layout_binding[0].pImmutableSamplers = NULL;
4578
4579 layout_binding[1].binding = 1;
4580 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4581 layout_binding[1].descriptorCount = 1;
4582 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4583 layout_binding[1].pImmutableSamplers = NULL;
4584
4585 VkSamplerCreateInfo sampler_ci = {};
4586 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4587 sampler_ci.pNext = NULL;
4588 sampler_ci.magFilter = VK_FILTER_NEAREST;
4589 sampler_ci.minFilter = VK_FILTER_NEAREST;
4590 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4591 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4592 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4593 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4594 sampler_ci.mipLodBias = 1.0;
4595 sampler_ci.anisotropyEnable = VK_FALSE;
4596 sampler_ci.maxAnisotropy = 1;
4597 sampler_ci.compareEnable = VK_FALSE;
4598 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4599 sampler_ci.minLod = 1.0;
4600 sampler_ci.maxLod = 1.0;
4601 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4602 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4603 VkSampler sampler;
4604
4605 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4606 ASSERT_VK_SUCCESS(err);
4607
4608 layout_binding[2].binding = 2;
4609 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4610 layout_binding[2].descriptorCount = 1;
4611 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4612 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4613
Mark Muellerd4914412016-06-13 17:52:06 -06004614 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4615 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4616 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4617 ds_layout_ci.pBindings = layout_binding;
4618 VkDescriptorSetLayout ds_layout;
4619 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4620 ASSERT_VK_SUCCESS(err);
4621
4622 VkDescriptorSetAllocateInfo alloc_info = {};
4623 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4624 alloc_info.descriptorSetCount = 1;
4625 alloc_info.descriptorPool = ds_pool;
4626 alloc_info.pSetLayouts = &ds_layout;
4627 VkDescriptorSet descriptorSet;
4628 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4629 ASSERT_VK_SUCCESS(err);
4630
4631 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4632 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4633 pipeline_layout_ci.pNext = NULL;
4634 pipeline_layout_ci.setLayoutCount = 1;
4635 pipeline_layout_ci.pSetLayouts = &ds_layout;
4636
4637 VkPipelineLayout pipeline_layout;
4638 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4639 ASSERT_VK_SUCCESS(err);
4640
Mark Mueller5c838ce2016-06-16 09:54:29 -06004641 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004642 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4643 descriptor_write.dstSet = descriptorSet;
4644 descriptor_write.dstBinding = 0;
4645 descriptor_write.descriptorCount = 1;
4646 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4647
Mark Mueller5c838ce2016-06-16 09:54:29 -06004648 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
4652 // Create a buffer to update the descriptor with
4653 uint32_t qfi = 0;
4654 VkBufferCreateInfo buffCI = {};
4655 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4656 buffCI.size = 1024;
4657 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4658 buffCI.queueFamilyIndexCount = 1;
4659 buffCI.pQueueFamilyIndices = &qfi;
4660
4661 VkBuffer dyub;
4662 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4663 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004664
Tony Barboure132c5f2016-12-12 11:50:20 -07004665 VkDeviceMemory mem;
4666 VkMemoryRequirements mem_reqs;
4667 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4668
4669 VkMemoryAllocateInfo mem_alloc_info = {};
4670 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4671 mem_alloc_info.allocationSize = mem_reqs.size;
4672 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4673 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4674 ASSERT_VK_SUCCESS(err);
4675
4676 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4677 ASSERT_VK_SUCCESS(err);
4678
4679 VkDescriptorBufferInfo buffInfo[2] = {};
4680 buffInfo[0].buffer = dyub;
4681 buffInfo[0].offset = 0;
4682 buffInfo[0].range = 1024;
4683 buffInfo[1].buffer = dyub;
4684 buffInfo[1].offset = 0;
4685 buffInfo[1].range = 1024;
4686 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004687 descriptor_write.descriptorCount = 2;
4688
Mark Mueller5c838ce2016-06-16 09:54:29 -06004689 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4692 m_errorMonitor->VerifyFound();
4693
Mark Mueller5c838ce2016-06-16 09:54:29 -06004694 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4695 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004696 descriptor_write.dstBinding = 1;
4697 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004698
Mark Mueller5c838ce2016-06-16 09:54:29 -06004699 // Make pImageInfo index non-null to avoid complaints of it missing
4700 VkDescriptorImageInfo imageInfo = {};
4701 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4702 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004704 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4705 m_errorMonitor->VerifyFound();
4706
Mark Muellerd4914412016-06-13 17:52:06 -06004707 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004708 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004709 vkDestroySampler(m_device->device(), sampler, NULL);
4710 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4713}
4714
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004715TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004716 TEST_DESCRIPTION(
4717 "Attempt to draw with a command buffer that is invalid "
4718 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004719 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004720
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004721 VkBuffer buffer;
4722 VkDeviceMemory mem;
4723 VkMemoryRequirements mem_reqs;
4724
4725 VkBufferCreateInfo buf_info = {};
4726 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004727 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004728 buf_info.size = 256;
4729 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4730 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4731 ASSERT_VK_SUCCESS(err);
4732
4733 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4734
4735 VkMemoryAllocateInfo alloc_info = {};
4736 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4737 alloc_info.allocationSize = 256;
4738 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004739 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004740 if (!pass) {
4741 vkDestroyBuffer(m_device->device(), buffer, NULL);
4742 return;
4743 }
4744 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4748 ASSERT_VK_SUCCESS(err);
4749
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004750 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004751 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004752 m_commandBuffer->EndCommandBuffer();
4753
Mark Lobodzinski33826372017-04-13 11:10:11 -06004754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004755 // Destroy buffer dependency prior to submit to cause ERROR
4756 vkDestroyBuffer(m_device->device(), buffer, NULL);
4757
4758 VkSubmitInfo submit_info = {};
4759 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4760 submit_info.commandBufferCount = 1;
4761 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4762 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4763
4764 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004765 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004766 vkFreeMemory(m_device->handle(), mem, NULL);
4767}
4768
Tobin Ehlisea413442016-09-28 10:23:59 -06004769TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4770 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4771
Tony Barbour1fa09702017-03-16 12:09:08 -06004772 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4774
4775 VkDescriptorPoolSize ds_type_count;
4776 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4777 ds_type_count.descriptorCount = 1;
4778
4779 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4780 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4781 ds_pool_ci.maxSets = 1;
4782 ds_pool_ci.poolSizeCount = 1;
4783 ds_pool_ci.pPoolSizes = &ds_type_count;
4784
4785 VkDescriptorPool ds_pool;
4786 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4787 ASSERT_VK_SUCCESS(err);
4788
4789 VkDescriptorSetLayoutBinding layout_binding;
4790 layout_binding.binding = 0;
4791 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4792 layout_binding.descriptorCount = 1;
4793 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4794 layout_binding.pImmutableSamplers = NULL;
4795
4796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4797 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4798 ds_layout_ci.bindingCount = 1;
4799 ds_layout_ci.pBindings = &layout_binding;
4800 VkDescriptorSetLayout ds_layout;
4801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4802 ASSERT_VK_SUCCESS(err);
4803
4804 VkDescriptorSetAllocateInfo alloc_info = {};
4805 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4806 alloc_info.descriptorSetCount = 1;
4807 alloc_info.descriptorPool = ds_pool;
4808 alloc_info.pSetLayouts = &ds_layout;
4809 VkDescriptorSet descriptor_set;
4810 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4811 ASSERT_VK_SUCCESS(err);
4812
4813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4814 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4815 pipeline_layout_ci.pNext = NULL;
4816 pipeline_layout_ci.setLayoutCount = 1;
4817 pipeline_layout_ci.pSetLayouts = &ds_layout;
4818
4819 VkPipelineLayout pipeline_layout;
4820 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4821 ASSERT_VK_SUCCESS(err);
4822
4823 VkBuffer buffer;
4824 uint32_t queue_family_index = 0;
4825 VkBufferCreateInfo buffer_create_info = {};
4826 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4827 buffer_create_info.size = 1024;
4828 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4829 buffer_create_info.queueFamilyIndexCount = 1;
4830 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4831
4832 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4833 ASSERT_VK_SUCCESS(err);
4834
4835 VkMemoryRequirements memory_reqs;
4836 VkDeviceMemory buffer_memory;
4837
4838 VkMemoryAllocateInfo memory_info = {};
4839 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4840 memory_info.allocationSize = 0;
4841 memory_info.memoryTypeIndex = 0;
4842
4843 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4844 memory_info.allocationSize = memory_reqs.size;
4845 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4846 ASSERT_TRUE(pass);
4847
4848 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4849 ASSERT_VK_SUCCESS(err);
4850 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4851 ASSERT_VK_SUCCESS(err);
4852
4853 VkBufferView view;
4854 VkBufferViewCreateInfo bvci = {};
4855 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4856 bvci.buffer = buffer;
4857 bvci.format = VK_FORMAT_R8_UNORM;
4858 bvci.range = VK_WHOLE_SIZE;
4859
4860 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4861 ASSERT_VK_SUCCESS(err);
4862
4863 VkWriteDescriptorSet descriptor_write = {};
4864 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4865 descriptor_write.dstSet = descriptor_set;
4866 descriptor_write.dstBinding = 0;
4867 descriptor_write.descriptorCount = 1;
4868 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4869 descriptor_write.pTexelBufferView = &view;
4870
4871 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4872
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004873 char const *vsSource =
4874 "#version 450\n"
4875 "\n"
4876 "out gl_PerVertex { \n"
4877 " vec4 gl_Position;\n"
4878 "};\n"
4879 "void main(){\n"
4880 " gl_Position = vec4(1);\n"
4881 "}\n";
4882 char const *fsSource =
4883 "#version 450\n"
4884 "\n"
4885 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4886 "layout(location=0) out vec4 x;\n"
4887 "void main(){\n"
4888 " x = imageLoad(s, 0);\n"
4889 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004890 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4891 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4892 VkPipelineObj pipe(m_device);
4893 pipe.AddShader(&vs);
4894 pipe.AddShader(&fs);
4895 pipe.AddColorAttachment();
4896 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4897
Mark Lobodzinski33826372017-04-13 11:10:11 -06004898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004899
Tony Barbour552f6c02016-12-21 14:34:07 -07004900 m_commandBuffer->BeginCommandBuffer();
4901 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4902
Tobin Ehlisea413442016-09-28 10:23:59 -06004903 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4904 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4905 VkRect2D scissor = {{0, 0}, {16, 16}};
4906 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4907 // Bind pipeline to cmd buffer
4908 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4909 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4910 &descriptor_set, 0, nullptr);
4911 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004912 m_commandBuffer->EndRenderPass();
4913 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004914
4915 // Delete BufferView in order to invalidate cmd buffer
4916 vkDestroyBufferView(m_device->device(), view, NULL);
4917 // Now attempt submit of cmd buffer
4918 VkSubmitInfo submit_info = {};
4919 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4920 submit_info.commandBufferCount = 1;
4921 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4922 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4923 m_errorMonitor->VerifyFound();
4924
4925 // Clean-up
4926 vkDestroyBuffer(m_device->device(), buffer, NULL);
4927 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4928 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4929 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4930 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4931}
4932
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004933TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004934 TEST_DESCRIPTION(
4935 "Attempt to draw with a command buffer that is invalid "
4936 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004937 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004938
4939 VkImage image;
4940 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4941 VkImageCreateInfo image_create_info = {};
4942 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4943 image_create_info.pNext = NULL;
4944 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4945 image_create_info.format = tex_format;
4946 image_create_info.extent.width = 32;
4947 image_create_info.extent.height = 32;
4948 image_create_info.extent.depth = 1;
4949 image_create_info.mipLevels = 1;
4950 image_create_info.arrayLayers = 1;
4951 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4952 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004953 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004954 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004955 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004956 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004957 // Have to bind memory to image before recording cmd in cmd buffer using it
4958 VkMemoryRequirements mem_reqs;
4959 VkDeviceMemory image_mem;
4960 bool pass;
4961 VkMemoryAllocateInfo mem_alloc = {};
4962 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4963 mem_alloc.pNext = NULL;
4964 mem_alloc.memoryTypeIndex = 0;
4965 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4966 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004967 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004968 ASSERT_TRUE(pass);
4969 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4970 ASSERT_VK_SUCCESS(err);
4971 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4972 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004973
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004974 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004975 VkClearColorValue ccv;
4976 ccv.float32[0] = 1.0f;
4977 ccv.float32[1] = 1.0f;
4978 ccv.float32[2] = 1.0f;
4979 ccv.float32[3] = 1.0f;
4980 VkImageSubresourceRange isr = {};
4981 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004982 isr.baseArrayLayer = 0;
4983 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004984 isr.layerCount = 1;
4985 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004986 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004987 m_commandBuffer->EndCommandBuffer();
4988
Mark Lobodzinski33826372017-04-13 11:10:11 -06004989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004990 // Destroy image dependency prior to submit to cause ERROR
4991 vkDestroyImage(m_device->device(), image, NULL);
4992
4993 VkSubmitInfo submit_info = {};
4994 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4995 submit_info.commandBufferCount = 1;
4996 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4997 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4998
4999 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06005000 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06005001}
5002
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005003TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005004 TEST_DESCRIPTION(
5005 "Attempt to draw with a command buffer that is invalid "
5006 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005007 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005008 VkFormatProperties format_properties;
5009 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005010 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5011 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005012 return;
5013 }
5014
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5016
5017 VkImageCreateInfo image_ci = {};
5018 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5019 image_ci.pNext = NULL;
5020 image_ci.imageType = VK_IMAGE_TYPE_2D;
5021 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5022 image_ci.extent.width = 32;
5023 image_ci.extent.height = 32;
5024 image_ci.extent.depth = 1;
5025 image_ci.mipLevels = 1;
5026 image_ci.arrayLayers = 1;
5027 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5028 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005029 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005030 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5031 image_ci.flags = 0;
5032 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005033 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005034
5035 VkMemoryRequirements memory_reqs;
5036 VkDeviceMemory image_memory;
5037 bool pass;
5038 VkMemoryAllocateInfo memory_info = {};
5039 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5040 memory_info.pNext = NULL;
5041 memory_info.allocationSize = 0;
5042 memory_info.memoryTypeIndex = 0;
5043 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5044 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005045 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005046 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005047 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005048 ASSERT_VK_SUCCESS(err);
5049 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5050 ASSERT_VK_SUCCESS(err);
5051
5052 VkImageViewCreateInfo ivci = {
5053 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5054 nullptr,
5055 0,
5056 image,
5057 VK_IMAGE_VIEW_TYPE_2D,
5058 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005059 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005060 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5061 };
5062 VkImageView view;
5063 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5064 ASSERT_VK_SUCCESS(err);
5065
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005066 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005067 VkFramebuffer fb;
5068 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5069 ASSERT_VK_SUCCESS(err);
5070
5071 // Just use default renderpass with our framebuffer
5072 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005073 m_renderPassBeginInfo.renderArea.extent.width = 32;
5074 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005075 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005076 m_commandBuffer->BeginCommandBuffer();
5077 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5078 m_commandBuffer->EndRenderPass();
5079 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005080 // Destroy image attached to framebuffer to invalidate cmd buffer
5081 vkDestroyImage(m_device->device(), image, NULL);
5082 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005084 QueueCommandBuffer(false);
5085 m_errorMonitor->VerifyFound();
5086
5087 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5088 vkDestroyImageView(m_device->device(), view, nullptr);
5089 vkFreeMemory(m_device->device(), image_memory, nullptr);
5090}
5091
Tobin Ehlisb329f992016-10-12 13:20:29 -06005092TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5093 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005094 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005095 VkFormatProperties format_properties;
5096 VkResult err = VK_SUCCESS;
5097 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5098
Tobin Ehlisb329f992016-10-12 13:20:29 -06005099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5100
5101 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005102 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005103 ASSERT_TRUE(image.initialized());
5104 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5105
5106 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5107 VkFramebuffer fb;
5108 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5109 ASSERT_VK_SUCCESS(err);
5110
5111 // Just use default renderpass with our framebuffer
5112 m_renderPassBeginInfo.framebuffer = fb;
5113 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005114 m_commandBuffer->BeginCommandBuffer();
5115 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5116 m_commandBuffer->EndRenderPass();
5117 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005118 // Submit cmd buffer to put it in-flight
5119 VkSubmitInfo submit_info = {};
5120 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5121 submit_info.commandBufferCount = 1;
5122 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5123 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5124 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005126 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5127 m_errorMonitor->VerifyFound();
5128 // Wait for queue to complete so we can safely destroy everything
5129 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005130 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5131 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005132 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5133}
5134
Tobin Ehlis88becd72016-09-21 14:33:41 -06005135TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5136 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005137 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005138 VkFormatProperties format_properties;
5139 VkResult err = VK_SUCCESS;
5140 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005141
Tobin Ehlis88becd72016-09-21 14:33:41 -06005142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5143
5144 VkImageCreateInfo image_ci = {};
5145 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5146 image_ci.pNext = NULL;
5147 image_ci.imageType = VK_IMAGE_TYPE_2D;
5148 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5149 image_ci.extent.width = 256;
5150 image_ci.extent.height = 256;
5151 image_ci.extent.depth = 1;
5152 image_ci.mipLevels = 1;
5153 image_ci.arrayLayers = 1;
5154 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5155 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005156 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005157 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5158 image_ci.flags = 0;
5159 VkImage image;
5160 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5161
5162 VkMemoryRequirements memory_reqs;
5163 VkDeviceMemory image_memory;
5164 bool pass;
5165 VkMemoryAllocateInfo memory_info = {};
5166 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5167 memory_info.pNext = NULL;
5168 memory_info.allocationSize = 0;
5169 memory_info.memoryTypeIndex = 0;
5170 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5171 memory_info.allocationSize = memory_reqs.size;
5172 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5173 ASSERT_TRUE(pass);
5174 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5175 ASSERT_VK_SUCCESS(err);
5176 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5177 ASSERT_VK_SUCCESS(err);
5178
5179 VkImageViewCreateInfo ivci = {
5180 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5181 nullptr,
5182 0,
5183 image,
5184 VK_IMAGE_VIEW_TYPE_2D,
5185 VK_FORMAT_B8G8R8A8_UNORM,
5186 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5187 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5188 };
5189 VkImageView view;
5190 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5191 ASSERT_VK_SUCCESS(err);
5192
5193 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5194 VkFramebuffer fb;
5195 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5196 ASSERT_VK_SUCCESS(err);
5197
5198 // Just use default renderpass with our framebuffer
5199 m_renderPassBeginInfo.framebuffer = fb;
5200 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005201 m_commandBuffer->BeginCommandBuffer();
5202 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5203 m_commandBuffer->EndRenderPass();
5204 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005205 // Submit cmd buffer to put it (and attached imageView) in-flight
5206 VkSubmitInfo submit_info = {};
5207 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5208 submit_info.commandBufferCount = 1;
5209 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5210 // Submit cmd buffer to put framebuffer and children in-flight
5211 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5212 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005214 vkDestroyImage(m_device->device(), image, NULL);
5215 m_errorMonitor->VerifyFound();
5216 // Wait for queue to complete so we can safely destroy image and other objects
5217 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005218 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5219 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005220 vkDestroyImage(m_device->device(), image, NULL);
5221 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5222 vkDestroyImageView(m_device->device(), view, nullptr);
5223 vkFreeMemory(m_device->device(), image_memory, nullptr);
5224}
5225
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005226TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5227 TEST_DESCRIPTION("Delete in-use renderPass.");
5228
Tony Barbour1fa09702017-03-16 12:09:08 -06005229 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5231
5232 // Create simple renderpass
5233 VkAttachmentReference attach = {};
5234 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5235 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005236 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005237 subpass.pColorAttachments = &attach;
5238 VkRenderPassCreateInfo rpci = {};
5239 rpci.subpassCount = 1;
5240 rpci.pSubpasses = &subpass;
5241 rpci.attachmentCount = 1;
5242 VkAttachmentDescription attach_desc = {};
5243 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5244 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5245 rpci.pAttachments = &attach_desc;
5246 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5247 VkRenderPass rp;
5248 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5249 ASSERT_VK_SUCCESS(err);
5250
5251 // Create a pipeline that uses the given renderpass
5252 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5253 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5254
5255 VkPipelineLayout pipeline_layout;
5256 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5257 ASSERT_VK_SUCCESS(err);
5258
5259 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5260 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5261 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005262 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005263 vp_state_ci.pViewports = &vp;
5264 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005265 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005266 vp_state_ci.pScissors = &scissors;
5267
5268 VkPipelineShaderStageCreateInfo shaderStages[2];
5269 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5270
5271 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005272 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 // but add it to be able to run on more devices
5274 shaderStages[0] = vs.GetStageCreateInfo();
5275 shaderStages[1] = fs.GetStageCreateInfo();
5276
5277 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5278 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5279
5280 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5281 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5282 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5283
5284 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5285 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5286 rs_ci.rasterizerDiscardEnable = true;
5287 rs_ci.lineWidth = 1.0f;
5288
5289 VkPipelineColorBlendAttachmentState att = {};
5290 att.blendEnable = VK_FALSE;
5291 att.colorWriteMask = 0xf;
5292
5293 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5294 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5295 cb_ci.attachmentCount = 1;
5296 cb_ci.pAttachments = &att;
5297
5298 VkGraphicsPipelineCreateInfo gp_ci = {};
5299 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5300 gp_ci.stageCount = 2;
5301 gp_ci.pStages = shaderStages;
5302 gp_ci.pVertexInputState = &vi_ci;
5303 gp_ci.pInputAssemblyState = &ia_ci;
5304 gp_ci.pViewportState = &vp_state_ci;
5305 gp_ci.pRasterizationState = &rs_ci;
5306 gp_ci.pColorBlendState = &cb_ci;
5307 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5308 gp_ci.layout = pipeline_layout;
5309 gp_ci.renderPass = rp;
5310
5311 VkPipelineCacheCreateInfo pc_ci = {};
5312 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5313
Dave Houlton756e6742017-03-23 14:33:22 -06005314 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005315 VkPipeline pipeline;
5316 VkPipelineCache pipe_cache;
5317 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5318 ASSERT_VK_SUCCESS(err);
5319
5320 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5321 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005322
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005323 // Bind pipeline to cmd buffer, will also bind renderpass
5324 m_commandBuffer->BeginCommandBuffer();
5325 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5326 m_commandBuffer->EndCommandBuffer();
5327
5328 VkSubmitInfo submit_info = {};
5329 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5330 submit_info.commandBufferCount = 1;
5331 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5332 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005333 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005334
5335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5336 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5337 m_errorMonitor->VerifyFound();
5338
5339 // Wait for queue to complete so we can safely destroy everything
5340 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005341 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005342 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005343 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5344 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5345 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5346 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5347}
5348
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005349TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005350 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005351 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005352
5353 VkImage image;
5354 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5355 VkImageCreateInfo image_create_info = {};
5356 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5357 image_create_info.pNext = NULL;
5358 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5359 image_create_info.format = tex_format;
5360 image_create_info.extent.width = 32;
5361 image_create_info.extent.height = 32;
5362 image_create_info.extent.depth = 1;
5363 image_create_info.mipLevels = 1;
5364 image_create_info.arrayLayers = 1;
5365 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5366 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005367 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005368 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005370 ASSERT_VK_SUCCESS(err);
5371 // Have to bind memory to image before recording cmd in cmd buffer using it
5372 VkMemoryRequirements mem_reqs;
5373 VkDeviceMemory image_mem;
5374 bool pass;
5375 VkMemoryAllocateInfo mem_alloc = {};
5376 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5377 mem_alloc.pNext = NULL;
5378 mem_alloc.memoryTypeIndex = 0;
5379 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5380 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005381 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005382 ASSERT_TRUE(pass);
5383 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5384 ASSERT_VK_SUCCESS(err);
5385
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005386 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005388 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005389
5390 m_commandBuffer->BeginCommandBuffer();
5391 VkClearColorValue ccv;
5392 ccv.float32[0] = 1.0f;
5393 ccv.float32[1] = 1.0f;
5394 ccv.float32[2] = 1.0f;
5395 ccv.float32[3] = 1.0f;
5396 VkImageSubresourceRange isr = {};
5397 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5398 isr.baseArrayLayer = 0;
5399 isr.baseMipLevel = 0;
5400 isr.layerCount = 1;
5401 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005402 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005403 m_commandBuffer->EndCommandBuffer();
5404
5405 m_errorMonitor->VerifyFound();
5406 vkDestroyImage(m_device->device(), image, NULL);
5407 vkFreeMemory(m_device->device(), image_mem, nullptr);
5408}
5409
5410TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005411 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005412 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005413
5414 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005415 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005416 VK_IMAGE_TILING_OPTIMAL, 0);
5417 ASSERT_TRUE(image.initialized());
5418
5419 VkBuffer buffer;
5420 VkDeviceMemory mem;
5421 VkMemoryRequirements mem_reqs;
5422
5423 VkBufferCreateInfo buf_info = {};
5424 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005425 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005426 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005427 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5428 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5429 ASSERT_VK_SUCCESS(err);
5430
5431 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5432
5433 VkMemoryAllocateInfo alloc_info = {};
5434 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005435 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005436 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005437 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005438 if (!pass) {
5439 vkDestroyBuffer(m_device->device(), buffer, NULL);
5440 return;
5441 }
5442 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5443 ASSERT_VK_SUCCESS(err);
5444
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005445 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005447 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005448 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005449 region.bufferRowLength = 16;
5450 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005451 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5452
5453 region.imageSubresource.layerCount = 1;
5454 region.imageExtent.height = 4;
5455 region.imageExtent.width = 4;
5456 region.imageExtent.depth = 1;
5457 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005458 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5459 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005460 m_commandBuffer->EndCommandBuffer();
5461
5462 m_errorMonitor->VerifyFound();
5463
5464 vkDestroyBuffer(m_device->device(), buffer, NULL);
5465 vkFreeMemory(m_device->handle(), mem, NULL);
5466}
5467
Tobin Ehlis85940f52016-07-07 16:57:21 -06005468TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005469 TEST_DESCRIPTION(
5470 "Attempt to draw with a command buffer that is invalid "
5471 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005472 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005473
5474 VkEvent event;
5475 VkEventCreateInfo evci = {};
5476 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5477 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5478 ASSERT_VK_SUCCESS(result);
5479
5480 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005481 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005482 m_commandBuffer->EndCommandBuffer();
5483
Mark Lobodzinski33826372017-04-13 11:10:11 -06005484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005485 // Destroy event dependency prior to submit to cause ERROR
5486 vkDestroyEvent(m_device->device(), event, NULL);
5487
5488 VkSubmitInfo submit_info = {};
5489 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5490 submit_info.commandBufferCount = 1;
5491 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5492 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5493
5494 m_errorMonitor->VerifyFound();
5495}
5496
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005497TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005498 TEST_DESCRIPTION(
5499 "Attempt to draw with a command buffer that is invalid "
5500 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005501 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005502
5503 VkQueryPool query_pool;
5504 VkQueryPoolCreateInfo qpci{};
5505 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5506 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5507 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005508 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005509 ASSERT_VK_SUCCESS(result);
5510
5511 m_commandBuffer->BeginCommandBuffer();
5512 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5513 m_commandBuffer->EndCommandBuffer();
5514
Mark Lobodzinski33826372017-04-13 11:10:11 -06005515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005516 // Destroy query pool dependency prior to submit to cause ERROR
5517 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5518
5519 VkSubmitInfo submit_info = {};
5520 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5521 submit_info.commandBufferCount = 1;
5522 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5523 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5524
5525 m_errorMonitor->VerifyFound();
5526}
5527
Tobin Ehlis24130d92016-07-08 15:50:53 -06005528TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005529 TEST_DESCRIPTION(
5530 "Attempt to draw with a command buffer that is invalid "
5531 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005532 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005533 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5534
5535 VkResult err;
5536
5537 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5538 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5539
5540 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005541 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005542 ASSERT_VK_SUCCESS(err);
5543
5544 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5545 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5546 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005547 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005548 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005549 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005550 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005551 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005552
5553 VkPipelineShaderStageCreateInfo shaderStages[2];
5554 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5555
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005556 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005557 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005558 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005559 shaderStages[0] = vs.GetStageCreateInfo();
5560 shaderStages[1] = fs.GetStageCreateInfo();
5561
5562 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5563 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5564
5565 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5566 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5567 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5568
5569 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5570 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005571 rs_ci.rasterizerDiscardEnable = true;
5572 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005573
5574 VkPipelineColorBlendAttachmentState att = {};
5575 att.blendEnable = VK_FALSE;
5576 att.colorWriteMask = 0xf;
5577
5578 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5579 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5580 cb_ci.attachmentCount = 1;
5581 cb_ci.pAttachments = &att;
5582
5583 VkGraphicsPipelineCreateInfo gp_ci = {};
5584 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5585 gp_ci.stageCount = 2;
5586 gp_ci.pStages = shaderStages;
5587 gp_ci.pVertexInputState = &vi_ci;
5588 gp_ci.pInputAssemblyState = &ia_ci;
5589 gp_ci.pViewportState = &vp_state_ci;
5590 gp_ci.pRasterizationState = &rs_ci;
5591 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005592 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5593 gp_ci.layout = pipeline_layout;
5594 gp_ci.renderPass = renderPass();
5595
5596 VkPipelineCacheCreateInfo pc_ci = {};
5597 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5598
5599 VkPipeline pipeline;
5600 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005601 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005602 ASSERT_VK_SUCCESS(err);
5603
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005604 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005605 ASSERT_VK_SUCCESS(err);
5606
5607 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005608 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005609 m_commandBuffer->EndCommandBuffer();
5610 // Now destroy pipeline in order to cause error when submitting
5611 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5612
Mark Lobodzinski33826372017-04-13 11:10:11 -06005613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005614
5615 VkSubmitInfo submit_info = {};
5616 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5617 submit_info.commandBufferCount = 1;
5618 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5619 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5620
5621 m_errorMonitor->VerifyFound();
5622 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5623 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5624}
5625
Tobin Ehlis31289162016-08-17 14:57:58 -06005626TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005627 TEST_DESCRIPTION(
5628 "Attempt to draw with a command buffer that is invalid "
5629 "due to a bound descriptor set with a buffer dependency "
5630 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005631 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005632 ASSERT_NO_FATAL_FAILURE(InitViewport());
5633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5634
5635 VkDescriptorPoolSize ds_type_count = {};
5636 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5637 ds_type_count.descriptorCount = 1;
5638
5639 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5640 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5641 ds_pool_ci.pNext = NULL;
5642 ds_pool_ci.maxSets = 1;
5643 ds_pool_ci.poolSizeCount = 1;
5644 ds_pool_ci.pPoolSizes = &ds_type_count;
5645
5646 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005647 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005648 ASSERT_VK_SUCCESS(err);
5649
5650 VkDescriptorSetLayoutBinding dsl_binding = {};
5651 dsl_binding.binding = 0;
5652 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5653 dsl_binding.descriptorCount = 1;
5654 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5655 dsl_binding.pImmutableSamplers = NULL;
5656
5657 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5658 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5659 ds_layout_ci.pNext = NULL;
5660 ds_layout_ci.bindingCount = 1;
5661 ds_layout_ci.pBindings = &dsl_binding;
5662 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005663 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005664 ASSERT_VK_SUCCESS(err);
5665
5666 VkDescriptorSet descriptorSet;
5667 VkDescriptorSetAllocateInfo alloc_info = {};
5668 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5669 alloc_info.descriptorSetCount = 1;
5670 alloc_info.descriptorPool = ds_pool;
5671 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005672 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005673 ASSERT_VK_SUCCESS(err);
5674
5675 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5676 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5677 pipeline_layout_ci.pNext = NULL;
5678 pipeline_layout_ci.setLayoutCount = 1;
5679 pipeline_layout_ci.pSetLayouts = &ds_layout;
5680
5681 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005682 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005683 ASSERT_VK_SUCCESS(err);
5684
5685 // Create a buffer to update the descriptor with
5686 uint32_t qfi = 0;
5687 VkBufferCreateInfo buffCI = {};
5688 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5689 buffCI.size = 1024;
5690 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5691 buffCI.queueFamilyIndexCount = 1;
5692 buffCI.pQueueFamilyIndices = &qfi;
5693
5694 VkBuffer buffer;
5695 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5696 ASSERT_VK_SUCCESS(err);
5697 // Allocate memory and bind to buffer so we can make it to the appropriate
5698 // error
5699 VkMemoryAllocateInfo mem_alloc = {};
5700 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5701 mem_alloc.pNext = NULL;
5702 mem_alloc.allocationSize = 1024;
5703 mem_alloc.memoryTypeIndex = 0;
5704
5705 VkMemoryRequirements memReqs;
5706 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005707 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005708 if (!pass) {
5709 vkDestroyBuffer(m_device->device(), buffer, NULL);
5710 return;
5711 }
5712
5713 VkDeviceMemory mem;
5714 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5715 ASSERT_VK_SUCCESS(err);
5716 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5717 ASSERT_VK_SUCCESS(err);
5718 // Correctly update descriptor to avoid "NOT_UPDATED" error
5719 VkDescriptorBufferInfo buffInfo = {};
5720 buffInfo.buffer = buffer;
5721 buffInfo.offset = 0;
5722 buffInfo.range = 1024;
5723
5724 VkWriteDescriptorSet descriptor_write;
5725 memset(&descriptor_write, 0, sizeof(descriptor_write));
5726 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5727 descriptor_write.dstSet = descriptorSet;
5728 descriptor_write.dstBinding = 0;
5729 descriptor_write.descriptorCount = 1;
5730 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5731 descriptor_write.pBufferInfo = &buffInfo;
5732
5733 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5734
5735 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005736 char const *vsSource =
5737 "#version 450\n"
5738 "\n"
5739 "out gl_PerVertex { \n"
5740 " vec4 gl_Position;\n"
5741 "};\n"
5742 "void main(){\n"
5743 " gl_Position = vec4(1);\n"
5744 "}\n";
5745 char const *fsSource =
5746 "#version 450\n"
5747 "\n"
5748 "layout(location=0) out vec4 x;\n"
5749 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5750 "void main(){\n"
5751 " x = vec4(bar.y);\n"
5752 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5754 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5755 VkPipelineObj pipe(m_device);
5756 pipe.AddShader(&vs);
5757 pipe.AddShader(&fs);
5758 pipe.AddColorAttachment();
5759 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5760
Tony Barbour552f6c02016-12-21 14:34:07 -07005761 m_commandBuffer->BeginCommandBuffer();
5762 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005763 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5764 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5765 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005766
5767 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5768 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5769
Tobin Ehlis31289162016-08-17 14:57:58 -06005770 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005771 m_commandBuffer->EndRenderPass();
5772 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005774 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5775 vkDestroyBuffer(m_device->device(), buffer, NULL);
5776 // Attempt to submit cmd buffer
5777 VkSubmitInfo submit_info = {};
5778 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5779 submit_info.commandBufferCount = 1;
5780 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5781 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5782 m_errorMonitor->VerifyFound();
5783 // Cleanup
5784 vkFreeMemory(m_device->device(), mem, NULL);
5785
5786 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5787 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5788 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5789}
5790
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005792 TEST_DESCRIPTION(
5793 "Attempt to draw with a command buffer that is invalid "
5794 "due to a bound descriptor sets with a combined image "
5795 "sampler having their image, sampler, and descriptor set "
5796 "each respectively destroyed and then attempting to "
5797 "submit associated cmd buffers. Attempt to destroy a "
5798 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005799 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_NO_FATAL_FAILURE(InitViewport());
5801 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5802
5803 VkDescriptorPoolSize ds_type_count = {};
5804 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5805 ds_type_count.descriptorCount = 1;
5806
5807 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5808 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5809 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005810 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005811 ds_pool_ci.maxSets = 1;
5812 ds_pool_ci.poolSizeCount = 1;
5813 ds_pool_ci.pPoolSizes = &ds_type_count;
5814
5815 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005816 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005817 ASSERT_VK_SUCCESS(err);
5818
5819 VkDescriptorSetLayoutBinding dsl_binding = {};
5820 dsl_binding.binding = 0;
5821 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5822 dsl_binding.descriptorCount = 1;
5823 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5824 dsl_binding.pImmutableSamplers = NULL;
5825
5826 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5827 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5828 ds_layout_ci.pNext = NULL;
5829 ds_layout_ci.bindingCount = 1;
5830 ds_layout_ci.pBindings = &dsl_binding;
5831 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005833 ASSERT_VK_SUCCESS(err);
5834
5835 VkDescriptorSet descriptorSet;
5836 VkDescriptorSetAllocateInfo alloc_info = {};
5837 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5838 alloc_info.descriptorSetCount = 1;
5839 alloc_info.descriptorPool = ds_pool;
5840 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005841 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005842 ASSERT_VK_SUCCESS(err);
5843
5844 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5845 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5846 pipeline_layout_ci.pNext = NULL;
5847 pipeline_layout_ci.setLayoutCount = 1;
5848 pipeline_layout_ci.pSetLayouts = &ds_layout;
5849
5850 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005851 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005852 ASSERT_VK_SUCCESS(err);
5853
5854 // Create images to update the descriptor with
5855 VkImage image;
5856 VkImage image2;
5857 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5858 const int32_t tex_width = 32;
5859 const int32_t tex_height = 32;
5860 VkImageCreateInfo image_create_info = {};
5861 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5862 image_create_info.pNext = NULL;
5863 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5864 image_create_info.format = tex_format;
5865 image_create_info.extent.width = tex_width;
5866 image_create_info.extent.height = tex_height;
5867 image_create_info.extent.depth = 1;
5868 image_create_info.mipLevels = 1;
5869 image_create_info.arrayLayers = 1;
5870 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5871 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5872 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5873 image_create_info.flags = 0;
5874 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5875 ASSERT_VK_SUCCESS(err);
5876 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5877 ASSERT_VK_SUCCESS(err);
5878
5879 VkMemoryRequirements memory_reqs;
5880 VkDeviceMemory image_memory;
5881 bool pass;
5882 VkMemoryAllocateInfo memory_info = {};
5883 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5884 memory_info.pNext = NULL;
5885 memory_info.allocationSize = 0;
5886 memory_info.memoryTypeIndex = 0;
5887 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5888 // Allocate enough memory for both images
5889 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005890 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005891 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005892 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005893 ASSERT_VK_SUCCESS(err);
5894 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5895 ASSERT_VK_SUCCESS(err);
5896 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005897 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005898 ASSERT_VK_SUCCESS(err);
5899
5900 VkImageViewCreateInfo image_view_create_info = {};
5901 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5902 image_view_create_info.image = image;
5903 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5904 image_view_create_info.format = tex_format;
5905 image_view_create_info.subresourceRange.layerCount = 1;
5906 image_view_create_info.subresourceRange.baseMipLevel = 0;
5907 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005908 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005909
5910 VkImageView view;
5911 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005912 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005913 ASSERT_VK_SUCCESS(err);
5914 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005915 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005916 ASSERT_VK_SUCCESS(err);
5917 // Create Samplers
5918 VkSamplerCreateInfo sampler_ci = {};
5919 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5920 sampler_ci.pNext = NULL;
5921 sampler_ci.magFilter = VK_FILTER_NEAREST;
5922 sampler_ci.minFilter = VK_FILTER_NEAREST;
5923 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5924 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5925 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5926 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5927 sampler_ci.mipLodBias = 1.0;
5928 sampler_ci.anisotropyEnable = VK_FALSE;
5929 sampler_ci.maxAnisotropy = 1;
5930 sampler_ci.compareEnable = VK_FALSE;
5931 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5932 sampler_ci.minLod = 1.0;
5933 sampler_ci.maxLod = 1.0;
5934 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5935 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5936 VkSampler sampler;
5937 VkSampler sampler2;
5938 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5939 ASSERT_VK_SUCCESS(err);
5940 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5941 ASSERT_VK_SUCCESS(err);
5942 // Update descriptor with image and sampler
5943 VkDescriptorImageInfo img_info = {};
5944 img_info.sampler = sampler;
5945 img_info.imageView = view;
5946 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5947
5948 VkWriteDescriptorSet descriptor_write;
5949 memset(&descriptor_write, 0, sizeof(descriptor_write));
5950 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5951 descriptor_write.dstSet = descriptorSet;
5952 descriptor_write.dstBinding = 0;
5953 descriptor_write.descriptorCount = 1;
5954 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5955 descriptor_write.pImageInfo = &img_info;
5956
5957 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5958
5959 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005960 char const *vsSource =
5961 "#version 450\n"
5962 "\n"
5963 "out gl_PerVertex { \n"
5964 " vec4 gl_Position;\n"
5965 "};\n"
5966 "void main(){\n"
5967 " gl_Position = vec4(1);\n"
5968 "}\n";
5969 char const *fsSource =
5970 "#version 450\n"
5971 "\n"
5972 "layout(set=0, binding=0) uniform sampler2D s;\n"
5973 "layout(location=0) out vec4 x;\n"
5974 "void main(){\n"
5975 " x = texture(s, vec2(1));\n"
5976 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005977 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5978 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5979 VkPipelineObj pipe(m_device);
5980 pipe.AddShader(&vs);
5981 pipe.AddShader(&fs);
5982 pipe.AddColorAttachment();
5983 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5984
5985 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005987 m_commandBuffer->BeginCommandBuffer();
5988 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005989 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5990 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5991 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005992 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5993 VkRect2D scissor = {{0, 0}, {16, 16}};
5994 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5995 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005996 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005997 m_commandBuffer->EndRenderPass();
5998 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005999 // Destroy sampler invalidates the cmd buffer, causing error on submit
6000 vkDestroySampler(m_device->device(), sampler, NULL);
6001 // Attempt to submit cmd buffer
6002 VkSubmitInfo submit_info = {};
6003 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6004 submit_info.commandBufferCount = 1;
6005 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6006 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6007 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07006008
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006009 // Now re-update descriptor with valid sampler and delete image
6010 img_info.sampler = sampler2;
6011 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006012
6013 VkCommandBufferBeginInfo info = {};
6014 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6015 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
6016
Mark Lobodzinski33826372017-04-13 11:10:11 -06006017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07006018 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006019 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006020 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6021 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6022 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006023 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6024 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006026 m_commandBuffer->EndRenderPass();
6027 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006028 // Destroy image invalidates the cmd buffer, causing error on submit
6029 vkDestroyImage(m_device->device(), image, NULL);
6030 // Attempt to submit cmd buffer
6031 submit_info = {};
6032 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6033 submit_info.commandBufferCount = 1;
6034 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6035 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6036 m_errorMonitor->VerifyFound();
6037 // Now update descriptor to be valid, but then free descriptor
6038 img_info.imageView = view2;
6039 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006040 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006041 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006042 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6043 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6044 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006045 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6046 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006047 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006048 m_commandBuffer->EndRenderPass();
6049 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006050 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006051
6052 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006054 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006055 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006056
6057 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006058 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006059 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006060 m_errorMonitor->SetUnexpectedError(
6061 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6062 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006063 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006064 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6065
6066 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006067 submit_info = {};
6068 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6069 submit_info.commandBufferCount = 1;
6070 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006072 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6073 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006074
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006075 // Cleanup
6076 vkFreeMemory(m_device->device(), image_memory, NULL);
6077 vkDestroySampler(m_device->device(), sampler2, NULL);
6078 vkDestroyImage(m_device->device(), image2, NULL);
6079 vkDestroyImageView(m_device->device(), view, NULL);
6080 vkDestroyImageView(m_device->device(), view2, NULL);
6081 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6082 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6083 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6084}
6085
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006086TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6087 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6088 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6089 ASSERT_NO_FATAL_FAILURE(InitViewport());
6090 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6091
6092 VkDescriptorPoolSize ds_type_count = {};
6093 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6094 ds_type_count.descriptorCount = 1;
6095
6096 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6097 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6098 ds_pool_ci.pNext = NULL;
6099 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6100 ds_pool_ci.maxSets = 1;
6101 ds_pool_ci.poolSizeCount = 1;
6102 ds_pool_ci.pPoolSizes = &ds_type_count;
6103
6104 VkDescriptorPool ds_pool;
6105 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6106 ASSERT_VK_SUCCESS(err);
6107
6108 VkDescriptorSetLayoutBinding dsl_binding = {};
6109 dsl_binding.binding = 0;
6110 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6111 dsl_binding.descriptorCount = 1;
6112 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6113 dsl_binding.pImmutableSamplers = NULL;
6114
6115 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6116 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6117 ds_layout_ci.pNext = NULL;
6118 ds_layout_ci.bindingCount = 1;
6119 ds_layout_ci.pBindings = &dsl_binding;
6120 VkDescriptorSetLayout ds_layout;
6121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6122 ASSERT_VK_SUCCESS(err);
6123
6124 VkDescriptorSet descriptorSet;
6125 VkDescriptorSetAllocateInfo alloc_info = {};
6126 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6127 alloc_info.descriptorSetCount = 1;
6128 alloc_info.descriptorPool = ds_pool;
6129 alloc_info.pSetLayouts = &ds_layout;
6130 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6131 ASSERT_VK_SUCCESS(err);
6132
6133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6135 pipeline_layout_ci.pNext = NULL;
6136 pipeline_layout_ci.setLayoutCount = 1;
6137 pipeline_layout_ci.pSetLayouts = &ds_layout;
6138
6139 VkPipelineLayout pipeline_layout;
6140 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6141 ASSERT_VK_SUCCESS(err);
6142
6143 // Create images to update the descriptor with
6144 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6145 VkImageObj image(m_device);
6146 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6147 0);
6148 ASSERT_TRUE(image.initialized());
6149
6150 VkImageViewCreateInfo image_view_create_info = {};
6151 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6152 image_view_create_info.image = image.handle();
6153 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6154 image_view_create_info.format = format;
6155 image_view_create_info.subresourceRange.layerCount = 1;
6156 image_view_create_info.subresourceRange.baseMipLevel = 0;
6157 image_view_create_info.subresourceRange.levelCount = 1;
6158 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6159
6160 VkImageView view;
6161 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6162 ASSERT_VK_SUCCESS(err);
6163 // Create Sampler
6164 VkSamplerCreateInfo sampler_ci = {};
6165 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6166 sampler_ci.pNext = NULL;
6167 sampler_ci.magFilter = VK_FILTER_NEAREST;
6168 sampler_ci.minFilter = VK_FILTER_NEAREST;
6169 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6170 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6171 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6172 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6173 sampler_ci.mipLodBias = 1.0;
6174 sampler_ci.anisotropyEnable = VK_FALSE;
6175 sampler_ci.maxAnisotropy = 1;
6176 sampler_ci.compareEnable = VK_FALSE;
6177 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6178 sampler_ci.minLod = 1.0;
6179 sampler_ci.maxLod = 1.0;
6180 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6181 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6182 VkSampler sampler;
6183 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6184 ASSERT_VK_SUCCESS(err);
6185 // Update descriptor with image and sampler
6186 VkDescriptorImageInfo img_info = {};
6187 img_info.sampler = sampler;
6188 img_info.imageView = view;
6189 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6190 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6191
6192 VkWriteDescriptorSet descriptor_write;
6193 memset(&descriptor_write, 0, sizeof(descriptor_write));
6194 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6195 descriptor_write.dstSet = descriptorSet;
6196 descriptor_write.dstBinding = 0;
6197 descriptor_write.descriptorCount = 1;
6198 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6199 descriptor_write.pImageInfo = &img_info;
6200
6201 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6202
6203 // Create PSO to be used for draw-time errors below
6204 char const *vsSource =
6205 "#version 450\n"
6206 "\n"
6207 "out gl_PerVertex { \n"
6208 " vec4 gl_Position;\n"
6209 "};\n"
6210 "void main(){\n"
6211 " gl_Position = vec4(1);\n"
6212 "}\n";
6213 char const *fsSource =
6214 "#version 450\n"
6215 "\n"
6216 "layout(set=0, binding=0) uniform sampler2D s;\n"
6217 "layout(location=0) out vec4 x;\n"
6218 "void main(){\n"
6219 " x = texture(s, vec2(1));\n"
6220 "}\n";
6221 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6222 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6223 VkPipelineObj pipe(m_device);
6224 pipe.AddShader(&vs);
6225 pipe.AddShader(&fs);
6226 pipe.AddColorAttachment();
6227 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6228
6229 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6230 cmd_buf.BeginCommandBuffer();
6231 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
6232 // record layout different than actual descriptor layout of SHADER_RO
6233 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
6234 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6235 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6236 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6237 VkRect2D scissor = {{0, 0}, {16, 16}};
6238 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6239 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6240 // At draw time the update layout will mis-match the actual layout
6241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6242 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6243 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6244 m_errorMonitor->SetDesiredFailureMsg(
6245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6246 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6247 cmd_buf.Draw(1, 0, 0, 0);
6248 m_errorMonitor->VerifyFound();
6249 cmd_buf.EndRenderPass();
6250 cmd_buf.EndCommandBuffer();
6251 // Submit cmd buffer
6252 VkSubmitInfo submit_info = {};
6253 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6254 submit_info.commandBufferCount = 1;
6255 submit_info.pCommandBuffers = &cmd_buf.handle();
6256 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6257 vkQueueWaitIdle(m_device->m_queue);
6258 // Cleanup
6259 vkDestroySampler(m_device->device(), sampler, NULL);
6260 vkDestroyImageView(m_device->device(), view, NULL);
6261 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6262 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6263 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6264}
6265
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006266TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6267 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006268 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006269 ASSERT_NO_FATAL_FAILURE(InitViewport());
6270 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6271
6272 VkDescriptorPoolSize ds_type_count = {};
6273 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6274 ds_type_count.descriptorCount = 1;
6275
6276 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6277 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6278 ds_pool_ci.pNext = NULL;
6279 ds_pool_ci.maxSets = 1;
6280 ds_pool_ci.poolSizeCount = 1;
6281 ds_pool_ci.pPoolSizes = &ds_type_count;
6282
6283 VkDescriptorPool ds_pool;
6284 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6285 ASSERT_VK_SUCCESS(err);
6286
6287 VkDescriptorSetLayoutBinding dsl_binding = {};
6288 dsl_binding.binding = 0;
6289 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6290 dsl_binding.descriptorCount = 1;
6291 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6292 dsl_binding.pImmutableSamplers = NULL;
6293
6294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6296 ds_layout_ci.pNext = NULL;
6297 ds_layout_ci.bindingCount = 1;
6298 ds_layout_ci.pBindings = &dsl_binding;
6299 VkDescriptorSetLayout ds_layout;
6300 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6301 ASSERT_VK_SUCCESS(err);
6302
6303 VkDescriptorSet descriptor_set;
6304 VkDescriptorSetAllocateInfo alloc_info = {};
6305 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6306 alloc_info.descriptorSetCount = 1;
6307 alloc_info.descriptorPool = ds_pool;
6308 alloc_info.pSetLayouts = &ds_layout;
6309 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6310 ASSERT_VK_SUCCESS(err);
6311
6312 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6313 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6314 pipeline_layout_ci.pNext = NULL;
6315 pipeline_layout_ci.setLayoutCount = 1;
6316 pipeline_layout_ci.pSetLayouts = &ds_layout;
6317
6318 VkPipelineLayout pipeline_layout;
6319 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6320 ASSERT_VK_SUCCESS(err);
6321
6322 // Create image to update the descriptor with
6323 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006324 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006325 ASSERT_TRUE(image.initialized());
6326
6327 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6328 // Create Sampler
6329 VkSamplerCreateInfo sampler_ci = {};
6330 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6331 sampler_ci.pNext = NULL;
6332 sampler_ci.magFilter = VK_FILTER_NEAREST;
6333 sampler_ci.minFilter = VK_FILTER_NEAREST;
6334 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6335 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6336 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6337 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6338 sampler_ci.mipLodBias = 1.0;
6339 sampler_ci.anisotropyEnable = VK_FALSE;
6340 sampler_ci.maxAnisotropy = 1;
6341 sampler_ci.compareEnable = VK_FALSE;
6342 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6343 sampler_ci.minLod = 1.0;
6344 sampler_ci.maxLod = 1.0;
6345 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6346 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6347 VkSampler sampler;
6348 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6349 ASSERT_VK_SUCCESS(err);
6350 // Update descriptor with image and sampler
6351 VkDescriptorImageInfo img_info = {};
6352 img_info.sampler = sampler;
6353 img_info.imageView = view;
6354 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6355
6356 VkWriteDescriptorSet descriptor_write;
6357 memset(&descriptor_write, 0, sizeof(descriptor_write));
6358 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6359 descriptor_write.dstSet = descriptor_set;
6360 descriptor_write.dstBinding = 0;
6361 descriptor_write.descriptorCount = 1;
6362 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6363 descriptor_write.pImageInfo = &img_info;
6364
6365 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6366
6367 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006368 char const *vsSource =
6369 "#version 450\n"
6370 "\n"
6371 "out gl_PerVertex { \n"
6372 " vec4 gl_Position;\n"
6373 "};\n"
6374 "void main(){\n"
6375 " gl_Position = vec4(1);\n"
6376 "}\n";
6377 char const *fsSource =
6378 "#version 450\n"
6379 "\n"
6380 "layout(set=0, binding=0) uniform sampler2D s;\n"
6381 "layout(location=0) out vec4 x;\n"
6382 "void main(){\n"
6383 " x = texture(s, vec2(1));\n"
6384 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006385 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6386 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6387 VkPipelineObj pipe(m_device);
6388 pipe.AddShader(&vs);
6389 pipe.AddShader(&fs);
6390 pipe.AddColorAttachment();
6391 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6392
Tony Barbour552f6c02016-12-21 14:34:07 -07006393 m_commandBuffer->BeginCommandBuffer();
6394 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006395 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6396 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6397 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006398
6399 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6400 VkRect2D scissor = {{0, 0}, {16, 16}};
6401 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6402 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6403
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006404 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006405 m_commandBuffer->EndRenderPass();
6406 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006407 // Submit cmd buffer to put pool in-flight
6408 VkSubmitInfo submit_info = {};
6409 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6410 submit_info.commandBufferCount = 1;
6411 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6412 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6413 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006415 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6416 m_errorMonitor->VerifyFound();
6417 vkQueueWaitIdle(m_device->m_queue);
6418 // Cleanup
6419 vkDestroySampler(m_device->device(), sampler, NULL);
6420 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6421 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006422 m_errorMonitor->SetUnexpectedError(
6423 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006424 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006425 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006426 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006427}
6428
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006429TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6430 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006431 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006432 ASSERT_NO_FATAL_FAILURE(InitViewport());
6433 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6434
6435 VkDescriptorPoolSize ds_type_count = {};
6436 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6437 ds_type_count.descriptorCount = 1;
6438
6439 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6440 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6441 ds_pool_ci.pNext = NULL;
6442 ds_pool_ci.maxSets = 1;
6443 ds_pool_ci.poolSizeCount = 1;
6444 ds_pool_ci.pPoolSizes = &ds_type_count;
6445
6446 VkDescriptorPool ds_pool;
6447 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6448 ASSERT_VK_SUCCESS(err);
6449
6450 VkDescriptorSetLayoutBinding dsl_binding = {};
6451 dsl_binding.binding = 0;
6452 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6453 dsl_binding.descriptorCount = 1;
6454 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6455 dsl_binding.pImmutableSamplers = NULL;
6456
6457 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6458 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6459 ds_layout_ci.pNext = NULL;
6460 ds_layout_ci.bindingCount = 1;
6461 ds_layout_ci.pBindings = &dsl_binding;
6462 VkDescriptorSetLayout ds_layout;
6463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6464 ASSERT_VK_SUCCESS(err);
6465
6466 VkDescriptorSet descriptorSet;
6467 VkDescriptorSetAllocateInfo alloc_info = {};
6468 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6469 alloc_info.descriptorSetCount = 1;
6470 alloc_info.descriptorPool = ds_pool;
6471 alloc_info.pSetLayouts = &ds_layout;
6472 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6473 ASSERT_VK_SUCCESS(err);
6474
6475 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6476 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6477 pipeline_layout_ci.pNext = NULL;
6478 pipeline_layout_ci.setLayoutCount = 1;
6479 pipeline_layout_ci.pSetLayouts = &ds_layout;
6480
6481 VkPipelineLayout pipeline_layout;
6482 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6483 ASSERT_VK_SUCCESS(err);
6484
6485 // Create images to update the descriptor with
6486 VkImage image;
6487 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6488 const int32_t tex_width = 32;
6489 const int32_t tex_height = 32;
6490 VkImageCreateInfo image_create_info = {};
6491 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6492 image_create_info.pNext = NULL;
6493 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6494 image_create_info.format = tex_format;
6495 image_create_info.extent.width = tex_width;
6496 image_create_info.extent.height = tex_height;
6497 image_create_info.extent.depth = 1;
6498 image_create_info.mipLevels = 1;
6499 image_create_info.arrayLayers = 1;
6500 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6501 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6502 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6503 image_create_info.flags = 0;
6504 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6505 ASSERT_VK_SUCCESS(err);
6506 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6507 VkMemoryRequirements memory_reqs;
6508 VkDeviceMemory image_memory;
6509 bool pass;
6510 VkMemoryAllocateInfo memory_info = {};
6511 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6512 memory_info.pNext = NULL;
6513 memory_info.allocationSize = 0;
6514 memory_info.memoryTypeIndex = 0;
6515 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6516 // Allocate enough memory for image
6517 memory_info.allocationSize = memory_reqs.size;
6518 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6519 ASSERT_TRUE(pass);
6520 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6521 ASSERT_VK_SUCCESS(err);
6522 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6523 ASSERT_VK_SUCCESS(err);
6524
6525 VkImageViewCreateInfo image_view_create_info = {};
6526 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6527 image_view_create_info.image = image;
6528 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6529 image_view_create_info.format = tex_format;
6530 image_view_create_info.subresourceRange.layerCount = 1;
6531 image_view_create_info.subresourceRange.baseMipLevel = 0;
6532 image_view_create_info.subresourceRange.levelCount = 1;
6533 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6534
6535 VkImageView view;
6536 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6537 ASSERT_VK_SUCCESS(err);
6538 // Create Samplers
6539 VkSamplerCreateInfo sampler_ci = {};
6540 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6541 sampler_ci.pNext = NULL;
6542 sampler_ci.magFilter = VK_FILTER_NEAREST;
6543 sampler_ci.minFilter = VK_FILTER_NEAREST;
6544 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6545 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6546 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6547 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6548 sampler_ci.mipLodBias = 1.0;
6549 sampler_ci.anisotropyEnable = VK_FALSE;
6550 sampler_ci.maxAnisotropy = 1;
6551 sampler_ci.compareEnable = VK_FALSE;
6552 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6553 sampler_ci.minLod = 1.0;
6554 sampler_ci.maxLod = 1.0;
6555 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6556 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6557 VkSampler sampler;
6558 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6559 ASSERT_VK_SUCCESS(err);
6560 // Update descriptor with image and sampler
6561 VkDescriptorImageInfo img_info = {};
6562 img_info.sampler = sampler;
6563 img_info.imageView = view;
6564 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6565
6566 VkWriteDescriptorSet descriptor_write;
6567 memset(&descriptor_write, 0, sizeof(descriptor_write));
6568 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6569 descriptor_write.dstSet = descriptorSet;
6570 descriptor_write.dstBinding = 0;
6571 descriptor_write.descriptorCount = 1;
6572 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6573 descriptor_write.pImageInfo = &img_info;
6574 // Break memory binding and attempt update
6575 vkFreeMemory(m_device->device(), image_memory, nullptr);
6576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006577 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6579 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6580 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6581 m_errorMonitor->VerifyFound();
6582 // Cleanup
6583 vkDestroyImage(m_device->device(), image, NULL);
6584 vkDestroySampler(m_device->device(), sampler, NULL);
6585 vkDestroyImageView(m_device->device(), view, NULL);
6586 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6587 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6588 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6589}
6590
Karl Schultz6addd812016-02-02 17:17:23 -07006591TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006592 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6593 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006594 // Create a valid cmd buffer
6595 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006596 uint64_t fake_pipeline_handle = 0xbaad6001;
6597 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006598 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6600
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006602 m_commandBuffer->BeginCommandBuffer();
6603 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006604 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006605 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006606
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006607 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006609 Draw(1, 0, 0, 0);
6610 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006611
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006612 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006614 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006615 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6616 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006617}
6618
Karl Schultz6addd812016-02-02 17:17:23 -07006619TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006620 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006621 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006622
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006624
Tony Barbour1fa09702017-03-16 12:09:08 -06006625 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006626 ASSERT_NO_FATAL_FAILURE(InitViewport());
6627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006628 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006629 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6630 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006631
6632 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006633 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6634 ds_pool_ci.pNext = NULL;
6635 ds_pool_ci.maxSets = 1;
6636 ds_pool_ci.poolSizeCount = 1;
6637 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006638
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006639 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006640 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006641 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006642
Tony Barboureb254902015-07-15 12:50:33 -06006643 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006644 dsl_binding.binding = 0;
6645 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6646 dsl_binding.descriptorCount = 1;
6647 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6648 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006649
Tony Barboureb254902015-07-15 12:50:33 -06006650 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006651 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6652 ds_layout_ci.pNext = NULL;
6653 ds_layout_ci.bindingCount = 1;
6654 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006655 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006656 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006657 ASSERT_VK_SUCCESS(err);
6658
6659 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006660 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006662 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006663 alloc_info.descriptorPool = ds_pool;
6664 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006666 ASSERT_VK_SUCCESS(err);
6667
Tony Barboureb254902015-07-15 12:50:33 -06006668 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006669 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6670 pipeline_layout_ci.pNext = NULL;
6671 pipeline_layout_ci.setLayoutCount = 1;
6672 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006673
6674 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006675 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006676 ASSERT_VK_SUCCESS(err);
6677
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006679 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006680 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006681 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006682
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006683 VkPipelineObj pipe(m_device);
6684 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006685 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006686 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006687 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006688
Tony Barbour552f6c02016-12-21 14:34:07 -07006689 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006690 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6691 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6692 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006693
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006694 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006695
Chia-I Wuf7458c52015-10-26 21:10:41 +08006696 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6697 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6698 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006699}
6700
Karl Schultz6addd812016-02-02 17:17:23 -07006701TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006702 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006703 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006704
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006706
Tony Barbour1fa09702017-03-16 12:09:08 -06006707 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006708 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006709 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6710 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006711
6712 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006713 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6714 ds_pool_ci.pNext = NULL;
6715 ds_pool_ci.maxSets = 1;
6716 ds_pool_ci.poolSizeCount = 1;
6717 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006718
6719 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006720 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006721 ASSERT_VK_SUCCESS(err);
6722
6723 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006724 dsl_binding.binding = 0;
6725 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6726 dsl_binding.descriptorCount = 1;
6727 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6728 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006729
6730 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006731 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6732 ds_layout_ci.pNext = NULL;
6733 ds_layout_ci.bindingCount = 1;
6734 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006735 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006736 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006737 ASSERT_VK_SUCCESS(err);
6738
6739 VkDescriptorSet descriptorSet;
6740 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006741 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006742 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006743 alloc_info.descriptorPool = ds_pool;
6744 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006745 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006746 ASSERT_VK_SUCCESS(err);
6747
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006748 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006749 VkWriteDescriptorSet descriptor_write;
6750 memset(&descriptor_write, 0, sizeof(descriptor_write));
6751 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6752 descriptor_write.dstSet = descriptorSet;
6753 descriptor_write.dstBinding = 0;
6754 descriptor_write.descriptorCount = 1;
6755 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6756 descriptor_write.pTexelBufferView = &view;
6757
6758 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6759
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006760 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006761
6762 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6763 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6764}
6765
Mark Youngd339ba32016-05-30 13:28:35 -06006766TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006767 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006768
6769 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006771 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006772
Tony Barbour1fa09702017-03-16 12:09:08 -06006773 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006774
6775 // Create a buffer with no bound memory and then attempt to create
6776 // a buffer view.
6777 VkBufferCreateInfo buff_ci = {};
6778 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006779 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006780 buff_ci.size = 256;
6781 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6782 VkBuffer buffer;
6783 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6784 ASSERT_VK_SUCCESS(err);
6785
6786 VkBufferViewCreateInfo buff_view_ci = {};
6787 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6788 buff_view_ci.buffer = buffer;
6789 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6790 buff_view_ci.range = VK_WHOLE_SIZE;
6791 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006792 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006793
6794 m_errorMonitor->VerifyFound();
6795 vkDestroyBuffer(m_device->device(), buffer, NULL);
6796 // If last error is success, it still created the view, so delete it.
6797 if (err == VK_SUCCESS) {
6798 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6799 }
6800}
6801
Karl Schultz6addd812016-02-02 17:17:23 -07006802TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6803 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6804 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006805 // 1. No dynamicOffset supplied
6806 // 2. Too many dynamicOffsets supplied
6807 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006808 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6810 " requires 1 dynamicOffsets, but only "
6811 "0 dynamicOffsets are left in "
6812 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006813
Tony Barbour1fa09702017-03-16 12:09:08 -06006814 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006815 ASSERT_NO_FATAL_FAILURE(InitViewport());
6816 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6817
6818 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006819 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6820 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006821
6822 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006823 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6824 ds_pool_ci.pNext = NULL;
6825 ds_pool_ci.maxSets = 1;
6826 ds_pool_ci.poolSizeCount = 1;
6827 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006828
6829 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006830 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006831 ASSERT_VK_SUCCESS(err);
6832
6833 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006834 dsl_binding.binding = 0;
6835 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6836 dsl_binding.descriptorCount = 1;
6837 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6838 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006839
6840 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006841 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6842 ds_layout_ci.pNext = NULL;
6843 ds_layout_ci.bindingCount = 1;
6844 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006845 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006846 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006847 ASSERT_VK_SUCCESS(err);
6848
6849 VkDescriptorSet descriptorSet;
6850 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006851 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006852 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006853 alloc_info.descriptorPool = ds_pool;
6854 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006855 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006856 ASSERT_VK_SUCCESS(err);
6857
6858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6860 pipeline_layout_ci.pNext = NULL;
6861 pipeline_layout_ci.setLayoutCount = 1;
6862 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006863
6864 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006865 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006866 ASSERT_VK_SUCCESS(err);
6867
6868 // Create a buffer to update the descriptor with
6869 uint32_t qfi = 0;
6870 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006871 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6872 buffCI.size = 1024;
6873 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6874 buffCI.queueFamilyIndexCount = 1;
6875 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006876
6877 VkBuffer dyub;
6878 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6879 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006880 // Allocate memory and bind to buffer so we can make it to the appropriate
6881 // error
6882 VkMemoryAllocateInfo mem_alloc = {};
6883 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6884 mem_alloc.pNext = NULL;
6885 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006886 mem_alloc.memoryTypeIndex = 0;
6887
6888 VkMemoryRequirements memReqs;
6889 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006890 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006891 if (!pass) {
6892 vkDestroyBuffer(m_device->device(), dyub, NULL);
6893 return;
6894 }
6895
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006896 VkDeviceMemory mem;
6897 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6898 ASSERT_VK_SUCCESS(err);
6899 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6900 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006901 // Correctly update descriptor to avoid "NOT_UPDATED" error
6902 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006903 buffInfo.buffer = dyub;
6904 buffInfo.offset = 0;
6905 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006906
6907 VkWriteDescriptorSet descriptor_write;
6908 memset(&descriptor_write, 0, sizeof(descriptor_write));
6909 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6910 descriptor_write.dstSet = descriptorSet;
6911 descriptor_write.dstBinding = 0;
6912 descriptor_write.descriptorCount = 1;
6913 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6914 descriptor_write.pBufferInfo = &buffInfo;
6915
6916 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6917
Tony Barbour552f6c02016-12-21 14:34:07 -07006918 m_commandBuffer->BeginCommandBuffer();
6919 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006920 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6921 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006922 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006923 uint32_t pDynOff[2] = {512, 756};
6924 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6926 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6928 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006929 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006930 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6932 " dynamic offset 512 combined with "
6933 "offset 0 and range 1024 that "
6934 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006935 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006936 char const *vsSource =
6937 "#version 450\n"
6938 "\n"
6939 "out gl_PerVertex { \n"
6940 " vec4 gl_Position;\n"
6941 "};\n"
6942 "void main(){\n"
6943 " gl_Position = vec4(1);\n"
6944 "}\n";
6945 char const *fsSource =
6946 "#version 450\n"
6947 "\n"
6948 "layout(location=0) out vec4 x;\n"
6949 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6950 "void main(){\n"
6951 " x = vec4(bar.y);\n"
6952 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006953 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6954 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6955 VkPipelineObj pipe(m_device);
6956 pipe.AddShader(&vs);
6957 pipe.AddShader(&fs);
6958 pipe.AddColorAttachment();
6959 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6960
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006961 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6962 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6963 VkRect2D scissor = {{0, 0}, {16, 16}};
6964 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6965
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006966 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006967 // This update should succeed, but offset size of 512 will overstep buffer
6968 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006969 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6970 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006971 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006972 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006973
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006974 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006975 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006976
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006977 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006978 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006979 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6980}
6981
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006982TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006983 TEST_DESCRIPTION(
6984 "Attempt to update a descriptor with a non-sparse buffer "
6985 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006986 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006988 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6990 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006991
Tony Barbour1fa09702017-03-16 12:09:08 -06006992 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006993 ASSERT_NO_FATAL_FAILURE(InitViewport());
6994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6995
6996 VkDescriptorPoolSize ds_type_count = {};
6997 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6998 ds_type_count.descriptorCount = 1;
6999
7000 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7001 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7002 ds_pool_ci.pNext = NULL;
7003 ds_pool_ci.maxSets = 1;
7004 ds_pool_ci.poolSizeCount = 1;
7005 ds_pool_ci.pPoolSizes = &ds_type_count;
7006
7007 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007008 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007009 ASSERT_VK_SUCCESS(err);
7010
7011 VkDescriptorSetLayoutBinding dsl_binding = {};
7012 dsl_binding.binding = 0;
7013 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7014 dsl_binding.descriptorCount = 1;
7015 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7016 dsl_binding.pImmutableSamplers = NULL;
7017
7018 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7019 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7020 ds_layout_ci.pNext = NULL;
7021 ds_layout_ci.bindingCount = 1;
7022 ds_layout_ci.pBindings = &dsl_binding;
7023 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007024 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007025 ASSERT_VK_SUCCESS(err);
7026
7027 VkDescriptorSet descriptorSet;
7028 VkDescriptorSetAllocateInfo alloc_info = {};
7029 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7030 alloc_info.descriptorSetCount = 1;
7031 alloc_info.descriptorPool = ds_pool;
7032 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007033 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007034 ASSERT_VK_SUCCESS(err);
7035
7036 // Create a buffer to update the descriptor with
7037 uint32_t qfi = 0;
7038 VkBufferCreateInfo buffCI = {};
7039 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7040 buffCI.size = 1024;
7041 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7042 buffCI.queueFamilyIndexCount = 1;
7043 buffCI.pQueueFamilyIndices = &qfi;
7044
7045 VkBuffer dyub;
7046 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7047 ASSERT_VK_SUCCESS(err);
7048
7049 // Attempt to update descriptor without binding memory to it
7050 VkDescriptorBufferInfo buffInfo = {};
7051 buffInfo.buffer = dyub;
7052 buffInfo.offset = 0;
7053 buffInfo.range = 1024;
7054
7055 VkWriteDescriptorSet descriptor_write;
7056 memset(&descriptor_write, 0, sizeof(descriptor_write));
7057 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7058 descriptor_write.dstSet = descriptorSet;
7059 descriptor_write.dstBinding = 0;
7060 descriptor_write.descriptorCount = 1;
7061 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7062 descriptor_write.pBufferInfo = &buffInfo;
7063
7064 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7065 m_errorMonitor->VerifyFound();
7066
7067 vkDestroyBuffer(m_device->device(), dyub, NULL);
7068 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7069 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7070}
7071
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007072TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007073 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007074 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007075 ASSERT_NO_FATAL_FAILURE(InitViewport());
7076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7077
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007078 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007079 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007080 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7081 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7082 pipeline_layout_ci.pushConstantRangeCount = 1;
7083 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7084
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007085 //
7086 // Check for invalid push constant ranges in pipeline layouts.
7087 //
7088 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007089 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007090 char const *msg;
7091 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007092
Karl Schultzc81037d2016-05-12 08:11:23 -06007093 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7094 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7095 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7096 "vkCreatePipelineLayout() call has push constants index 0 with "
7097 "size 0."},
7098 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7099 "vkCreatePipelineLayout() call has push constants index 0 with "
7100 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007101 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007102 "vkCreatePipelineLayout() call has push constants index 0 with "
7103 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007104 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007105 "vkCreatePipelineLayout() call has push constants index 0 with "
7106 "size 0."},
7107 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7108 "vkCreatePipelineLayout() call has push constants index 0 with "
7109 "offset 1. Offset must"},
7110 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7111 "vkCreatePipelineLayout() call has push constants index 0 "
7112 "with offset "},
7113 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7114 "vkCreatePipelineLayout() call has push constants "
7115 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007116 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007117 "vkCreatePipelineLayout() call has push constants index 0 "
7118 "with offset "},
7119 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7120 "vkCreatePipelineLayout() call has push "
7121 "constants index 0 with offset "},
7122 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7123 "vkCreatePipelineLayout() call has push "
7124 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007125 }};
7126
7127 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007128 for (const auto &iter : range_tests) {
7129 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7131 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007132 m_errorMonitor->VerifyFound();
7133 if (VK_SUCCESS == err) {
7134 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7135 }
7136 }
7137
7138 // Check for invalid stage flag
7139 pc_range.offset = 0;
7140 pc_range.size = 16;
7141 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007142 m_errorMonitor->SetDesiredFailureMsg(
7143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7144 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007145 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007146 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007147 if (VK_SUCCESS == err) {
7148 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7149 }
7150
Karl Schultzc59b72d2017-02-24 15:45:05 -07007151 // Check for duplicate stage flags in a list of push constant ranges.
7152 // A shader can only have one push constant block and that block is mapped
7153 // to the push constant range that has that shader's stage flag set.
7154 // The shader's stage flag can only appear once in all the ranges, so the
7155 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007156 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007157 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007158 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007159 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007160 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007161 // Overlapping ranges are OK, but a stage flag can appear only once.
7162 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7163 {
7164 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7165 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7166 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7167 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007168 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007169 {
7170 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7171 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7172 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7173 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7174 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7175 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7176 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7177 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7178 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7179 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7180 }},
7181 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7182 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7183 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7184 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7185 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7186 {
7187 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7188 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7189 }},
7190 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7191 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7192 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7193 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7194 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7195 {
7196 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7197 }},
7198 },
7199 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007200
Karl Schultzc59b72d2017-02-24 15:45:05 -07007201 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007202 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007203 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007205 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007206 m_errorMonitor->VerifyFound();
7207 if (VK_SUCCESS == err) {
7208 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7209 }
7210 }
7211
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007212 //
7213 // CmdPushConstants tests
7214 //
7215
Karl Schultzc59b72d2017-02-24 15:45:05 -07007216 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007217 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007218 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007219 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007220 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007221 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007222 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007223 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007224
7225 const uint8_t dummy_values[100] = {};
7226
7227 m_commandBuffer->BeginCommandBuffer();
7228 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007229
7230 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007231 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007233 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007234 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007235
Karl Schultzc59b72d2017-02-24 15:45:05 -07007236 m_errorMonitor->ExpectSuccess();
7237 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7238 m_errorMonitor->VerifyNotFound();
7239 m_errorMonitor->ExpectSuccess();
7240 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7241 m_errorMonitor->VerifyNotFound();
7242 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7243 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7244 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7245 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7246 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7247 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7248 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007249 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007250 for (const auto &iter : cmd_range_tests) {
7251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7252 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7253 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007254 m_errorMonitor->VerifyFound();
7255 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007256
Tony Barbour552f6c02016-12-21 14:34:07 -07007257 m_commandBuffer->EndRenderPass();
7258 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007259 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007260}
7261
Karl Schultz6addd812016-02-02 17:17:23 -07007262TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007263 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007264 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007265
Tony Barbour1fa09702017-03-16 12:09:08 -06007266 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007267 ASSERT_NO_FATAL_FAILURE(InitViewport());
7268 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7269
7270 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7271 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007272 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7273 ds_type_count[0].descriptorCount = 10;
7274 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7275 ds_type_count[1].descriptorCount = 2;
7276 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7277 ds_type_count[2].descriptorCount = 2;
7278 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7279 ds_type_count[3].descriptorCount = 5;
7280 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7281 // type
7282 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7283 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7284 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007285
7286 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007287 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7288 ds_pool_ci.pNext = NULL;
7289 ds_pool_ci.maxSets = 5;
7290 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7291 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007292
7293 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007294 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007295 ASSERT_VK_SUCCESS(err);
7296
7297 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7298 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007299 dsl_binding[0].binding = 0;
7300 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7301 dsl_binding[0].descriptorCount = 5;
7302 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7303 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007304
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007305 // Create layout identical to set0 layout but w/ different stageFlags
7306 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007307 dsl_fs_stage_only.binding = 0;
7308 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7309 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007310 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7311 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007312 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007313 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007314 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7315 ds_layout_ci.pNext = NULL;
7316 ds_layout_ci.bindingCount = 1;
7317 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007318 static const uint32_t NUM_LAYOUTS = 4;
7319 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007320 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007321 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7322 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007323 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007324 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007325 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007326 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007327 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007328 dsl_binding[0].binding = 0;
7329 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007330 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007331 dsl_binding[1].binding = 1;
7332 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7333 dsl_binding[1].descriptorCount = 2;
7334 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7335 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007336 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007337 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007338 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007339 ASSERT_VK_SUCCESS(err);
7340 dsl_binding[0].binding = 0;
7341 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007343 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007344 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007345 ASSERT_VK_SUCCESS(err);
7346 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007347 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007348 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007349 ASSERT_VK_SUCCESS(err);
7350
7351 static const uint32_t NUM_SETS = 4;
7352 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7353 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007354 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007355 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007356 alloc_info.descriptorPool = ds_pool;
7357 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007358 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007359 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007360 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007361 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007362 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007363 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007364 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007365
7366 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007367 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7368 pipeline_layout_ci.pNext = NULL;
7369 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7370 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007371
7372 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007373 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007374 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007375 // Create pipelineLayout with only one setLayout
7376 pipeline_layout_ci.setLayoutCount = 1;
7377 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007378 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007379 ASSERT_VK_SUCCESS(err);
7380 // Create pipelineLayout with 2 descriptor setLayout at index 0
7381 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7382 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007383 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007384 ASSERT_VK_SUCCESS(err);
7385 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7386 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7387 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007388 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007389 ASSERT_VK_SUCCESS(err);
7390 // Create pipelineLayout with UB type, but stageFlags for FS only
7391 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7392 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007393 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007394 ASSERT_VK_SUCCESS(err);
7395 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7396 VkDescriptorSetLayout pl_bad_s0[2] = {};
7397 pl_bad_s0[0] = ds_layout_fs_only;
7398 pl_bad_s0[1] = ds_layout[1];
7399 pipeline_layout_ci.setLayoutCount = 2;
7400 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7401 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007402 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007403 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007404
Tobin Ehlis88452832015-12-03 09:40:56 -07007405 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007406 char const *vsSource =
7407 "#version 450\n"
7408 "\n"
7409 "out gl_PerVertex {\n"
7410 " vec4 gl_Position;\n"
7411 "};\n"
7412 "void main(){\n"
7413 " gl_Position = vec4(1);\n"
7414 "}\n";
7415 char const *fsSource =
7416 "#version 450\n"
7417 "\n"
7418 "layout(location=0) out vec4 x;\n"
7419 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7420 "void main(){\n"
7421 " x = vec4(bar.y);\n"
7422 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007423 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7424 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007425 VkPipelineObj pipe(m_device);
7426 pipe.AddShader(&vs);
7427 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007428 pipe.AddColorAttachment();
7429 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007430
Tony Barbour552f6c02016-12-21 14:34:07 -07007431 m_commandBuffer->BeginCommandBuffer();
7432 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007433
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007434 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007435 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7436 // of PSO
7437 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7438 // cmd_pipeline.c
7439 // due to the fact that cmd_alloc_dset_data() has not been called in
7440 // cmd_bind_graphics_pipeline()
7441 // TODO : Want to cause various binding incompatibility issues here to test
7442 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007443 // First cause various verify_layout_compatibility() fails
7444 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007445 // verify_set_layout_compatibility fail cases:
7446 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007448 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7449 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007450 m_errorMonitor->VerifyFound();
7451
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007452 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7454 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7455 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007456 m_errorMonitor->VerifyFound();
7457
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007458 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007459 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7460 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7462 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7463 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007464 m_errorMonitor->VerifyFound();
7465
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007466 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7467 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7470 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007471 m_errorMonitor->VerifyFound();
7472
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007473 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7474 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7476 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7477 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7478 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007479 m_errorMonitor->VerifyFound();
7480
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007481 // Cause INFO messages due to disturbing previously bound Sets
7482 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007483 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7484 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007485 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7487 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7488 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007489 m_errorMonitor->VerifyFound();
7490
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007491 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7492 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007493 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7495 " newly bound as set #0 so set #1 and "
7496 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007497 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7498 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007499 m_errorMonitor->VerifyFound();
7500
Tobin Ehlis10fad692016-07-07 12:00:36 -06007501 // Now that we're done actively using the pipelineLayout that gfx pipeline
7502 // was created with, we should be able to delete it. Do that now to verify
7503 // that validation obeys pipelineLayout lifetime
7504 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7505
Tobin Ehlis88452832015-12-03 09:40:56 -07007506 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007507 // 1. Error due to not binding required set (we actually use same code as
7508 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007509 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7510 &descriptorSet[0], 0, NULL);
7511 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7512 &descriptorSet[1], 0, NULL);
7513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007514
7515 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7516 VkRect2D scissor = {{0, 0}, {16, 16}};
7517 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7518 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7519
Tobin Ehlis88452832015-12-03 09:40:56 -07007520 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007521 m_errorMonitor->VerifyFound();
7522
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007523 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007524 // 2. Error due to bound set not being compatible with PSO's
7525 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007526 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7527 &descriptorSet[0], 0, NULL);
7528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007529 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007530 m_errorMonitor->VerifyFound();
7531
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007532 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007533 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007534 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7535 }
7536 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007537 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7538 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7539}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007540
Karl Schultz6addd812016-02-02 17:17:23 -07007541TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7543 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007544
Tony Barbour1fa09702017-03-16 12:09:08 -06007545 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007546 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007547 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007548 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007549
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007550 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007551}
7552
Karl Schultz6addd812016-02-02 17:17:23 -07007553TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7554 VkResult err;
7555 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007556
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007558
Tony Barbour1fa09702017-03-16 12:09:08 -06007559 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007560
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007561 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007562 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007563 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007564 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007565 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007566 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007567
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007568 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007569 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007570
7571 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007572 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007573 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7574
7575 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007576 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007577 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007578 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007579 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007580
7581 // The error should be caught by validation of the BeginCommandBuffer call
7582 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7583
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007584 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007585 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007586}
7587
Karl Schultz6addd812016-02-02 17:17:23 -07007588TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007589 // Cause error due to Begin while recording CB
7590 // Then cause 2 errors for attempting to reset CB w/o having
7591 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7592 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007594
Tony Barbour1fa09702017-03-16 12:09:08 -06007595 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007596
7597 // Calls AllocateCommandBuffers
7598 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7599
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007600 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007601 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007602 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7603 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007604 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7605 cmd_buf_info.pNext = NULL;
7606 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007607 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007608
7609 // Begin CB to transition to recording state
7610 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7611 // Can't re-begin. This should trigger error
7612 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007613 m_errorMonitor->VerifyFound();
7614
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007616 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007617 // Reset attempt will trigger error due to incorrect CommandPool state
7618 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007619 m_errorMonitor->VerifyFound();
7620
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007622 // Transition CB to RECORDED state
7623 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7624 // Now attempting to Begin will implicitly reset, which triggers error
7625 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007626 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007627}
7628
Karl Schultz6addd812016-02-02 17:17:23 -07007629TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007630 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007631 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007632
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7634 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007635
Tony Barbour1fa09702017-03-16 12:09:08 -06007636 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007638
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007639 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007640 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7641 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007642
7643 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007644 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7645 ds_pool_ci.pNext = NULL;
7646 ds_pool_ci.maxSets = 1;
7647 ds_pool_ci.poolSizeCount = 1;
7648 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007649
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007650 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007651 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007652 ASSERT_VK_SUCCESS(err);
7653
Tony Barboureb254902015-07-15 12:50:33 -06007654 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007655 dsl_binding.binding = 0;
7656 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7657 dsl_binding.descriptorCount = 1;
7658 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7659 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007660
Tony Barboureb254902015-07-15 12:50:33 -06007661 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007662 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7663 ds_layout_ci.pNext = NULL;
7664 ds_layout_ci.bindingCount = 1;
7665 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007666
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007667 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007668 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007669 ASSERT_VK_SUCCESS(err);
7670
7671 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007672 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007673 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007674 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007675 alloc_info.descriptorPool = ds_pool;
7676 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007677 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007678 ASSERT_VK_SUCCESS(err);
7679
Tony Barboureb254902015-07-15 12:50:33 -06007680 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007681 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7682 pipeline_layout_ci.setLayoutCount = 1;
7683 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007684
7685 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007686 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007687 ASSERT_VK_SUCCESS(err);
7688
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007689 VkViewport vp = {}; // Just need dummy vp to point to
7690 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007691
7692 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007693 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7694 vp_state_ci.scissorCount = 1;
7695 vp_state_ci.pScissors = &sc;
7696 vp_state_ci.viewportCount = 1;
7697 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007698
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007699 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7700 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7701 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7702 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7703 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7704 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007705 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007706 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007707 rs_state_ci.lineWidth = 1.0f;
7708
7709 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7710 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7711 vi_ci.pNext = nullptr;
7712 vi_ci.vertexBindingDescriptionCount = 0;
7713 vi_ci.pVertexBindingDescriptions = nullptr;
7714 vi_ci.vertexAttributeDescriptionCount = 0;
7715 vi_ci.pVertexAttributeDescriptions = nullptr;
7716
7717 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7718 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7719 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7720
7721 VkPipelineShaderStageCreateInfo shaderStages[2];
7722 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7723
7724 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7725 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007726 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007727 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007728
Tony Barboureb254902015-07-15 12:50:33 -06007729 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007730 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7731 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007732 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007733 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7734 gp_ci.layout = pipeline_layout;
7735 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007736 gp_ci.pVertexInputState = &vi_ci;
7737 gp_ci.pInputAssemblyState = &ia_ci;
7738
7739 gp_ci.stageCount = 1;
7740 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007741
7742 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007743 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7744 pc_ci.initialDataSize = 0;
7745 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007746
7747 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007748 VkPipelineCache pipelineCache;
7749
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007750 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007751 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007752 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007753 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007754
Chia-I Wuf7458c52015-10-26 21:10:41 +08007755 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7756 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7757 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7758 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007759}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007760
Tobin Ehlis912df022015-09-17 08:46:18 -06007761/*// TODO : This test should be good, but needs Tess support in compiler to run
7762TEST_F(VkLayerTest, InvalidPatchControlPoints)
7763{
7764 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007765 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007766
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007768 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7769primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007770
Tony Barbour1fa09702017-03-16 12:09:08 -06007771 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007773
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007774 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007775 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007776 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007777
7778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7780 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007781 ds_pool_ci.poolSizeCount = 1;
7782 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007783
7784 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007785 err = vkCreateDescriptorPool(m_device->device(),
7786VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007787 ASSERT_VK_SUCCESS(err);
7788
7789 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007790 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007791 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007792 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007793 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7794 dsl_binding.pImmutableSamplers = NULL;
7795
7796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007797 ds_layout_ci.sType =
7798VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007799 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007800 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007801 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007802
7803 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7805&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007806 ASSERT_VK_SUCCESS(err);
7807
7808 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007809 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7810VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007811 ASSERT_VK_SUCCESS(err);
7812
7813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007814 pipeline_layout_ci.sType =
7815VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007816 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007817 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007818 pipeline_layout_ci.pSetLayouts = &ds_layout;
7819
7820 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007821 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7822&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007823 ASSERT_VK_SUCCESS(err);
7824
7825 VkPipelineShaderStageCreateInfo shaderStages[3];
7826 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7827
Karl Schultz6addd812016-02-02 17:17:23 -07007828 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7829this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007830 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007831 VkShaderObj
7832tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7833this);
7834 VkShaderObj
7835te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7836this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007837
Karl Schultz6addd812016-02-02 17:17:23 -07007838 shaderStages[0].sType =
7839VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007840 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007841 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007842 shaderStages[1].sType =
7843VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007844 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007845 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007846 shaderStages[2].sType =
7847VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007848 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007849 shaderStages[2].shader = te.handle();
7850
7851 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007852 iaCI.sType =
7853VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007854 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007855
7856 VkPipelineTessellationStateCreateInfo tsCI = {};
7857 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7858 tsCI.patchControlPoints = 0; // This will cause an error
7859
7860 VkGraphicsPipelineCreateInfo gp_ci = {};
7861 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7862 gp_ci.pNext = NULL;
7863 gp_ci.stageCount = 3;
7864 gp_ci.pStages = shaderStages;
7865 gp_ci.pVertexInputState = NULL;
7866 gp_ci.pInputAssemblyState = &iaCI;
7867 gp_ci.pTessellationState = &tsCI;
7868 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007869 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007870 gp_ci.pMultisampleState = NULL;
7871 gp_ci.pDepthStencilState = NULL;
7872 gp_ci.pColorBlendState = NULL;
7873 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7874 gp_ci.layout = pipeline_layout;
7875 gp_ci.renderPass = renderPass();
7876
7877 VkPipelineCacheCreateInfo pc_ci = {};
7878 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7879 pc_ci.pNext = NULL;
7880 pc_ci.initialSize = 0;
7881 pc_ci.initialData = 0;
7882 pc_ci.maxSize = 0;
7883
7884 VkPipeline pipeline;
7885 VkPipelineCache pipelineCache;
7886
Karl Schultz6addd812016-02-02 17:17:23 -07007887 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7888&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007889 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007890 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7891&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007892
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007893 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007894
Chia-I Wuf7458c52015-10-26 21:10:41 +08007895 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7896 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7897 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7898 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007899}
7900*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007901
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007902TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007903 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007904
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007905 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007906
Tony Barbour1fa09702017-03-16 12:09:08 -06007907 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007909
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007910 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007911 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7912 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007913
7914 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007915 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7916 ds_pool_ci.maxSets = 1;
7917 ds_pool_ci.poolSizeCount = 1;
7918 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007919
7920 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007921 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007922 ASSERT_VK_SUCCESS(err);
7923
7924 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007925 dsl_binding.binding = 0;
7926 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7927 dsl_binding.descriptorCount = 1;
7928 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007929
7930 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007931 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7932 ds_layout_ci.bindingCount = 1;
7933 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007934
7935 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007936 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007937 ASSERT_VK_SUCCESS(err);
7938
7939 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007940 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007941 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007942 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007943 alloc_info.descriptorPool = ds_pool;
7944 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007945 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946 ASSERT_VK_SUCCESS(err);
7947
7948 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007949 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7950 pipeline_layout_ci.setLayoutCount = 1;
7951 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007952
7953 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007954 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007955 ASSERT_VK_SUCCESS(err);
7956
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007957 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007958 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007959 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007960 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007961 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007962 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007963
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007964 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7965 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7966 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7967 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7968 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7969 rs_state_ci.depthClampEnable = VK_FALSE;
7970 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7971 rs_state_ci.depthBiasEnable = VK_FALSE;
7972
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007973 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7974 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7975 vi_ci.pNext = nullptr;
7976 vi_ci.vertexBindingDescriptionCount = 0;
7977 vi_ci.pVertexBindingDescriptions = nullptr;
7978 vi_ci.vertexAttributeDescriptionCount = 0;
7979 vi_ci.pVertexAttributeDescriptions = nullptr;
7980
7981 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7982 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7983 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7984
7985 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7986 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7987 pipe_ms_state_ci.pNext = NULL;
7988 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7989 pipe_ms_state_ci.sampleShadingEnable = 0;
7990 pipe_ms_state_ci.minSampleShading = 1.0;
7991 pipe_ms_state_ci.pSampleMask = NULL;
7992
Cody Northropeb3a6c12015-10-05 14:44:45 -06007993 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007994 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007995
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007996 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007997 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007998 shaderStages[0] = vs.GetStageCreateInfo();
7999 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008000
8001 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008002 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8003 gp_ci.stageCount = 2;
8004 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008005 gp_ci.pVertexInputState = &vi_ci;
8006 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008007 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008008 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008009 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008010 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8011 gp_ci.layout = pipeline_layout;
8012 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008013
8014 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008015 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008016
8017 VkPipeline pipeline;
8018 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008019 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008020 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008021
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008022 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008023 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008024
8025 // Check case where multiViewport is disabled and viewport count is not 1
8026 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8029 vp_state_ci.scissorCount = 0;
8030 vp_state_ci.viewportCount = 0;
8031 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8032 m_errorMonitor->VerifyFound();
8033 } else {
8034 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008035 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008036 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008037 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008038
8039 // Check is that viewportcount and scissorcount match
8040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8041 vp_state_ci.scissorCount = 1;
8042 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8043 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8044 m_errorMonitor->VerifyFound();
8045
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008046 // Check case where multiViewport is enabled and viewport count is greater than max
8047 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8050 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8051 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8052 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8053 m_errorMonitor->VerifyFound();
8054 }
8055 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008056
Chia-I Wuf7458c52015-10-26 21:10:41 +08008057 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8058 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8060 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008061}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008062
8063// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
8064// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008065TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008066 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008067
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008068 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8069
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008071
Tony Barbour1fa09702017-03-16 12:09:08 -06008072 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008074
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008075 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008076 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8077 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008078
8079 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008080 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8081 ds_pool_ci.maxSets = 1;
8082 ds_pool_ci.poolSizeCount = 1;
8083 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008084
8085 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008086 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008087 ASSERT_VK_SUCCESS(err);
8088
8089 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008090 dsl_binding.binding = 0;
8091 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8092 dsl_binding.descriptorCount = 1;
8093 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008094
8095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8097 ds_layout_ci.bindingCount = 1;
8098 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008099
8100 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008102 ASSERT_VK_SUCCESS(err);
8103
8104 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008105 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008106 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008107 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008108 alloc_info.descriptorPool = ds_pool;
8109 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008110 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008111 ASSERT_VK_SUCCESS(err);
8112
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008113 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8114 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8115 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8116
8117 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8118 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8119 vi_ci.pNext = nullptr;
8120 vi_ci.vertexBindingDescriptionCount = 0;
8121 vi_ci.pVertexBindingDescriptions = nullptr;
8122 vi_ci.vertexAttributeDescriptionCount = 0;
8123 vi_ci.pVertexAttributeDescriptions = nullptr;
8124
8125 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8126 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8127 pipe_ms_state_ci.pNext = NULL;
8128 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8129 pipe_ms_state_ci.sampleShadingEnable = 0;
8130 pipe_ms_state_ci.minSampleShading = 1.0;
8131 pipe_ms_state_ci.pSampleMask = NULL;
8132
Tobin Ehlise68360f2015-10-01 11:15:13 -06008133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8135 pipeline_layout_ci.setLayoutCount = 1;
8136 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008137
8138 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008139 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008140 ASSERT_VK_SUCCESS(err);
8141
8142 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8143 // Set scissor as dynamic to avoid second error
8144 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008145 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8146 dyn_state_ci.dynamicStateCount = 1;
8147 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008148
Cody Northropeb3a6c12015-10-05 14:44:45 -06008149 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008150 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008152 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008153 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8154 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008155 shaderStages[0] = vs.GetStageCreateInfo();
8156 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008157
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008158 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8159 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8160 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8161 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8162 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8163 rs_state_ci.depthClampEnable = VK_FALSE;
8164 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8165 rs_state_ci.depthBiasEnable = VK_FALSE;
8166
Tobin Ehlise68360f2015-10-01 11:15:13 -06008167 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008168 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8169 gp_ci.stageCount = 2;
8170 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008171 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008172 // Not setting VP state w/o dynamic vp state should cause validation error
8173 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008174 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008175 gp_ci.pVertexInputState = &vi_ci;
8176 gp_ci.pInputAssemblyState = &ia_ci;
8177 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008178 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8179 gp_ci.layout = pipeline_layout;
8180 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008181
8182 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008183 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008184
8185 VkPipeline pipeline;
8186 VkPipelineCache pipelineCache;
8187
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008188 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008189 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008190 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008191
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008192 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008193
Chia-I Wuf7458c52015-10-26 21:10:41 +08008194 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8195 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8196 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8197 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008198}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008199
8200// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8201// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008202TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8203 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008204
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008206
Tony Barbour1fa09702017-03-16 12:09:08 -06008207 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008208
8209 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008210 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008211 return;
8212 }
8213
Tobin Ehlise68360f2015-10-01 11:15:13 -06008214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008215
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008216 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008217 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8218 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008219
8220 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008221 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8222 ds_pool_ci.maxSets = 1;
8223 ds_pool_ci.poolSizeCount = 1;
8224 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008225
8226 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008227 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008228 ASSERT_VK_SUCCESS(err);
8229
8230 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 dsl_binding.binding = 0;
8232 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8233 dsl_binding.descriptorCount = 1;
8234 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008235
8236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8238 ds_layout_ci.bindingCount = 1;
8239 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008240
8241 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008242 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008243 ASSERT_VK_SUCCESS(err);
8244
8245 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008246 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008247 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008248 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008249 alloc_info.descriptorPool = ds_pool;
8250 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008251 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008252 ASSERT_VK_SUCCESS(err);
8253
8254 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008255 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8256 pipeline_layout_ci.setLayoutCount = 1;
8257 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008258
8259 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008260 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008261 ASSERT_VK_SUCCESS(err);
8262
8263 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008264 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8265 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008266 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008267 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008268 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008269
8270 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8271 // Set scissor as dynamic to avoid that error
8272 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008273 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8274 dyn_state_ci.dynamicStateCount = 1;
8275 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008276
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008277 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8278 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8279 pipe_ms_state_ci.pNext = NULL;
8280 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8281 pipe_ms_state_ci.sampleShadingEnable = 0;
8282 pipe_ms_state_ci.minSampleShading = 1.0;
8283 pipe_ms_state_ci.pSampleMask = NULL;
8284
Cody Northropeb3a6c12015-10-05 14:44:45 -06008285 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008286 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008288 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008289 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8290 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008291 shaderStages[0] = vs.GetStageCreateInfo();
8292 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008293
Cody Northropf6622dc2015-10-06 10:33:21 -06008294 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8295 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8296 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008297 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008298 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008299 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008300 vi_ci.pVertexAttributeDescriptions = nullptr;
8301
8302 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8303 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8304 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8305
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008306 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008307 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008308 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008309 rs_ci.pNext = nullptr;
8310
Mark Youngc89c6312016-03-31 16:03:20 -06008311 VkPipelineColorBlendAttachmentState att = {};
8312 att.blendEnable = VK_FALSE;
8313 att.colorWriteMask = 0xf;
8314
Cody Northropf6622dc2015-10-06 10:33:21 -06008315 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8316 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8317 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008318 cb_ci.attachmentCount = 1;
8319 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008320
Tobin Ehlise68360f2015-10-01 11:15:13 -06008321 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008322 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8323 gp_ci.stageCount = 2;
8324 gp_ci.pStages = shaderStages;
8325 gp_ci.pVertexInputState = &vi_ci;
8326 gp_ci.pInputAssemblyState = &ia_ci;
8327 gp_ci.pViewportState = &vp_state_ci;
8328 gp_ci.pRasterizationState = &rs_ci;
8329 gp_ci.pColorBlendState = &cb_ci;
8330 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008331 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008332 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8333 gp_ci.layout = pipeline_layout;
8334 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008335
8336 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008337 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008338
8339 VkPipeline pipeline;
8340 VkPipelineCache pipelineCache;
8341
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008342 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008343 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008344 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008345
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008346 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008347
Tobin Ehlisd332f282015-10-02 11:00:56 -06008348 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008349 // First need to successfully create the PSO from above by setting
8350 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008352
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008353 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008354 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008355 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008356 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008357 m_commandBuffer->BeginCommandBuffer();
8358 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008359 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008360 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008361 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008362 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008363 Draw(1, 0, 0, 0);
8364
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008365 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008366
8367 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8368 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8370 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008371 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008372}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008373
8374// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008375// viewportCount
8376TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8377 VkResult err;
8378
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008380
Tony Barbour1fa09702017-03-16 12:09:08 -06008381 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008382
8383 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008384 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008385 return;
8386 }
8387
Karl Schultz6addd812016-02-02 17:17:23 -07008388 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8389
8390 VkDescriptorPoolSize ds_type_count = {};
8391 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8392 ds_type_count.descriptorCount = 1;
8393
8394 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8395 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8396 ds_pool_ci.maxSets = 1;
8397 ds_pool_ci.poolSizeCount = 1;
8398 ds_pool_ci.pPoolSizes = &ds_type_count;
8399
8400 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008401 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008402 ASSERT_VK_SUCCESS(err);
8403
8404 VkDescriptorSetLayoutBinding dsl_binding = {};
8405 dsl_binding.binding = 0;
8406 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8407 dsl_binding.descriptorCount = 1;
8408 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8409
8410 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8411 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8412 ds_layout_ci.bindingCount = 1;
8413 ds_layout_ci.pBindings = &dsl_binding;
8414
8415 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008416 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008417 ASSERT_VK_SUCCESS(err);
8418
8419 VkDescriptorSet descriptorSet;
8420 VkDescriptorSetAllocateInfo alloc_info = {};
8421 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8422 alloc_info.descriptorSetCount = 1;
8423 alloc_info.descriptorPool = ds_pool;
8424 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008425 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008426 ASSERT_VK_SUCCESS(err);
8427
8428 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8429 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8430 pipeline_layout_ci.setLayoutCount = 1;
8431 pipeline_layout_ci.pSetLayouts = &ds_layout;
8432
8433 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008434 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008435 ASSERT_VK_SUCCESS(err);
8436
8437 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8438 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8439 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008440 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008441 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008442 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008443
8444 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8445 // Set scissor as dynamic to avoid that error
8446 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8447 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8448 dyn_state_ci.dynamicStateCount = 1;
8449 dyn_state_ci.pDynamicStates = &vp_state;
8450
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008451 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8452 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8453 pipe_ms_state_ci.pNext = NULL;
8454 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8455 pipe_ms_state_ci.sampleShadingEnable = 0;
8456 pipe_ms_state_ci.minSampleShading = 1.0;
8457 pipe_ms_state_ci.pSampleMask = NULL;
8458
Karl Schultz6addd812016-02-02 17:17:23 -07008459 VkPipelineShaderStageCreateInfo shaderStages[2];
8460 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8461
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008462 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008463 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8464 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008465 shaderStages[0] = vs.GetStageCreateInfo();
8466 shaderStages[1] = fs.GetStageCreateInfo();
8467
8468 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8469 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8470 vi_ci.pNext = nullptr;
8471 vi_ci.vertexBindingDescriptionCount = 0;
8472 vi_ci.pVertexBindingDescriptions = nullptr;
8473 vi_ci.vertexAttributeDescriptionCount = 0;
8474 vi_ci.pVertexAttributeDescriptions = nullptr;
8475
8476 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8477 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8478 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8479
8480 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8481 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008482 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008483 rs_ci.pNext = nullptr;
8484
Mark Youngc89c6312016-03-31 16:03:20 -06008485 VkPipelineColorBlendAttachmentState att = {};
8486 att.blendEnable = VK_FALSE;
8487 att.colorWriteMask = 0xf;
8488
Karl Schultz6addd812016-02-02 17:17:23 -07008489 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8490 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8491 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008492 cb_ci.attachmentCount = 1;
8493 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008494
8495 VkGraphicsPipelineCreateInfo gp_ci = {};
8496 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8497 gp_ci.stageCount = 2;
8498 gp_ci.pStages = shaderStages;
8499 gp_ci.pVertexInputState = &vi_ci;
8500 gp_ci.pInputAssemblyState = &ia_ci;
8501 gp_ci.pViewportState = &vp_state_ci;
8502 gp_ci.pRasterizationState = &rs_ci;
8503 gp_ci.pColorBlendState = &cb_ci;
8504 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008505 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008506 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8507 gp_ci.layout = pipeline_layout;
8508 gp_ci.renderPass = renderPass();
8509
8510 VkPipelineCacheCreateInfo pc_ci = {};
8511 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8512
8513 VkPipeline pipeline;
8514 VkPipelineCache pipelineCache;
8515
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008516 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008517 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008520 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008521
8522 // Now hit second fail case where we set scissor w/ different count than PSO
8523 // First need to successfully create the PSO from above by setting
8524 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8526 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008527
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008528 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008529 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008530 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008531 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008532 m_commandBuffer->BeginCommandBuffer();
8533 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008534 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008535 VkViewport viewports[1] = {};
8536 viewports[0].width = 8;
8537 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008538 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008539 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008540 Draw(1, 0, 0, 0);
8541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008542 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008543
Chia-I Wuf7458c52015-10-26 21:10:41 +08008544 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8545 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8546 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008548 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008549}
8550
Mark Young7394fdd2016-03-31 14:56:43 -06008551TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8552 VkResult err;
8553
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008555
Tony Barbour1fa09702017-03-16 12:09:08 -06008556 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8558
8559 VkDescriptorPoolSize ds_type_count = {};
8560 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8561 ds_type_count.descriptorCount = 1;
8562
8563 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8564 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8565 ds_pool_ci.maxSets = 1;
8566 ds_pool_ci.poolSizeCount = 1;
8567 ds_pool_ci.pPoolSizes = &ds_type_count;
8568
8569 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008570 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008571 ASSERT_VK_SUCCESS(err);
8572
8573 VkDescriptorSetLayoutBinding dsl_binding = {};
8574 dsl_binding.binding = 0;
8575 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8576 dsl_binding.descriptorCount = 1;
8577 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8578
8579 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8580 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8581 ds_layout_ci.bindingCount = 1;
8582 ds_layout_ci.pBindings = &dsl_binding;
8583
8584 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008585 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008586 ASSERT_VK_SUCCESS(err);
8587
8588 VkDescriptorSet descriptorSet;
8589 VkDescriptorSetAllocateInfo alloc_info = {};
8590 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8591 alloc_info.descriptorSetCount = 1;
8592 alloc_info.descriptorPool = ds_pool;
8593 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008594 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008595 ASSERT_VK_SUCCESS(err);
8596
8597 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8598 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8599 pipeline_layout_ci.setLayoutCount = 1;
8600 pipeline_layout_ci.pSetLayouts = &ds_layout;
8601
8602 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008603 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008604 ASSERT_VK_SUCCESS(err);
8605
8606 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8607 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8608 vp_state_ci.scissorCount = 1;
8609 vp_state_ci.pScissors = NULL;
8610 vp_state_ci.viewportCount = 1;
8611 vp_state_ci.pViewports = NULL;
8612
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008613 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008614 // Set scissor as dynamic to avoid that error
8615 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8616 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8617 dyn_state_ci.dynamicStateCount = 2;
8618 dyn_state_ci.pDynamicStates = dynamic_states;
8619
8620 VkPipelineShaderStageCreateInfo shaderStages[2];
8621 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8622
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008623 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8624 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008625 this); // TODO - We shouldn't need a fragment shader
8626 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008627 shaderStages[0] = vs.GetStageCreateInfo();
8628 shaderStages[1] = fs.GetStageCreateInfo();
8629
8630 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8631 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8632 vi_ci.pNext = nullptr;
8633 vi_ci.vertexBindingDescriptionCount = 0;
8634 vi_ci.pVertexBindingDescriptions = nullptr;
8635 vi_ci.vertexAttributeDescriptionCount = 0;
8636 vi_ci.pVertexAttributeDescriptions = nullptr;
8637
8638 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8639 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8640 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8641
8642 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8643 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8644 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008645 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008646
Mark Young47107952016-05-02 15:59:55 -06008647 // Check too low (line width of -1.0f).
8648 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008649
8650 VkPipelineColorBlendAttachmentState att = {};
8651 att.blendEnable = VK_FALSE;
8652 att.colorWriteMask = 0xf;
8653
8654 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8655 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8656 cb_ci.pNext = nullptr;
8657 cb_ci.attachmentCount = 1;
8658 cb_ci.pAttachments = &att;
8659
8660 VkGraphicsPipelineCreateInfo gp_ci = {};
8661 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8662 gp_ci.stageCount = 2;
8663 gp_ci.pStages = shaderStages;
8664 gp_ci.pVertexInputState = &vi_ci;
8665 gp_ci.pInputAssemblyState = &ia_ci;
8666 gp_ci.pViewportState = &vp_state_ci;
8667 gp_ci.pRasterizationState = &rs_ci;
8668 gp_ci.pColorBlendState = &cb_ci;
8669 gp_ci.pDynamicState = &dyn_state_ci;
8670 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8671 gp_ci.layout = pipeline_layout;
8672 gp_ci.renderPass = renderPass();
8673
8674 VkPipelineCacheCreateInfo pc_ci = {};
8675 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8676
8677 VkPipeline pipeline;
8678 VkPipelineCache pipelineCache;
8679
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008680 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008681 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008682 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008683
8684 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008685 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008686
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008688
8689 // Check too high (line width of 65536.0f).
8690 rs_ci.lineWidth = 65536.0f;
8691
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008692 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008693 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008694 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008695
8696 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008697 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008698
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008700
8701 dyn_state_ci.dynamicStateCount = 3;
8702
8703 rs_ci.lineWidth = 1.0f;
8704
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008705 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008706 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008707 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008708 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008709 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008710
8711 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008712 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008713 m_errorMonitor->VerifyFound();
8714
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008716
8717 // Check too high with dynamic setting.
8718 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8719 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008720 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008721
8722 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8723 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8724 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8725 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008726 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008727}
8728
Karl Schultz6addd812016-02-02 17:17:23 -07008729TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008730 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008732 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008733
Tony Barbour1fa09702017-03-16 12:09:08 -06008734 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008736
Tony Barbour552f6c02016-12-21 14:34:07 -07008737 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008738 // Don't care about RenderPass handle b/c error should be flagged before
8739 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008740 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008741
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008742 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008743}
8744
Karl Schultz6addd812016-02-02 17:17:23 -07008745TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008746 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8748 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008749
Tony Barbour1fa09702017-03-16 12:09:08 -06008750 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008751 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008752
Tony Barbour552f6c02016-12-21 14:34:07 -07008753 m_commandBuffer->BeginCommandBuffer();
8754 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008755 // Just create a dummy Renderpass that's non-NULL so we can get to the
8756 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008757 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008758
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008759 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008760}
8761
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008762TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008763 TEST_DESCRIPTION(
8764 "Begin a renderPass where clearValueCount is less than"
8765 "the number of renderPass attachments that use loadOp"
8766 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008767
Tony Barbour1fa09702017-03-16 12:09:08 -06008768 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008769 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8770
8771 // Create a renderPass with a single attachment that uses loadOp CLEAR
8772 VkAttachmentReference attach = {};
8773 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8774 VkSubpassDescription subpass = {};
8775 subpass.inputAttachmentCount = 1;
8776 subpass.pInputAttachments = &attach;
8777 VkRenderPassCreateInfo rpci = {};
8778 rpci.subpassCount = 1;
8779 rpci.pSubpasses = &subpass;
8780 rpci.attachmentCount = 1;
8781 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008782 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008783 // Set loadOp to CLEAR
8784 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8785 rpci.pAttachments = &attach_desc;
8786 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8787 VkRenderPass rp;
8788 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8789
8790 VkCommandBufferInheritanceInfo hinfo = {};
8791 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8792 hinfo.renderPass = VK_NULL_HANDLE;
8793 hinfo.subpass = 0;
8794 hinfo.framebuffer = VK_NULL_HANDLE;
8795 hinfo.occlusionQueryEnable = VK_FALSE;
8796 hinfo.queryFlags = 0;
8797 hinfo.pipelineStatistics = 0;
8798 VkCommandBufferBeginInfo info = {};
8799 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8800 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8801 info.pInheritanceInfo = &hinfo;
8802
8803 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8804 VkRenderPassBeginInfo rp_begin = {};
8805 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8806 rp_begin.pNext = NULL;
8807 rp_begin.renderPass = renderPass();
8808 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008809 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008810
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008812
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008813 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008814
8815 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008816
8817 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008818}
8819
Slawomir Cygan0808f392016-11-28 17:53:23 +01008820TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008821 TEST_DESCRIPTION(
8822 "Begin a renderPass where clearValueCount is greater than"
8823 "the number of renderPass attachments that use loadOp"
8824 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008825
Tony Barbour1fa09702017-03-16 12:09:08 -06008826 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8828
8829 // Create a renderPass with a single attachment that uses loadOp CLEAR
8830 VkAttachmentReference attach = {};
8831 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8832 VkSubpassDescription subpass = {};
8833 subpass.inputAttachmentCount = 1;
8834 subpass.pInputAttachments = &attach;
8835 VkRenderPassCreateInfo rpci = {};
8836 rpci.subpassCount = 1;
8837 rpci.pSubpasses = &subpass;
8838 rpci.attachmentCount = 1;
8839 VkAttachmentDescription attach_desc = {};
8840 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8841 // Set loadOp to CLEAR
8842 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8843 rpci.pAttachments = &attach_desc;
8844 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8845 VkRenderPass rp;
8846 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8847
8848 VkCommandBufferBeginInfo info = {};
8849 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8850 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8851
8852 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8853 VkRenderPassBeginInfo rp_begin = {};
8854 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8855 rp_begin.pNext = NULL;
8856 rp_begin.renderPass = renderPass();
8857 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008858 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008859
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8861 " has a clearValueCount of"
8862 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008863
8864 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8865
8866 m_errorMonitor->VerifyFound();
8867
8868 vkDestroyRenderPass(m_device->device(), rp, NULL);
8869}
8870
Cody Northrop3bb4d962016-05-09 16:15:57 -06008871TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008872 TEST_DESCRIPTION("End a command buffer with an active render pass");
8873
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8875 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008876
Tony Barbour1fa09702017-03-16 12:09:08 -06008877 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8879
Tony Barbour552f6c02016-12-21 14:34:07 -07008880 m_commandBuffer->BeginCommandBuffer();
8881 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8882 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008883
8884 m_errorMonitor->VerifyFound();
8885
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008886 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8887 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008888}
8889
Karl Schultz6addd812016-02-02 17:17:23 -07008890TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008891 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8893 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008894
Tony Barbour1fa09702017-03-16 12:09:08 -06008895 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008897
Tony Barbour552f6c02016-12-21 14:34:07 -07008898 m_commandBuffer->BeginCommandBuffer();
8899 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008900
8901 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008902 vk_testing::Buffer dstBuffer;
8903 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008904
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008905 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008906
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008907 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008908}
8909
Karl Schultz6addd812016-02-02 17:17:23 -07008910TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008911 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8913 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008914
Tony Barbour1fa09702017-03-16 12:09:08 -06008915 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008917
Tony Barbour552f6c02016-12-21 14:34:07 -07008918 m_commandBuffer->BeginCommandBuffer();
8919 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008920
8921 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008922 vk_testing::Buffer dstBuffer;
8923 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008924
Karl Schultz6addd812016-02-02 17:17:23 -07008925 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008926 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8927 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8928 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008929
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008930 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008931}
8932
Karl Schultz6addd812016-02-02 17:17:23 -07008933TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008934 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8936 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008937
Tony Barbour1fa09702017-03-16 12:09:08 -06008938 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008940
Tony Barbour552f6c02016-12-21 14:34:07 -07008941 m_commandBuffer->BeginCommandBuffer();
8942 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008943
Michael Lentine0a369f62016-02-03 16:51:46 -06008944 VkClearColorValue clear_color;
8945 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008946 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8947 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8948 const int32_t tex_width = 32;
8949 const int32_t tex_height = 32;
8950 VkImageCreateInfo image_create_info = {};
8951 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8952 image_create_info.pNext = NULL;
8953 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8954 image_create_info.format = tex_format;
8955 image_create_info.extent.width = tex_width;
8956 image_create_info.extent.height = tex_height;
8957 image_create_info.extent.depth = 1;
8958 image_create_info.mipLevels = 1;
8959 image_create_info.arrayLayers = 1;
8960 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8961 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008962 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008963
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008964 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008965 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008966
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008967 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008968
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008969 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008970
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008971 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008972}
8973
Karl Schultz6addd812016-02-02 17:17:23 -07008974TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008975 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8977 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008978
Tony Barbour1fa09702017-03-16 12:09:08 -06008979 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008981
Dave Houlton1d2022c2017-03-29 11:43:58 -06008982 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008983 if (!depth_format) {
8984 printf(" No Depth + Stencil format found. Skipped.\n");
8985 return;
8986 }
8987
Tony Barbour552f6c02016-12-21 14:34:07 -07008988 m_commandBuffer->BeginCommandBuffer();
8989 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008990
8991 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008992 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008993 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8994 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008995 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008996 image_create_info.extent.width = 64;
8997 image_create_info.extent.height = 64;
8998 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8999 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009000
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009001 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009002 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009004 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009005
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009006 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9007 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009008
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009009 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009010}
9011
Karl Schultz6addd812016-02-02 17:17:23 -07009012TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009013 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009014 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009015
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9017 "vkCmdClearAttachments(): This call "
9018 "must be issued inside an active "
9019 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009020
Tony Barbour1fa09702017-03-16 12:09:08 -06009021 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009022 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009023
9024 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009025 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009026 ASSERT_VK_SUCCESS(err);
9027
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009028 VkClearAttachment color_attachment;
9029 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9030 color_attachment.clearValue.color.float32[0] = 0;
9031 color_attachment.clearValue.color.float32[1] = 0;
9032 color_attachment.clearValue.color.float32[2] = 0;
9033 color_attachment.clearValue.color.float32[3] = 0;
9034 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009035 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009036 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009037
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009038 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009039}
9040
Chris Forbes3b97e932016-09-07 11:29:24 +12009041TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009042 TEST_DESCRIPTION(
9043 "Test that an error is produced when CmdNextSubpass is "
9044 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009045
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9047 "vkCmdNextSubpass(): Attempted to advance "
9048 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009049
Tony Barbour1fa09702017-03-16 12:09:08 -06009050 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9052
Tony Barbour552f6c02016-12-21 14:34:07 -07009053 m_commandBuffer->BeginCommandBuffer();
9054 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009055
9056 // error here.
9057 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9058 m_errorMonitor->VerifyFound();
9059
Tony Barbour552f6c02016-12-21 14:34:07 -07009060 m_commandBuffer->EndRenderPass();
9061 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009062}
9063
Chris Forbes6d624702016-09-07 13:57:05 +12009064TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009065 TEST_DESCRIPTION(
9066 "Test that an error is produced when CmdEndRenderPass is "
9067 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009068
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9070 "vkCmdEndRenderPass(): Called before reaching "
9071 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009072
Tony Barbour1fa09702017-03-16 12:09:08 -06009073 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009074 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9075 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009077 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009078
9079 VkRenderPass rp;
9080 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9081 ASSERT_VK_SUCCESS(err);
9082
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009083 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009084
9085 VkFramebuffer fb;
9086 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9087 ASSERT_VK_SUCCESS(err);
9088
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009089 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009090
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009091 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009092
9093 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9094
9095 // Error here.
9096 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9097 m_errorMonitor->VerifyFound();
9098
9099 // Clean up.
9100 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9101 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9102}
9103
Karl Schultz9e66a292016-04-21 15:57:51 -06009104TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9105 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9107 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009108
Tony Barbour1fa09702017-03-16 12:09:08 -06009109 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009110 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009111
9112 VkBufferMemoryBarrier buf_barrier = {};
9113 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9114 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9115 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9116 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9117 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9118 buf_barrier.buffer = VK_NULL_HANDLE;
9119 buf_barrier.offset = 0;
9120 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009121 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9122 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009123
9124 m_errorMonitor->VerifyFound();
9125}
9126
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009127TEST_F(VkLayerTest, InvalidBarriers) {
9128 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9129
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009131
Tony Barbour1fa09702017-03-16 12:09:08 -06009132 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009133 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009134 if (!depth_format) {
9135 printf(" No Depth + Stencil format found. Skipped.\n");
9136 return;
9137 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9139
9140 VkMemoryBarrier mem_barrier = {};
9141 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9142 mem_barrier.pNext = NULL;
9143 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9144 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009145 m_commandBuffer->BeginCommandBuffer();
9146 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009147 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009148 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009149 &mem_barrier, 0, nullptr, 0, nullptr);
9150 m_errorMonitor->VerifyFound();
9151
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009153 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009154 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009155 ASSERT_TRUE(image.initialized());
9156 VkImageMemoryBarrier img_barrier = {};
9157 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9158 img_barrier.pNext = NULL;
9159 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9160 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9161 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9162 // New layout can't be UNDEFINED
9163 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9164 img_barrier.image = image.handle();
9165 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9166 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9167 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9168 img_barrier.subresourceRange.baseArrayLayer = 0;
9169 img_barrier.subresourceRange.baseMipLevel = 0;
9170 img_barrier.subresourceRange.layerCount = 1;
9171 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009172 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9173 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009174 m_errorMonitor->VerifyFound();
9175 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9176
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9178 "Subresource must have the sum of the "
9179 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009180 // baseArrayLayer + layerCount must be <= image's arrayLayers
9181 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009182 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9183 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009184 m_errorMonitor->VerifyFound();
9185 img_barrier.subresourceRange.baseArrayLayer = 0;
9186
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009188 // baseMipLevel + levelCount must be <= image's mipLevels
9189 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009190 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9191 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009192 m_errorMonitor->VerifyFound();
9193 img_barrier.subresourceRange.baseMipLevel = 0;
9194
Mike Weiblen7053aa32017-01-25 15:21:10 -07009195 // levelCount must be non-zero.
9196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9197 img_barrier.subresourceRange.levelCount = 0;
9198 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9199 nullptr, 0, nullptr, 1, &img_barrier);
9200 m_errorMonitor->VerifyFound();
9201 img_barrier.subresourceRange.levelCount = 1;
9202
9203 // layerCount must be non-zero.
9204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9205 img_barrier.subresourceRange.layerCount = 0;
9206 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9207 nullptr, 0, nullptr, 1, &img_barrier);
9208 m_errorMonitor->VerifyFound();
9209 img_barrier.subresourceRange.layerCount = 1;
9210
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009212 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009213 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9214 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009215 VkBufferMemoryBarrier buf_barrier = {};
9216 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9217 buf_barrier.pNext = NULL;
9218 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9219 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9220 buf_barrier.buffer = buffer.handle();
9221 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9222 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9223 buf_barrier.offset = 0;
9224 buf_barrier.size = VK_WHOLE_SIZE;
9225 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009226 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9227 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009228 m_errorMonitor->VerifyFound();
9229 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9230
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009232 buf_barrier.offset = 257;
9233 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009234 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9235 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009236 m_errorMonitor->VerifyFound();
9237 buf_barrier.offset = 0;
9238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009240 buf_barrier.size = 257;
9241 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009242 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9243 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009244 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009245
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009246 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009249 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009250 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009251 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009252 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9253 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009254 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009255
9256 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009257 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009258 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9259 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009260 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009261
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009262 // Having only one of depth or stencil set for DS image is an error
9263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9264 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9265 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9266 nullptr, 0, nullptr, 1, &img_barrier);
9267 m_errorMonitor->VerifyFound();
9268
9269 // Having anything other than DEPTH and STENCIL is an error
9270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009271 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9272 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9273 nullptr, 0, nullptr, 1, &img_barrier);
9274 m_errorMonitor->VerifyFound();
9275
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009276 // Now test depth-only
9277 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009278 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9279 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009280 VkDepthStencilObj d_image(m_device);
9281 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9282 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009283 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009284 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009285 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009286
9287 // DEPTH bit must be set
9288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9289 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009290 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009291 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9292 0, nullptr, 0, nullptr, 1, &img_barrier);
9293 m_errorMonitor->VerifyFound();
9294
9295 // No bits other than DEPTH may be set
9296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9297 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9298 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009299 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9300 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009301 m_errorMonitor->VerifyFound();
9302 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009303
9304 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009305 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9306 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009307 VkDepthStencilObj s_image(m_device);
9308 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9309 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009310 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009311 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009312 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009313 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9315 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009316 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009317 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9318 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009319 m_errorMonitor->VerifyFound();
9320 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009321
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009322 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009323 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009324 c_image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009325 ASSERT_TRUE(c_image.initialized());
9326 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9327 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9328 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009329
9330 // COLOR bit must be set
9331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9332 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009333 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009334 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9335 nullptr, 0, nullptr, 1, &img_barrier);
9336 m_errorMonitor->VerifyFound();
9337
9338 // No bits other than COLOR may be set
9339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9340 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9341 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009342 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9343 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009344 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009345
Mike Weiblene6e01172017-03-07 22:18:40 -07009346 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9347 {
9348 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009349 img_color.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009350 ASSERT_TRUE(img_color.initialized());
9351
9352 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009353 img_ds.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009354 ASSERT_TRUE(img_ds.initialized());
9355
9356 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009357 img_xfer_src.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009358 ASSERT_TRUE(img_xfer_src.initialized());
9359
9360 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009361 img_xfer_dst.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009362 ASSERT_TRUE(img_xfer_dst.initialized());
9363
9364 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009365 img_sampled.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009366 ASSERT_TRUE(img_sampled.initialized());
9367
9368 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009369 img_input.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009370 ASSERT_TRUE(img_input.initialized());
9371
9372 const struct {
9373 VkImageObj &image_obj;
9374 VkImageLayout bad_layout;
9375 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9376 } bad_buffer_layouts[] = {
9377 // clang-format off
9378 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9379 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9380 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9381 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9382 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9383 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9384 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9385 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9386 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9387 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9388 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9389 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9390 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9391 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9392 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9393 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9394 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9395 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9396 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9397 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9398 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9399 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9400 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9401 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9402 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9403 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9404 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9405 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9406 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9407 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9408 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9409 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9410 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9411 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9412 // clang-format on
9413 };
9414 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9415
9416 for (uint32_t i = 0; i < layout_count; ++i) {
9417 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9418 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9419 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9420 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9421 : VK_IMAGE_ASPECT_COLOR_BIT;
9422
9423 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9424 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9426 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9427 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9428 m_errorMonitor->VerifyFound();
9429
9430 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9431 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9433 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9434 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9435 m_errorMonitor->VerifyFound();
9436 }
9437
9438 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9439 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9440 }
9441
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009442 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9443
9444 // Create command pool with incompatible queueflags
9445 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009446 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009447 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009448 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009449 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009450 }
9451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9452
9453 VkCommandPool command_pool;
9454 VkCommandPoolCreateInfo pool_create_info{};
9455 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9456 pool_create_info.queueFamilyIndex = queue_family_index;
9457 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9458 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9459
9460 // Allocate a command buffer
9461 VkCommandBuffer bad_command_buffer;
9462 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9463 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9464 command_buffer_allocate_info.commandPool = command_pool;
9465 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9466 command_buffer_allocate_info.commandBufferCount = 1;
9467 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9468
9469 VkCommandBufferBeginInfo cbbi = {};
9470 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9471 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9472 buf_barrier.offset = 0;
9473 buf_barrier.size = VK_WHOLE_SIZE;
9474 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9475 &buf_barrier, 0, nullptr);
9476 m_errorMonitor->VerifyFound();
9477
9478 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9479 vkEndCommandBuffer(bad_command_buffer);
9480 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009481 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009482 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009483 }
9484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9485 VkEvent event;
9486 VkEventCreateInfo event_create_info{};
9487 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9488 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9489 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9490 nullptr, 0, nullptr);
9491 m_errorMonitor->VerifyFound();
9492
9493 vkEndCommandBuffer(bad_command_buffer);
9494 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009495}
9496
Chris Forbes50223732017-05-01 09:43:35 -07009497TEST_F(VkPositiveLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9498 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ
9499 // in srcAccessMask.
Tony Barbour18ba25c2016-09-29 13:42:40 -06009500
Chris Forbes50223732017-05-01 09:43:35 -07009501 // The required behavior here was a bit unclear in earlier versions of the
9502 // spec, but there is no memory dependency required here, so this should
9503 // work without warnings.
9504
9505 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -06009506 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009507 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009508 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 -07009509 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009510 ASSERT_TRUE(image.initialized());
9511
9512 VkImageMemoryBarrier barrier = {};
9513 VkImageSubresourceRange range;
9514 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009515 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
Chris Forbes50223732017-05-01 09:43:35 -07009516 barrier.dstAccessMask = 0;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009517 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9518 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9519 barrier.image = image.handle();
9520 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9521 range.baseMipLevel = 0;
9522 range.levelCount = 1;
9523 range.baseArrayLayer = 0;
9524 range.layerCount = 1;
9525 barrier.subresourceRange = range;
9526 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9527 cmdbuf.BeginCommandBuffer();
9528 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9529 &barrier);
9530 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9531 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9532 barrier.srcAccessMask = 0;
9533 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9534 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9535 &barrier);
9536
Chris Forbes50223732017-05-01 09:43:35 -07009537 m_errorMonitor->VerifyNotFound();
Tony Barbour18ba25c2016-09-29 13:42:40 -06009538}
9539
Karl Schultz6addd812016-02-02 17:17:23 -07009540TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009541 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009542 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009544
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009545 uint32_t const indices[] = {0};
9546 VkBufferCreateInfo buf_info = {};
9547 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9548 buf_info.size = 1024;
9549 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9550 buf_info.queueFamilyIndexCount = 1;
9551 buf_info.pQueueFamilyIndices = indices;
9552
9553 VkBuffer buffer;
9554 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9555 ASSERT_VK_SUCCESS(err);
9556
9557 VkMemoryRequirements requirements;
9558 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9559
9560 VkMemoryAllocateInfo alloc_info{};
9561 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9562 alloc_info.pNext = NULL;
9563 alloc_info.memoryTypeIndex = 0;
9564 alloc_info.allocationSize = requirements.size;
9565 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9566 ASSERT_TRUE(pass);
9567
9568 VkDeviceMemory memory;
9569 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9570 ASSERT_VK_SUCCESS(err);
9571
9572 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009573 ASSERT_VK_SUCCESS(err);
9574
Tony Barbour552f6c02016-12-21 14:34:07 -07009575 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009576 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009577
Karl Schultz6addd812016-02-02 17:17:23 -07009578 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9579 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009580 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9582 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009583 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009584
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009585 vkFreeMemory(m_device->device(), memory, NULL);
9586 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009587}
9588
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009589TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9590 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009591 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9593 VkBufferCreateInfo buffCI = {};
9594 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9595 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009596 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009597 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009598 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009599 uint32_t qfi[2];
9600 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009601 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009602
9603 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009604 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009605
9606 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9608 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9609 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009610 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009611 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009612
9613 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009614 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9616
9617 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9618 buffCI.queueFamilyIndexCount = 2;
9619 qfi[0] = 1;
9620 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009621 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009622 VkDeviceMemory mem;
9623 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009624 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009625
9626 VkMemoryAllocateInfo alloc_info = {};
9627 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9628 alloc_info.allocationSize = 1024;
9629 bool pass = false;
9630 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9631 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009632 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009633 return;
9634 }
9635 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009636 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009637
9638 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009639 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009640 m_commandBuffer->end();
9641 QueueCommandBuffer(false);
9642 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009643 vkDestroyBuffer(m_device->device(), ib2, NULL);
9644 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009645 }
9646
Tony Barbourdf4c0042016-06-01 15:55:43 -06009647 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009648}
9649
Karl Schultz6addd812016-02-02 17:17:23 -07009650TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009651 TEST_DESCRIPTION(
9652 "Attempt vkCmdExecuteCommands with a primary command buffer"
9653 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009654
Tony Barbour1fa09702017-03-16 12:09:08 -06009655 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009657
Chris Forbesf29a84f2016-10-06 18:39:28 +13009658 // An empty primary command buffer
9659 VkCommandBufferObj cb(m_device, m_commandPool);
9660 cb.BeginCommandBuffer();
9661 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009662
Chris Forbesf29a84f2016-10-06 18:39:28 +13009663 m_commandBuffer->BeginCommandBuffer();
9664 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9665 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009666
Chris Forbesf29a84f2016-10-06 18:39:28 +13009667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9668 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009669 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009670
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -06009671 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009672}
9673
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009674TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009675 TEST_DESCRIPTION(
9676 "Attempt to update descriptor sets for images and buffers "
9677 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009678 VkResult err;
9679
Tony Barbour1fa09702017-03-16 12:09:08 -06009680 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009681 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9682 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9683 ds_type_count[i].type = VkDescriptorType(i);
9684 ds_type_count[i].descriptorCount = 1;
9685 }
9686 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9687 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9688 ds_pool_ci.pNext = NULL;
9689 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9690 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9691 ds_pool_ci.pPoolSizes = ds_type_count;
9692
9693 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009694 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009695 ASSERT_VK_SUCCESS(err);
9696
9697 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009698 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009699 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9700 dsl_binding[i].binding = 0;
9701 dsl_binding[i].descriptorType = VkDescriptorType(i);
9702 dsl_binding[i].descriptorCount = 1;
9703 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9704 dsl_binding[i].pImmutableSamplers = NULL;
9705 }
9706
9707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9709 ds_layout_ci.pNext = NULL;
9710 ds_layout_ci.bindingCount = 1;
9711 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9712 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9713 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009714 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009715 ASSERT_VK_SUCCESS(err);
9716 }
9717 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9718 VkDescriptorSetAllocateInfo alloc_info = {};
9719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9720 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9721 alloc_info.descriptorPool = ds_pool;
9722 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009724 ASSERT_VK_SUCCESS(err);
9725
9726 // Create a buffer & bufferView to be used for invalid updates
9727 VkBufferCreateInfo buff_ci = {};
9728 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009729 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009730 buff_ci.size = 256;
9731 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009732 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009733 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9734 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009735
9736 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9737 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9738 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9739 ASSERT_VK_SUCCESS(err);
9740
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009741 VkMemoryRequirements mem_reqs;
9742 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9743 VkMemoryAllocateInfo mem_alloc_info = {};
9744 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9745 mem_alloc_info.pNext = NULL;
9746 mem_alloc_info.memoryTypeIndex = 0;
9747 mem_alloc_info.allocationSize = mem_reqs.size;
9748 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9749 if (!pass) {
9750 vkDestroyBuffer(m_device->device(), buffer, NULL);
9751 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9752 return;
9753 }
9754 VkDeviceMemory mem;
9755 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9756 ASSERT_VK_SUCCESS(err);
9757 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9758 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009759
9760 VkBufferViewCreateInfo buff_view_ci = {};
9761 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9762 buff_view_ci.buffer = buffer;
9763 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9764 buff_view_ci.range = VK_WHOLE_SIZE;
9765 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009766 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009767 ASSERT_VK_SUCCESS(err);
9768
Tony Barbour415497c2017-01-24 10:06:09 -07009769 // Now get resources / view for storage_texel_buffer
9770 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9771 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9772 if (!pass) {
9773 vkDestroyBuffer(m_device->device(), buffer, NULL);
9774 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9775 vkFreeMemory(m_device->device(), mem, NULL);
9776 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9777 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9778 return;
9779 }
9780 VkDeviceMemory storage_texel_buffer_mem;
9781 VkBufferView storage_texel_buffer_view;
9782 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9783 ASSERT_VK_SUCCESS(err);
9784 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9785 ASSERT_VK_SUCCESS(err);
9786 buff_view_ci.buffer = storage_texel_buffer;
9787 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9788 ASSERT_VK_SUCCESS(err);
9789
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009790 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009791 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009792 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009793 image_ci.format = VK_FORMAT_UNDEFINED;
9794 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9795 VkFormat format = static_cast<VkFormat>(f);
9796 VkFormatProperties fProps = m_device->format_properties(format);
9797 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9798 image_ci.format = format;
9799 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9800 break;
9801 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9802 image_ci.format = format;
9803 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9804 break;
9805 }
9806 }
9807 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9808 return;
9809 }
9810
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009811 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9812 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009813 image_ci.extent.width = 64;
9814 image_ci.extent.height = 64;
9815 image_ci.extent.depth = 1;
9816 image_ci.mipLevels = 1;
9817 image_ci.arrayLayers = 1;
9818 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009819 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009820 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009821 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9822 VkImage image;
9823 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9824 ASSERT_VK_SUCCESS(err);
9825 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009826 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009827
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009828 VkMemoryAllocateInfo mem_alloc = {};
9829 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9830 mem_alloc.pNext = NULL;
9831 mem_alloc.allocationSize = 0;
9832 mem_alloc.memoryTypeIndex = 0;
9833 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9834 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009835 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009836 ASSERT_TRUE(pass);
9837 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9838 ASSERT_VK_SUCCESS(err);
9839 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9840 ASSERT_VK_SUCCESS(err);
9841 // Now create view for image
9842 VkImageViewCreateInfo image_view_ci = {};
9843 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9844 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009845 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009846 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9847 image_view_ci.subresourceRange.layerCount = 1;
9848 image_view_ci.subresourceRange.baseArrayLayer = 0;
9849 image_view_ci.subresourceRange.levelCount = 1;
9850 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9851 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009852 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009853 ASSERT_VK_SUCCESS(err);
9854
9855 VkDescriptorBufferInfo buff_info = {};
9856 buff_info.buffer = buffer;
9857 VkDescriptorImageInfo img_info = {};
9858 img_info.imageView = image_view;
9859 VkWriteDescriptorSet descriptor_write = {};
9860 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9861 descriptor_write.dstBinding = 0;
9862 descriptor_write.descriptorCount = 1;
9863 descriptor_write.pTexelBufferView = &buff_view;
9864 descriptor_write.pBufferInfo = &buff_info;
9865 descriptor_write.pImageInfo = &img_info;
9866
9867 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009868 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009869 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9870 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9871 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9872 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9873 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9874 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9875 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9876 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9877 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9878 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9879 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009880 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009881 // Start loop at 1 as SAMPLER desc type has no usage bit error
9882 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009883 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9884 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9885 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9886 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009887 descriptor_write.descriptorType = VkDescriptorType(i);
9888 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009890
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009891 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009892
9893 m_errorMonitor->VerifyFound();
9894 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009895 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9896 descriptor_write.pTexelBufferView = &buff_view;
9897 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009898 }
Tony Barbour415497c2017-01-24 10:06:09 -07009899
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009900 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9901 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009902 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009903 vkDestroyImageView(m_device->device(), image_view, NULL);
9904 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009905 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009906 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009907 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009908 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009909 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009910 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9911}
9912
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009913TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009914 TEST_DESCRIPTION(
9915 "Attempt to update buffer descriptor set that has incorrect "
9916 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009917 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009918 "2. range value of 0\n"
9919 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009920 VkResult err;
9921
Tony Barbour1fa09702017-03-16 12:09:08 -06009922 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009923 VkDescriptorPoolSize ds_type_count = {};
9924 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9925 ds_type_count.descriptorCount = 1;
9926
9927 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9928 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9929 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009930 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009931 ds_pool_ci.maxSets = 1;
9932 ds_pool_ci.poolSizeCount = 1;
9933 ds_pool_ci.pPoolSizes = &ds_type_count;
9934
9935 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009936 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009937 ASSERT_VK_SUCCESS(err);
9938
9939 // Create layout with single uniform buffer descriptor
9940 VkDescriptorSetLayoutBinding dsl_binding = {};
9941 dsl_binding.binding = 0;
9942 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9943 dsl_binding.descriptorCount = 1;
9944 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9945 dsl_binding.pImmutableSamplers = NULL;
9946
9947 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9948 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9949 ds_layout_ci.pNext = NULL;
9950 ds_layout_ci.bindingCount = 1;
9951 ds_layout_ci.pBindings = &dsl_binding;
9952 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009953 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009954 ASSERT_VK_SUCCESS(err);
9955
9956 VkDescriptorSet descriptor_set = {};
9957 VkDescriptorSetAllocateInfo alloc_info = {};
9958 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9959 alloc_info.descriptorSetCount = 1;
9960 alloc_info.descriptorPool = ds_pool;
9961 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009962 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009963 ASSERT_VK_SUCCESS(err);
9964
9965 // Create a buffer to be used for invalid updates
9966 VkBufferCreateInfo buff_ci = {};
9967 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9968 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009969 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009970 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9971 VkBuffer buffer;
9972 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9973 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009974
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009975 // Have to bind memory to buffer before descriptor update
9976 VkMemoryAllocateInfo mem_alloc = {};
9977 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9978 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009979 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009980 mem_alloc.memoryTypeIndex = 0;
9981
9982 VkMemoryRequirements mem_reqs;
9983 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009984 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009985 if (!pass) {
9986 vkDestroyBuffer(m_device->device(), buffer, NULL);
9987 return;
9988 }
9989
9990 VkDeviceMemory mem;
9991 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9992 ASSERT_VK_SUCCESS(err);
9993 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9994 ASSERT_VK_SUCCESS(err);
9995
9996 VkDescriptorBufferInfo buff_info = {};
9997 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009998 // Cause error due to offset out of range
9999 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010000 buff_info.range = VK_WHOLE_SIZE;
10001 VkWriteDescriptorSet descriptor_write = {};
10002 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10003 descriptor_write.dstBinding = 0;
10004 descriptor_write.descriptorCount = 1;
10005 descriptor_write.pTexelBufferView = nullptr;
10006 descriptor_write.pBufferInfo = &buff_info;
10007 descriptor_write.pImageInfo = nullptr;
10008
10009 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10010 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010012
10013 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10014
10015 m_errorMonitor->VerifyFound();
10016 // Now cause error due to range of 0
10017 buff_info.offset = 0;
10018 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010020
10021 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10022
10023 m_errorMonitor->VerifyFound();
10024 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010025 buff_info.offset = 0;
10026 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010028
10029 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10030
10031 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010032 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010033 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10034 vkDestroyBuffer(m_device->device(), buffer, NULL);
10035 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10036 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10037}
10038
Tobin Ehlis845887e2017-02-02 19:01:44 -070010039TEST_F(VkLayerTest, DSBufferLimitErrors) {
10040 TEST_DESCRIPTION(
10041 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10042 "Test cases include:\n"
10043 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10044 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10045 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10046 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10047 VkResult err;
10048
Tony Barbour1fa09702017-03-16 12:09:08 -060010049 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010050 VkDescriptorPoolSize ds_type_count[2] = {};
10051 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10052 ds_type_count[0].descriptorCount = 1;
10053 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10054 ds_type_count[1].descriptorCount = 1;
10055
10056 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10057 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10058 ds_pool_ci.pNext = NULL;
10059 ds_pool_ci.maxSets = 1;
10060 ds_pool_ci.poolSizeCount = 2;
10061 ds_pool_ci.pPoolSizes = ds_type_count;
10062
10063 VkDescriptorPool ds_pool;
10064 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10065 ASSERT_VK_SUCCESS(err);
10066
10067 // Create layout with single uniform buffer & single storage buffer descriptor
10068 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10069 dsl_binding[0].binding = 0;
10070 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10071 dsl_binding[0].descriptorCount = 1;
10072 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10073 dsl_binding[0].pImmutableSamplers = NULL;
10074 dsl_binding[1].binding = 1;
10075 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10076 dsl_binding[1].descriptorCount = 1;
10077 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10078 dsl_binding[1].pImmutableSamplers = NULL;
10079
10080 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10081 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10082 ds_layout_ci.pNext = NULL;
10083 ds_layout_ci.bindingCount = 2;
10084 ds_layout_ci.pBindings = dsl_binding;
10085 VkDescriptorSetLayout ds_layout;
10086 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10087 ASSERT_VK_SUCCESS(err);
10088
10089 VkDescriptorSet descriptor_set = {};
10090 VkDescriptorSetAllocateInfo alloc_info = {};
10091 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10092 alloc_info.descriptorSetCount = 1;
10093 alloc_info.descriptorPool = ds_pool;
10094 alloc_info.pSetLayouts = &ds_layout;
10095 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10096 ASSERT_VK_SUCCESS(err);
10097
10098 // Create a buffer to be used for invalid updates
10099 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10100 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10101 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10102 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10103 VkBufferCreateInfo ub_ci = {};
10104 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10105 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10106 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10107 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10108 VkBuffer uniform_buffer;
10109 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10110 ASSERT_VK_SUCCESS(err);
10111 VkBufferCreateInfo sb_ci = {};
10112 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10113 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10114 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10115 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10116 VkBuffer storage_buffer;
10117 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10118 ASSERT_VK_SUCCESS(err);
10119 // Have to bind memory to buffer before descriptor update
10120 VkMemoryAllocateInfo mem_alloc = {};
10121 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10122 mem_alloc.pNext = NULL;
10123 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10124 mem_alloc.memoryTypeIndex = 0;
10125
Cort Stratton77a0d592017-02-17 13:14:13 -080010126 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10127 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10128 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10129 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10130 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010131 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010132 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010133 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010134 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10135 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010136 return;
10137 }
10138
10139 VkDeviceMemory mem;
10140 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010141 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010142 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010143 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10144 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10145 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10146 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10147 return;
10148 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010149 ASSERT_VK_SUCCESS(err);
10150 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10151 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010152 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010153 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10154 ASSERT_VK_SUCCESS(err);
10155
10156 VkDescriptorBufferInfo buff_info = {};
10157 buff_info.buffer = uniform_buffer;
10158 buff_info.range = ub_ci.size; // This will exceed limit
10159 VkWriteDescriptorSet descriptor_write = {};
10160 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10161 descriptor_write.dstBinding = 0;
10162 descriptor_write.descriptorCount = 1;
10163 descriptor_write.pTexelBufferView = nullptr;
10164 descriptor_write.pBufferInfo = &buff_info;
10165 descriptor_write.pImageInfo = nullptr;
10166
10167 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10168 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010169 if (max_ub_range != UINT32_MAX) {
10170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10171 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10172 m_errorMonitor->VerifyFound();
10173 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010174 // Reduce size of range to acceptable limit & cause offset error
10175 buff_info.range = max_ub_range;
10176 buff_info.offset = min_ub_align - 1;
10177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10178 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10179 m_errorMonitor->VerifyFound();
10180
10181 // Now break storage updates
10182 buff_info.buffer = storage_buffer;
10183 buff_info.range = sb_ci.size; // This will exceed limit
10184 buff_info.offset = 0; // Reset offset for this update
10185
10186 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10187 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010188 if (max_ub_range != UINT32_MAX) {
10189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10190 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10191 m_errorMonitor->VerifyFound();
10192 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010193
10194 // Reduce size of range to acceptable limit & cause offset error
10195 buff_info.range = max_sb_range;
10196 buff_info.offset = min_sb_align - 1;
10197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10198 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10199 m_errorMonitor->VerifyFound();
10200
10201 vkFreeMemory(m_device->device(), mem, NULL);
10202 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10203 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10204 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10205 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10206}
10207
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010208TEST_F(VkLayerTest, DSAspectBitsErrors) {
10209 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10210 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010211 TEST_DESCRIPTION(
10212 "Attempt to update descriptor sets for images "
10213 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010214 VkResult err;
10215
Tony Barbour1fa09702017-03-16 12:09:08 -060010216 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010217 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010218 if (!depth_format) {
10219 printf(" No Depth + Stencil format found. Skipped.\n");
10220 return;
10221 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010222 VkDescriptorPoolSize ds_type_count = {};
10223 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10224 ds_type_count.descriptorCount = 1;
10225
10226 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10227 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10228 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010229 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010230 ds_pool_ci.maxSets = 5;
10231 ds_pool_ci.poolSizeCount = 1;
10232 ds_pool_ci.pPoolSizes = &ds_type_count;
10233
10234 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010235 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010236 ASSERT_VK_SUCCESS(err);
10237
10238 VkDescriptorSetLayoutBinding dsl_binding = {};
10239 dsl_binding.binding = 0;
10240 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10241 dsl_binding.descriptorCount = 1;
10242 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10243 dsl_binding.pImmutableSamplers = NULL;
10244
10245 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10246 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10247 ds_layout_ci.pNext = NULL;
10248 ds_layout_ci.bindingCount = 1;
10249 ds_layout_ci.pBindings = &dsl_binding;
10250 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010251 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010252 ASSERT_VK_SUCCESS(err);
10253
10254 VkDescriptorSet descriptor_set = {};
10255 VkDescriptorSetAllocateInfo alloc_info = {};
10256 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10257 alloc_info.descriptorSetCount = 1;
10258 alloc_info.descriptorPool = ds_pool;
10259 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010260 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010261 ASSERT_VK_SUCCESS(err);
10262
10263 // Create an image to be used for invalid updates
10264 VkImageCreateInfo image_ci = {};
10265 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10266 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010267 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010268 image_ci.extent.width = 64;
10269 image_ci.extent.height = 64;
10270 image_ci.extent.depth = 1;
10271 image_ci.mipLevels = 1;
10272 image_ci.arrayLayers = 1;
10273 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010274 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010275 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10276 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10277 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10278 VkImage image;
10279 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10280 ASSERT_VK_SUCCESS(err);
10281 // Bind memory to image
10282 VkMemoryRequirements mem_reqs;
10283 VkDeviceMemory image_mem;
10284 bool pass;
10285 VkMemoryAllocateInfo mem_alloc = {};
10286 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10287 mem_alloc.pNext = NULL;
10288 mem_alloc.allocationSize = 0;
10289 mem_alloc.memoryTypeIndex = 0;
10290 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10291 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010292 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010293 ASSERT_TRUE(pass);
10294 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10295 ASSERT_VK_SUCCESS(err);
10296 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10297 ASSERT_VK_SUCCESS(err);
10298 // Now create view for image
10299 VkImageViewCreateInfo image_view_ci = {};
10300 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10301 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010302 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010303 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10304 image_view_ci.subresourceRange.layerCount = 1;
10305 image_view_ci.subresourceRange.baseArrayLayer = 0;
10306 image_view_ci.subresourceRange.levelCount = 1;
10307 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010308 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010309
10310 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010311 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010312 ASSERT_VK_SUCCESS(err);
10313
10314 VkDescriptorImageInfo img_info = {};
10315 img_info.imageView = image_view;
10316 VkWriteDescriptorSet descriptor_write = {};
10317 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10318 descriptor_write.dstBinding = 0;
10319 descriptor_write.descriptorCount = 1;
10320 descriptor_write.pTexelBufferView = NULL;
10321 descriptor_write.pBufferInfo = NULL;
10322 descriptor_write.pImageInfo = &img_info;
10323 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10324 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010325 const char *error_msg =
10326 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10327 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010329
10330 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10331
10332 m_errorMonitor->VerifyFound();
10333 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10334 vkDestroyImage(m_device->device(), image, NULL);
10335 vkFreeMemory(m_device->device(), image_mem, NULL);
10336 vkDestroyImageView(m_device->device(), image_view, NULL);
10337 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10338 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10339}
10340
Karl Schultz6addd812016-02-02 17:17:23 -070010341TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010342 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010343 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10346 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10347 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010348
Tony Barbour1fa09702017-03-16 12:09:08 -060010349 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010350 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010351 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010352 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10353 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010354
10355 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010356 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10357 ds_pool_ci.pNext = NULL;
10358 ds_pool_ci.maxSets = 1;
10359 ds_pool_ci.poolSizeCount = 1;
10360 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010361
Tobin Ehlis3b780662015-05-28 12:11:26 -060010362 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010363 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010364 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010365 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010366 dsl_binding.binding = 0;
10367 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10368 dsl_binding.descriptorCount = 1;
10369 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10370 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010371
Tony Barboureb254902015-07-15 12:50:33 -060010372 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010373 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10374 ds_layout_ci.pNext = NULL;
10375 ds_layout_ci.bindingCount = 1;
10376 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010377
Tobin Ehlis3b780662015-05-28 12:11:26 -060010378 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010380 ASSERT_VK_SUCCESS(err);
10381
10382 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010383 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010384 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010385 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010386 alloc_info.descriptorPool = ds_pool;
10387 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010388 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010389 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010390
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010391 VkSamplerCreateInfo sampler_ci = {};
10392 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10393 sampler_ci.pNext = NULL;
10394 sampler_ci.magFilter = VK_FILTER_NEAREST;
10395 sampler_ci.minFilter = VK_FILTER_NEAREST;
10396 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10397 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10398 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10399 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10400 sampler_ci.mipLodBias = 1.0;
10401 sampler_ci.anisotropyEnable = VK_FALSE;
10402 sampler_ci.maxAnisotropy = 1;
10403 sampler_ci.compareEnable = VK_FALSE;
10404 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10405 sampler_ci.minLod = 1.0;
10406 sampler_ci.maxLod = 1.0;
10407 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10408 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10409 VkSampler sampler;
10410 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10411 ASSERT_VK_SUCCESS(err);
10412
10413 VkDescriptorImageInfo info = {};
10414 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010415
10416 VkWriteDescriptorSet descriptor_write;
10417 memset(&descriptor_write, 0, sizeof(descriptor_write));
10418 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010419 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010420 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010421 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010422 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010423 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010424
10425 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010427 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010428
Chia-I Wuf7458c52015-10-26 21:10:41 +080010429 vkDestroySampler(m_device->device(), sampler, NULL);
10430 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10431 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010432}
10433
Karl Schultz6addd812016-02-02 17:17:23 -070010434TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010435 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010436 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010437
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010439
Tony Barbour1fa09702017-03-16 12:09:08 -060010440 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010441 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010442 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010443 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10444 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010445
10446 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010447 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10448 ds_pool_ci.pNext = NULL;
10449 ds_pool_ci.maxSets = 1;
10450 ds_pool_ci.poolSizeCount = 1;
10451 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010452
Tobin Ehlis3b780662015-05-28 12:11:26 -060010453 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010454 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010455 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010456
Tony Barboureb254902015-07-15 12:50:33 -060010457 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010458 dsl_binding.binding = 0;
10459 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10460 dsl_binding.descriptorCount = 1;
10461 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10462 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010463
10464 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010465 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10466 ds_layout_ci.pNext = NULL;
10467 ds_layout_ci.bindingCount = 1;
10468 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010469
Tobin Ehlis3b780662015-05-28 12:11:26 -060010470 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010471 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010472 ASSERT_VK_SUCCESS(err);
10473
10474 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010475 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010476 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010477 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010478 alloc_info.descriptorPool = ds_pool;
10479 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010480 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010481 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010482
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010483 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10484
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010485 // Correctly update descriptor to avoid "NOT_UPDATED" error
10486 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010487 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010488 buff_info.offset = 0;
10489 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010490
10491 VkWriteDescriptorSet descriptor_write;
10492 memset(&descriptor_write, 0, sizeof(descriptor_write));
10493 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010494 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010495 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010496 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010497 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10498 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010499
10500 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010502 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010503
Chia-I Wuf7458c52015-10-26 21:10:41 +080010504 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10505 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010506}
10507
Karl Schultz6addd812016-02-02 17:17:23 -070010508TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010509 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010510 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010511
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010513
Tony Barbour1fa09702017-03-16 12:09:08 -060010514 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010515 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010516 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010517 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10518 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010519
10520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10522 ds_pool_ci.pNext = NULL;
10523 ds_pool_ci.maxSets = 1;
10524 ds_pool_ci.poolSizeCount = 1;
10525 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010526
Tobin Ehlis3b780662015-05-28 12:11:26 -060010527 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010528 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010529 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010530
Tony Barboureb254902015-07-15 12:50:33 -060010531 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010532 dsl_binding.binding = 0;
10533 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10534 dsl_binding.descriptorCount = 1;
10535 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10536 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010537
10538 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010539 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10540 ds_layout_ci.pNext = NULL;
10541 ds_layout_ci.bindingCount = 1;
10542 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010543 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010544 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010545 ASSERT_VK_SUCCESS(err);
10546
10547 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010548 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010549 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010550 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010551 alloc_info.descriptorPool = ds_pool;
10552 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010553 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010554 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010555
Tony Barboureb254902015-07-15 12:50:33 -060010556 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010557 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10558 sampler_ci.pNext = NULL;
10559 sampler_ci.magFilter = VK_FILTER_NEAREST;
10560 sampler_ci.minFilter = VK_FILTER_NEAREST;
10561 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10562 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10563 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10564 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10565 sampler_ci.mipLodBias = 1.0;
10566 sampler_ci.anisotropyEnable = VK_FALSE;
10567 sampler_ci.maxAnisotropy = 1;
10568 sampler_ci.compareEnable = VK_FALSE;
10569 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10570 sampler_ci.minLod = 1.0;
10571 sampler_ci.maxLod = 1.0;
10572 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10573 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010574
Tobin Ehlis3b780662015-05-28 12:11:26 -060010575 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010576 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010577 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010578
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010579 VkDescriptorImageInfo info = {};
10580 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010581
10582 VkWriteDescriptorSet descriptor_write;
10583 memset(&descriptor_write, 0, sizeof(descriptor_write));
10584 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010585 descriptor_write.dstSet = descriptorSet;
10586 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010587 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010588 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010589 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010590 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010591
10592 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10593
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010594 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010595
Chia-I Wuf7458c52015-10-26 21:10:41 +080010596 vkDestroySampler(m_device->device(), sampler, NULL);
10597 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10598 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010599}
10600
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010601TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10602 // Create layout w/ empty binding and attempt to update it
10603 VkResult err;
10604
Tony Barbour1fa09702017-03-16 12:09:08 -060010605 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010606
10607 VkDescriptorPoolSize ds_type_count = {};
10608 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10609 ds_type_count.descriptorCount = 1;
10610
10611 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10612 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10613 ds_pool_ci.pNext = NULL;
10614 ds_pool_ci.maxSets = 1;
10615 ds_pool_ci.poolSizeCount = 1;
10616 ds_pool_ci.pPoolSizes = &ds_type_count;
10617
10618 VkDescriptorPool ds_pool;
10619 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10620 ASSERT_VK_SUCCESS(err);
10621
10622 VkDescriptorSetLayoutBinding dsl_binding = {};
10623 dsl_binding.binding = 0;
10624 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10625 dsl_binding.descriptorCount = 0;
10626 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10627 dsl_binding.pImmutableSamplers = NULL;
10628
10629 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10630 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10631 ds_layout_ci.pNext = NULL;
10632 ds_layout_ci.bindingCount = 1;
10633 ds_layout_ci.pBindings = &dsl_binding;
10634 VkDescriptorSetLayout ds_layout;
10635 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10636 ASSERT_VK_SUCCESS(err);
10637
10638 VkDescriptorSet descriptor_set;
10639 VkDescriptorSetAllocateInfo alloc_info = {};
10640 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10641 alloc_info.descriptorSetCount = 1;
10642 alloc_info.descriptorPool = ds_pool;
10643 alloc_info.pSetLayouts = &ds_layout;
10644 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10645 ASSERT_VK_SUCCESS(err);
10646
10647 VkSamplerCreateInfo sampler_ci = {};
10648 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10649 sampler_ci.magFilter = VK_FILTER_NEAREST;
10650 sampler_ci.minFilter = VK_FILTER_NEAREST;
10651 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10652 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10653 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10654 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10655 sampler_ci.mipLodBias = 1.0;
10656 sampler_ci.maxAnisotropy = 1;
10657 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10658 sampler_ci.minLod = 1.0;
10659 sampler_ci.maxLod = 1.0;
10660 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10661
10662 VkSampler sampler;
10663 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10664 ASSERT_VK_SUCCESS(err);
10665
10666 VkDescriptorImageInfo info = {};
10667 info.sampler = sampler;
10668
10669 VkWriteDescriptorSet descriptor_write;
10670 memset(&descriptor_write, 0, sizeof(descriptor_write));
10671 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10672 descriptor_write.dstSet = descriptor_set;
10673 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010674 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010675 // This is the wrong type, but empty binding error will be flagged first
10676 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10677 descriptor_write.pImageInfo = &info;
10678
10679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10680 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10681 m_errorMonitor->VerifyFound();
10682
10683 vkDestroySampler(m_device->device(), sampler, NULL);
10684 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10685 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10686}
10687
Karl Schultz6addd812016-02-02 17:17:23 -070010688TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10689 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10690 // types
10691 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010692
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010693 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 -060010694
Tony Barbour1fa09702017-03-16 12:09:08 -060010695 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010696
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010697 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010698 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10699 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010700
10701 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010702 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10703 ds_pool_ci.pNext = NULL;
10704 ds_pool_ci.maxSets = 1;
10705 ds_pool_ci.poolSizeCount = 1;
10706 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010707
Tobin Ehlis3b780662015-05-28 12:11:26 -060010708 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010709 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010710 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010711 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010712 dsl_binding.binding = 0;
10713 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10714 dsl_binding.descriptorCount = 1;
10715 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10716 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010717
Tony Barboureb254902015-07-15 12:50:33 -060010718 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010719 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10720 ds_layout_ci.pNext = NULL;
10721 ds_layout_ci.bindingCount = 1;
10722 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010723
Tobin Ehlis3b780662015-05-28 12:11:26 -060010724 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010725 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010726 ASSERT_VK_SUCCESS(err);
10727
10728 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010729 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010730 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010731 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010732 alloc_info.descriptorPool = ds_pool;
10733 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010734 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010735 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010736
Tony Barboureb254902015-07-15 12:50:33 -060010737 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010738 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10739 sampler_ci.pNext = NULL;
10740 sampler_ci.magFilter = VK_FILTER_NEAREST;
10741 sampler_ci.minFilter = VK_FILTER_NEAREST;
10742 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10743 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10744 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10745 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10746 sampler_ci.mipLodBias = 1.0;
10747 sampler_ci.anisotropyEnable = VK_FALSE;
10748 sampler_ci.maxAnisotropy = 1;
10749 sampler_ci.compareEnable = VK_FALSE;
10750 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10751 sampler_ci.minLod = 1.0;
10752 sampler_ci.maxLod = 1.0;
10753 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10754 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010755 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010756 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010757 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010758
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010759 VkDescriptorImageInfo info = {};
10760 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010761
10762 VkWriteDescriptorSet descriptor_write;
10763 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010764 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010765 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010766 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010767 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010768 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010769 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010770
10771 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10772
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010773 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010774
Chia-I Wuf7458c52015-10-26 21:10:41 +080010775 vkDestroySampler(m_device->device(), sampler, NULL);
10776 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10777 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010778}
10779
Karl Schultz6addd812016-02-02 17:17:23 -070010780TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010781 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010782 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010783
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010785
Tony Barbour1fa09702017-03-16 12:09:08 -060010786 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010787 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10788 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010789 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010790 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10791 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010792
10793 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010794 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10795 ds_pool_ci.pNext = NULL;
10796 ds_pool_ci.maxSets = 1;
10797 ds_pool_ci.poolSizeCount = 1;
10798 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010799
10800 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010801 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010802 ASSERT_VK_SUCCESS(err);
10803
10804 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010805 dsl_binding.binding = 0;
10806 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10807 dsl_binding.descriptorCount = 1;
10808 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10809 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010810
10811 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010812 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10813 ds_layout_ci.pNext = NULL;
10814 ds_layout_ci.bindingCount = 1;
10815 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010816 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010817 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010818 ASSERT_VK_SUCCESS(err);
10819
10820 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010821 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010822 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010823 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010824 alloc_info.descriptorPool = ds_pool;
10825 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010826 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010827 ASSERT_VK_SUCCESS(err);
10828
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010829 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010830
10831 VkDescriptorImageInfo descriptor_info;
10832 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10833 descriptor_info.sampler = sampler;
10834
10835 VkWriteDescriptorSet descriptor_write;
10836 memset(&descriptor_write, 0, sizeof(descriptor_write));
10837 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010838 descriptor_write.dstSet = descriptorSet;
10839 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010840 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010841 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10842 descriptor_write.pImageInfo = &descriptor_info;
10843
10844 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10845
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010846 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010847
Chia-I Wuf7458c52015-10-26 21:10:41 +080010848 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10849 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010850}
10851
Karl Schultz6addd812016-02-02 17:17:23 -070010852TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10853 // Create a single combined Image/Sampler descriptor and send it an invalid
10854 // imageView
10855 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010856
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010858
Tony Barbour1fa09702017-03-16 12:09:08 -060010859 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010860 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010861 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10862 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010863
10864 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010865 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10866 ds_pool_ci.pNext = NULL;
10867 ds_pool_ci.maxSets = 1;
10868 ds_pool_ci.poolSizeCount = 1;
10869 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010870
10871 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010872 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010873 ASSERT_VK_SUCCESS(err);
10874
10875 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010876 dsl_binding.binding = 0;
10877 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10878 dsl_binding.descriptorCount = 1;
10879 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10880 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010881
10882 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010883 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10884 ds_layout_ci.pNext = NULL;
10885 ds_layout_ci.bindingCount = 1;
10886 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010887 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010888 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010889 ASSERT_VK_SUCCESS(err);
10890
10891 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010892 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010893 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010894 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010895 alloc_info.descriptorPool = ds_pool;
10896 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010897 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010898 ASSERT_VK_SUCCESS(err);
10899
10900 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010901 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10902 sampler_ci.pNext = NULL;
10903 sampler_ci.magFilter = VK_FILTER_NEAREST;
10904 sampler_ci.minFilter = VK_FILTER_NEAREST;
10905 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10906 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10907 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10908 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10909 sampler_ci.mipLodBias = 1.0;
10910 sampler_ci.anisotropyEnable = VK_FALSE;
10911 sampler_ci.maxAnisotropy = 1;
10912 sampler_ci.compareEnable = VK_FALSE;
10913 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10914 sampler_ci.minLod = 1.0;
10915 sampler_ci.maxLod = 1.0;
10916 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10917 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010918
10919 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010920 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010921 ASSERT_VK_SUCCESS(err);
10922
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010923 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010924
10925 VkDescriptorImageInfo descriptor_info;
10926 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10927 descriptor_info.sampler = sampler;
10928 descriptor_info.imageView = view;
10929
10930 VkWriteDescriptorSet descriptor_write;
10931 memset(&descriptor_write, 0, sizeof(descriptor_write));
10932 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010933 descriptor_write.dstSet = descriptorSet;
10934 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010935 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010936 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10937 descriptor_write.pImageInfo = &descriptor_info;
10938
10939 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10940
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010941 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010942
Chia-I Wuf7458c52015-10-26 21:10:41 +080010943 vkDestroySampler(m_device->device(), sampler, NULL);
10944 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10945 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010946}
10947
Karl Schultz6addd812016-02-02 17:17:23 -070010948TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10949 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10950 // into the other
10951 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010952
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10954 " binding #1 with type "
10955 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10956 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010957
Tony Barbour1fa09702017-03-16 12:09:08 -060010958 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010959 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010960 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010961 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10962 ds_type_count[0].descriptorCount = 1;
10963 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10964 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010965
10966 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010967 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10968 ds_pool_ci.pNext = NULL;
10969 ds_pool_ci.maxSets = 1;
10970 ds_pool_ci.poolSizeCount = 2;
10971 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010972
10973 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010974 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010975 ASSERT_VK_SUCCESS(err);
10976 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010977 dsl_binding[0].binding = 0;
10978 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10979 dsl_binding[0].descriptorCount = 1;
10980 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10981 dsl_binding[0].pImmutableSamplers = NULL;
10982 dsl_binding[1].binding = 1;
10983 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10984 dsl_binding[1].descriptorCount = 1;
10985 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10986 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010987
10988 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010989 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10990 ds_layout_ci.pNext = NULL;
10991 ds_layout_ci.bindingCount = 2;
10992 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010993
10994 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010995 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010996 ASSERT_VK_SUCCESS(err);
10997
10998 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010999 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011000 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011001 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011002 alloc_info.descriptorPool = ds_pool;
11003 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011004 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011005 ASSERT_VK_SUCCESS(err);
11006
11007 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011008 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11009 sampler_ci.pNext = NULL;
11010 sampler_ci.magFilter = VK_FILTER_NEAREST;
11011 sampler_ci.minFilter = VK_FILTER_NEAREST;
11012 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11013 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11014 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11015 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11016 sampler_ci.mipLodBias = 1.0;
11017 sampler_ci.anisotropyEnable = VK_FALSE;
11018 sampler_ci.maxAnisotropy = 1;
11019 sampler_ci.compareEnable = VK_FALSE;
11020 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11021 sampler_ci.minLod = 1.0;
11022 sampler_ci.maxLod = 1.0;
11023 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11024 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011025
11026 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011027 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011028 ASSERT_VK_SUCCESS(err);
11029
11030 VkDescriptorImageInfo info = {};
11031 info.sampler = sampler;
11032
11033 VkWriteDescriptorSet descriptor_write;
11034 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11035 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011036 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011037 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011038 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011039 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11040 descriptor_write.pImageInfo = &info;
11041 // This write update should succeed
11042 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11043 // Now perform a copy update that fails due to type mismatch
11044 VkCopyDescriptorSet copy_ds_update;
11045 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11046 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11047 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011048 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011049 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011050 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11051 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011052 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11053
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011054 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011055 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011056 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 -060011057 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11058 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11059 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011060 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011061 copy_ds_update.dstSet = descriptorSet;
11062 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011063 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011064 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11065
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011066 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011067
Tobin Ehlis04356f92015-10-27 16:35:27 -060011068 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11070 " binding#1 with offset index of 1 plus "
11071 "update array offset of 0 and update of "
11072 "5 descriptors oversteps total number "
11073 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011074
Tobin Ehlis04356f92015-10-27 16:35:27 -060011075 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11076 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11077 copy_ds_update.srcSet = descriptorSet;
11078 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011079 copy_ds_update.dstSet = descriptorSet;
11080 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011081 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011082 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11083
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011084 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011085
Chia-I Wuf7458c52015-10-26 21:10:41 +080011086 vkDestroySampler(m_device->device(), sampler, NULL);
11087 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11088 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011089}
11090
Karl Schultz6addd812016-02-02 17:17:23 -070011091TEST_F(VkLayerTest, NumSamplesMismatch) {
11092 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11093 // sampleCount
11094 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011095
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011097
Tony Barbour1fa09702017-03-16 12:09:08 -060011098 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011100 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011101 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011102 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011103
11104 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011105 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11106 ds_pool_ci.pNext = NULL;
11107 ds_pool_ci.maxSets = 1;
11108 ds_pool_ci.poolSizeCount = 1;
11109 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011110
Tobin Ehlis3b780662015-05-28 12:11:26 -060011111 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011112 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011113 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011114
Tony Barboureb254902015-07-15 12:50:33 -060011115 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011116 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011117 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011118 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011119 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11120 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011121
Tony Barboureb254902015-07-15 12:50:33 -060011122 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11123 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11124 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011125 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011126 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011127
Tobin Ehlis3b780662015-05-28 12:11:26 -060011128 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011129 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011130 ASSERT_VK_SUCCESS(err);
11131
11132 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011133 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011134 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011135 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011136 alloc_info.descriptorPool = ds_pool;
11137 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011138 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011139 ASSERT_VK_SUCCESS(err);
11140
Tony Barboureb254902015-07-15 12:50:33 -060011141 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011142 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011143 pipe_ms_state_ci.pNext = NULL;
11144 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11145 pipe_ms_state_ci.sampleShadingEnable = 0;
11146 pipe_ms_state_ci.minSampleShading = 1.0;
11147 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011148
Tony Barboureb254902015-07-15 12:50:33 -060011149 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011150 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11151 pipeline_layout_ci.pNext = NULL;
11152 pipeline_layout_ci.setLayoutCount = 1;
11153 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011154
11155 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011156 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011157 ASSERT_VK_SUCCESS(err);
11158
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011159 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011160 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 -060011161 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011162 VkPipelineObj pipe(m_device);
11163 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011164 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011165 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011166 pipe.SetMSAA(&pipe_ms_state_ci);
11167 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011168
Tony Barbour552f6c02016-12-21 14:34:07 -070011169 m_commandBuffer->BeginCommandBuffer();
11170 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011171 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011172
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011173 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11174 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11175 VkRect2D scissor = {{0, 0}, {16, 16}};
11176 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11177
Mark Young29927482016-05-04 14:38:51 -060011178 // Render triangle (the error should trigger on the attempt to draw).
11179 Draw(3, 1, 0, 0);
11180
11181 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011182 m_commandBuffer->EndRenderPass();
11183 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011184
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011185 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011186
Chia-I Wuf7458c52015-10-26 21:10:41 +080011187 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11188 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11189 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011190}
Mark Young29927482016-05-04 14:38:51 -060011191
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011192TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011193 TEST_DESCRIPTION(
11194 "Hit RenderPass incompatible cases. "
11195 "Initial case is drawing with an active renderpass that's "
11196 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011197 VkResult err;
11198
Tony Barbour1fa09702017-03-16 12:09:08 -060011199 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11201
11202 VkDescriptorSetLayoutBinding dsl_binding = {};
11203 dsl_binding.binding = 0;
11204 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11205 dsl_binding.descriptorCount = 1;
11206 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11207 dsl_binding.pImmutableSamplers = NULL;
11208
11209 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11210 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11211 ds_layout_ci.pNext = NULL;
11212 ds_layout_ci.bindingCount = 1;
11213 ds_layout_ci.pBindings = &dsl_binding;
11214
11215 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011216 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011217 ASSERT_VK_SUCCESS(err);
11218
11219 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11220 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11221 pipeline_layout_ci.pNext = NULL;
11222 pipeline_layout_ci.setLayoutCount = 1;
11223 pipeline_layout_ci.pSetLayouts = &ds_layout;
11224
11225 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011226 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011227 ASSERT_VK_SUCCESS(err);
11228
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011230 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 -060011231 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011232 // Create a renderpass that will be incompatible with default renderpass
11233 VkAttachmentReference attach = {};
11234 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11235 VkAttachmentReference color_att = {};
11236 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11237 VkSubpassDescription subpass = {};
11238 subpass.inputAttachmentCount = 1;
11239 subpass.pInputAttachments = &attach;
11240 subpass.colorAttachmentCount = 1;
11241 subpass.pColorAttachments = &color_att;
11242 VkRenderPassCreateInfo rpci = {};
11243 rpci.subpassCount = 1;
11244 rpci.pSubpasses = &subpass;
11245 rpci.attachmentCount = 1;
11246 VkAttachmentDescription attach_desc = {};
11247 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011248 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11249 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011250 rpci.pAttachments = &attach_desc;
11251 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11252 VkRenderPass rp;
11253 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11254 VkPipelineObj pipe(m_device);
11255 pipe.AddShader(&vs);
11256 pipe.AddShader(&fs);
11257 pipe.AddColorAttachment();
11258 VkViewport view_port = {};
11259 m_viewports.push_back(view_port);
11260 pipe.SetViewport(m_viewports);
11261 VkRect2D rect = {};
11262 m_scissors.push_back(rect);
11263 pipe.SetScissor(m_scissors);
11264 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11265
11266 VkCommandBufferInheritanceInfo cbii = {};
11267 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11268 cbii.renderPass = rp;
11269 cbii.subpass = 0;
11270 VkCommandBufferBeginInfo cbbi = {};
11271 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11272 cbbi.pInheritanceInfo = &cbii;
11273 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11274 VkRenderPassBeginInfo rpbi = {};
11275 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11276 rpbi.framebuffer = m_framebuffer;
11277 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011278 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11279 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011280
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011282 // Render triangle (the error should trigger on the attempt to draw).
11283 Draw(3, 1, 0, 0);
11284
11285 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011286 m_commandBuffer->EndRenderPass();
11287 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011288
11289 m_errorMonitor->VerifyFound();
11290
11291 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11292 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11293 vkDestroyRenderPass(m_device->device(), rp, NULL);
11294}
11295
Mark Youngc89c6312016-03-31 16:03:20 -060011296TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11297 // Create Pipeline where the number of blend attachments doesn't match the
11298 // number of color attachments. In this case, we don't add any color
11299 // blend attachments even though we have a color attachment.
11300 VkResult err;
11301
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011303
Tony Barbour1fa09702017-03-16 12:09:08 -060011304 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011305 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11306 VkDescriptorPoolSize ds_type_count = {};
11307 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11308 ds_type_count.descriptorCount = 1;
11309
11310 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11311 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11312 ds_pool_ci.pNext = NULL;
11313 ds_pool_ci.maxSets = 1;
11314 ds_pool_ci.poolSizeCount = 1;
11315 ds_pool_ci.pPoolSizes = &ds_type_count;
11316
11317 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011318 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011319 ASSERT_VK_SUCCESS(err);
11320
11321 VkDescriptorSetLayoutBinding dsl_binding = {};
11322 dsl_binding.binding = 0;
11323 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11324 dsl_binding.descriptorCount = 1;
11325 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11326 dsl_binding.pImmutableSamplers = NULL;
11327
11328 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11329 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11330 ds_layout_ci.pNext = NULL;
11331 ds_layout_ci.bindingCount = 1;
11332 ds_layout_ci.pBindings = &dsl_binding;
11333
11334 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011335 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011336 ASSERT_VK_SUCCESS(err);
11337
11338 VkDescriptorSet descriptorSet;
11339 VkDescriptorSetAllocateInfo alloc_info = {};
11340 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11341 alloc_info.descriptorSetCount = 1;
11342 alloc_info.descriptorPool = ds_pool;
11343 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011344 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011345 ASSERT_VK_SUCCESS(err);
11346
11347 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011348 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011349 pipe_ms_state_ci.pNext = NULL;
11350 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11351 pipe_ms_state_ci.sampleShadingEnable = 0;
11352 pipe_ms_state_ci.minSampleShading = 1.0;
11353 pipe_ms_state_ci.pSampleMask = NULL;
11354
11355 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11356 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11357 pipeline_layout_ci.pNext = NULL;
11358 pipeline_layout_ci.setLayoutCount = 1;
11359 pipeline_layout_ci.pSetLayouts = &ds_layout;
11360
11361 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011362 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011363 ASSERT_VK_SUCCESS(err);
11364
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011365 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011366 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 -060011367 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011368 VkPipelineObj pipe(m_device);
11369 pipe.AddShader(&vs);
11370 pipe.AddShader(&fs);
11371 pipe.SetMSAA(&pipe_ms_state_ci);
11372 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011373 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011374
11375 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11376 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11377 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11378}
Mark Young29927482016-05-04 14:38:51 -060011379
Mark Muellerd4914412016-06-13 17:52:06 -060011380TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011381 TEST_DESCRIPTION(
11382 "Points to a wrong colorAttachment index in a VkClearAttachment "
11383 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011384 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011386
11387 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11388 m_errorMonitor->VerifyFound();
11389}
11390
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011391TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011392 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11393 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011394
Tony Barbour1fa09702017-03-16 12:09:08 -060011395 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011397
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011398 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011399 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11400 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011401
11402 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011403 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11404 ds_pool_ci.pNext = NULL;
11405 ds_pool_ci.maxSets = 1;
11406 ds_pool_ci.poolSizeCount = 1;
11407 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011408
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011409 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011410 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011411 ASSERT_VK_SUCCESS(err);
11412
Tony Barboureb254902015-07-15 12:50:33 -060011413 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011414 dsl_binding.binding = 0;
11415 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11416 dsl_binding.descriptorCount = 1;
11417 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11418 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011419
Tony Barboureb254902015-07-15 12:50:33 -060011420 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011421 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11422 ds_layout_ci.pNext = NULL;
11423 ds_layout_ci.bindingCount = 1;
11424 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011425
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011426 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011427 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011428 ASSERT_VK_SUCCESS(err);
11429
11430 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011431 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011432 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011433 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011434 alloc_info.descriptorPool = ds_pool;
11435 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011436 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011437 ASSERT_VK_SUCCESS(err);
11438
Tony Barboureb254902015-07-15 12:50:33 -060011439 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011440 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011441 pipe_ms_state_ci.pNext = NULL;
11442 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11443 pipe_ms_state_ci.sampleShadingEnable = 0;
11444 pipe_ms_state_ci.minSampleShading = 1.0;
11445 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011446
Tony Barboureb254902015-07-15 12:50:33 -060011447 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011448 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11449 pipeline_layout_ci.pNext = NULL;
11450 pipeline_layout_ci.setLayoutCount = 1;
11451 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011452
11453 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011454 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011455 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011456
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011457 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011458 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011459 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011460 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011461
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011462 VkPipelineObj pipe(m_device);
11463 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011464 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011465 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011466 pipe.SetMSAA(&pipe_ms_state_ci);
11467 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011468
Tony Barbour552f6c02016-12-21 14:34:07 -070011469 m_commandBuffer->BeginCommandBuffer();
11470 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011471
Karl Schultz6addd812016-02-02 17:17:23 -070011472 // Main thing we care about for this test is that the VkImage obj we're
11473 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011474 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011475 VkClearAttachment color_attachment;
11476 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11477 color_attachment.clearValue.color.float32[0] = 1.0;
11478 color_attachment.clearValue.color.float32[1] = 1.0;
11479 color_attachment.clearValue.color.float32[2] = 1.0;
11480 color_attachment.clearValue.color.float32[3] = 1.0;
11481 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011482 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011483
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011484 // Call for full-sized FB Color attachment prior to issuing a Draw
11485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011486 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011487 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011488 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011489
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011490 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11491 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11493 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11494 m_errorMonitor->VerifyFound();
11495
11496 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11497 clear_rect.layerCount = 2;
11498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11499 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011500 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011501
Chia-I Wuf7458c52015-10-26 21:10:41 +080011502 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11503 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11504 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011505}
11506
Karl Schultz6addd812016-02-02 17:17:23 -070011507TEST_F(VkLayerTest, VtxBufferBadIndex) {
11508 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011509
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11511 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011512
Tony Barbour1fa09702017-03-16 12:09:08 -060011513 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011514 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011516
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011517 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011518 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11519 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011520
11521 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011522 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11523 ds_pool_ci.pNext = NULL;
11524 ds_pool_ci.maxSets = 1;
11525 ds_pool_ci.poolSizeCount = 1;
11526 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011527
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011528 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011529 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011530 ASSERT_VK_SUCCESS(err);
11531
Tony Barboureb254902015-07-15 12:50:33 -060011532 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011533 dsl_binding.binding = 0;
11534 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11535 dsl_binding.descriptorCount = 1;
11536 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11537 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011538
Tony Barboureb254902015-07-15 12:50:33 -060011539 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011540 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11541 ds_layout_ci.pNext = NULL;
11542 ds_layout_ci.bindingCount = 1;
11543 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011544
Tobin Ehlis502480b2015-06-24 15:53:07 -060011545 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011546 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011547 ASSERT_VK_SUCCESS(err);
11548
11549 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011550 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011551 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011552 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011553 alloc_info.descriptorPool = ds_pool;
11554 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011555 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011556 ASSERT_VK_SUCCESS(err);
11557
Tony Barboureb254902015-07-15 12:50:33 -060011558 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011559 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011560 pipe_ms_state_ci.pNext = NULL;
11561 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11562 pipe_ms_state_ci.sampleShadingEnable = 0;
11563 pipe_ms_state_ci.minSampleShading = 1.0;
11564 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011565
Tony Barboureb254902015-07-15 12:50:33 -060011566 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011567 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11568 pipeline_layout_ci.pNext = NULL;
11569 pipeline_layout_ci.setLayoutCount = 1;
11570 pipeline_layout_ci.pSetLayouts = &ds_layout;
11571 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011572
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011573 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011574 ASSERT_VK_SUCCESS(err);
11575
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011576 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011577 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 -060011578 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011579 VkPipelineObj pipe(m_device);
11580 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011581 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011582 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011583 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011584 pipe.SetViewport(m_viewports);
11585 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011586 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011587
Tony Barbour552f6c02016-12-21 14:34:07 -070011588 m_commandBuffer->BeginCommandBuffer();
11589 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011590 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011591 // Don't care about actual data, just need to get to draw to flag error
11592 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011593 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011594 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011595 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011596
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011597 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011598
Chia-I Wuf7458c52015-10-26 21:10:41 +080011599 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11600 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11601 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011602}
Mark Muellerdfe37552016-07-07 14:47:42 -060011603
Mark Mueller2ee294f2016-08-04 12:59:48 -060011604TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011605 TEST_DESCRIPTION(
11606 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11607 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011608 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011609
Mark Mueller880fce52016-08-17 15:23:23 -060011610 // The following test fails with recent NVidia drivers.
11611 // By the time core_validation is reached, the NVidia
11612 // driver has sanitized the invalid condition and core_validation
11613 // is not introduced to the failure condition. This is not the case
11614 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011615 // uint32_t count = static_cast<uint32_t>(~0);
11616 // VkPhysicalDevice physical_device;
11617 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11618 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011619
Mark Mueller2ee294f2016-08-04 12:59:48 -060011620 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011621 VkDeviceQueueCreateInfo queue_create_info = {};
11622 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11623 queue_create_info.queueCount = 1;
11624 queue_create_info.pQueuePriorities = &queue_priority;
11625 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11626
11627 VkPhysicalDeviceFeatures features = m_device->phy().features();
11628 VkDevice testDevice;
11629 VkDeviceCreateInfo device_create_info = {};
11630 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11631 device_create_info.queueCreateInfoCount = 1;
11632 device_create_info.pQueueCreateInfos = &queue_create_info;
11633 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011634
11635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11636 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011637 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11638 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11639 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011640 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11641 m_errorMonitor->VerifyFound();
11642
11643 queue_create_info.queueFamilyIndex = 1;
11644
11645 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11646 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11647 for (unsigned i = 0; i < feature_count; i++) {
11648 if (VK_FALSE == feature_array[i]) {
11649 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011650 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11652 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011653 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11654 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11655 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11657 "You requested features that are unavailable on this device. You should first "
11658 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011659 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11660 m_errorMonitor->VerifyFound();
11661 break;
11662 }
11663 }
11664}
11665
Tobin Ehlis16edf082016-11-21 12:33:49 -070011666TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11667 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11668
Tony Barbour1fa09702017-03-16 12:09:08 -060011669 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011670
11671 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11672 std::vector<VkDeviceQueueCreateInfo> queue_info;
11673 queue_info.reserve(queue_props.size());
11674 std::vector<std::vector<float>> queue_priorities;
11675 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11676 VkDeviceQueueCreateInfo qi{};
11677 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11678 qi.queueFamilyIndex = i;
11679 qi.queueCount = queue_props[i].queueCount;
11680 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11681 qi.pQueuePriorities = queue_priorities[i].data();
11682 queue_info.push_back(qi);
11683 }
11684
11685 std::vector<const char *> device_extension_names;
11686
11687 VkDevice local_device;
11688 VkDeviceCreateInfo device_create_info = {};
11689 auto features = m_device->phy().features();
11690 // Intentionally disable pipeline stats
11691 features.pipelineStatisticsQuery = VK_FALSE;
11692 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11693 device_create_info.pNext = NULL;
11694 device_create_info.queueCreateInfoCount = queue_info.size();
11695 device_create_info.pQueueCreateInfos = queue_info.data();
11696 device_create_info.enabledLayerCount = 0;
11697 device_create_info.ppEnabledLayerNames = NULL;
11698 device_create_info.pEnabledFeatures = &features;
11699 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11700 ASSERT_VK_SUCCESS(err);
11701
11702 VkQueryPoolCreateInfo qpci{};
11703 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11704 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11705 qpci.queryCount = 1;
11706 VkQueryPool query_pool;
11707
11708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11709 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11710 m_errorMonitor->VerifyFound();
11711
11712 vkDestroyDevice(local_device, nullptr);
11713}
11714
Mark Mueller2ee294f2016-08-04 12:59:48 -060011715TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011716 TEST_DESCRIPTION(
11717 "Use an invalid queue index in a vkCmdWaitEvents call."
11718 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011719
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011720 const char *invalid_queue_index =
11721 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11722 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11723 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011724
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011725 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011728
Tony Barbour1fa09702017-03-16 12:09:08 -060011729 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011730
11731 VkEvent event;
11732 VkEventCreateInfo event_create_info{};
11733 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11734 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11735
Mark Mueller2ee294f2016-08-04 12:59:48 -060011736 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011737 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011738
Tony Barbour552f6c02016-12-21 14:34:07 -070011739 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011740
11741 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060011742 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 -060011743 ASSERT_TRUE(image.initialized());
11744 VkImageMemoryBarrier img_barrier = {};
11745 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11746 img_barrier.pNext = NULL;
11747 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11748 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11749 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11750 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11751 img_barrier.image = image.handle();
11752 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011753
11754 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11755 // that layer validation catches the case when it is not.
11756 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011757 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11758 img_barrier.subresourceRange.baseArrayLayer = 0;
11759 img_barrier.subresourceRange.baseMipLevel = 0;
11760 img_barrier.subresourceRange.layerCount = 1;
11761 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011762 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11763 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011764 m_errorMonitor->VerifyFound();
11765
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011767
11768 VkQueryPool query_pool;
11769 VkQueryPoolCreateInfo query_pool_create_info = {};
11770 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11771 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11772 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011773 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011774
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011775 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011776 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11777
11778 vkEndCommandBuffer(m_commandBuffer->handle());
11779 m_errorMonitor->VerifyFound();
11780
11781 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11782 vkDestroyEvent(m_device->device(), event, nullptr);
11783}
11784
Mark Muellerdfe37552016-07-07 14:47:42 -060011785TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011786 TEST_DESCRIPTION(
11787 "Submit a command buffer using deleted vertex buffer, "
11788 "delete a buffer twice, use an invalid offset for each "
11789 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011790
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011791 const char *deleted_buffer_in_command_buffer =
11792 "Cannot submit cmd buffer "
11793 "using deleted buffer ";
11794 const char *invalid_offset_message =
11795 "vkBindBufferMemory(): "
11796 "memoryOffset is 0x";
11797 const char *invalid_storage_buffer_offset_message =
11798 "vkBindBufferMemory(): "
11799 "storage memoryOffset "
11800 "is 0x";
11801 const char *invalid_texel_buffer_offset_message =
11802 "vkBindBufferMemory(): "
11803 "texel memoryOffset "
11804 "is 0x";
11805 const char *invalid_uniform_buffer_offset_message =
11806 "vkBindBufferMemory(): "
11807 "uniform memoryOffset "
11808 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011809
Tony Barbour1fa09702017-03-16 12:09:08 -060011810 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011811 ASSERT_NO_FATAL_FAILURE(InitViewport());
11812 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11813
11814 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011815 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011816 pipe_ms_state_ci.pNext = NULL;
11817 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11818 pipe_ms_state_ci.sampleShadingEnable = 0;
11819 pipe_ms_state_ci.minSampleShading = 1.0;
11820 pipe_ms_state_ci.pSampleMask = nullptr;
11821
11822 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11823 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11824 VkPipelineLayout pipeline_layout;
11825
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011826 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011827 ASSERT_VK_SUCCESS(err);
11828
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011829 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11830 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011831 VkPipelineObj pipe(m_device);
11832 pipe.AddShader(&vs);
11833 pipe.AddShader(&fs);
11834 pipe.AddColorAttachment();
11835 pipe.SetMSAA(&pipe_ms_state_ci);
11836 pipe.SetViewport(m_viewports);
11837 pipe.SetScissor(m_scissors);
11838 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11839
Tony Barbour552f6c02016-12-21 14:34:07 -070011840 m_commandBuffer->BeginCommandBuffer();
11841 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011842 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011843
11844 {
11845 // Create and bind a vertex buffer in a reduced scope, which will cause
11846 // it to be deleted upon leaving this scope
11847 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011848 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011849 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11850 draw_verticies.AddVertexInputToPipe(pipe);
11851 }
11852
11853 Draw(1, 0, 0, 0);
11854
Tony Barbour552f6c02016-12-21 14:34:07 -070011855 m_commandBuffer->EndRenderPass();
11856 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011857
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011859 QueueCommandBuffer(false);
11860 m_errorMonitor->VerifyFound();
11861
11862 {
11863 // Create and bind a vertex buffer in a reduced scope, and delete it
11864 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011865 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011867 buffer_test.TestDoubleDestroy();
11868 }
11869 m_errorMonitor->VerifyFound();
11870
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011871 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011872 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011873 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011875 m_errorMonitor->SetUnexpectedError(
11876 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11877 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011878 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11879 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011880 m_errorMonitor->VerifyFound();
11881 }
11882
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011883 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11884 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011885 // Create and bind a memory buffer with an invalid offset again,
11886 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011888 m_errorMonitor->SetUnexpectedError(
11889 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11890 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011891 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11892 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011893 m_errorMonitor->VerifyFound();
11894 }
11895
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011896 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011897 // Create and bind a memory buffer with an invalid offset again, but
11898 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011900 m_errorMonitor->SetUnexpectedError(
11901 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11902 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011903 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11904 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011905 m_errorMonitor->VerifyFound();
11906 }
11907
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011908 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011909 // Create and bind a memory buffer with an invalid offset again, but
11910 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011912 m_errorMonitor->SetUnexpectedError(
11913 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11914 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011915 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11916 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011917 m_errorMonitor->VerifyFound();
11918 }
11919
11920 {
11921 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011923 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11924 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011925 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11926 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011927 m_errorMonitor->VerifyFound();
11928 }
11929
11930 {
11931 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011933 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11934 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011935 }
11936 m_errorMonitor->VerifyFound();
11937
11938 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11939}
11940
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011941// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11942TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011943 TEST_DESCRIPTION(
11944 "Hit all possible validation checks associated with the "
11945 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11946 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011947 // 3 in ValidateCmdBufImageLayouts
11948 // * -1 Attempt to submit cmd buf w/ deleted image
11949 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11950 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011951
Tony Barbour1fa09702017-03-16 12:09:08 -060011952 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011953 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011954 if (!depth_format) {
11955 printf(" No Depth + Stencil format found. Skipped.\n");
11956 return;
11957 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011958 // Create src & dst images to use for copy operations
11959 VkImage src_image;
11960 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011961 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011962
11963 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11964 const int32_t tex_width = 32;
11965 const int32_t tex_height = 32;
11966
11967 VkImageCreateInfo image_create_info = {};
11968 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11969 image_create_info.pNext = NULL;
11970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11971 image_create_info.format = tex_format;
11972 image_create_info.extent.width = tex_width;
11973 image_create_info.extent.height = tex_height;
11974 image_create_info.extent.depth = 1;
11975 image_create_info.mipLevels = 1;
11976 image_create_info.arrayLayers = 4;
11977 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11978 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11979 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011980 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011981 image_create_info.flags = 0;
11982
11983 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11984 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011985 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011986 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11987 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011988 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11989 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11990 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11991 ASSERT_VK_SUCCESS(err);
11992
11993 // Allocate memory
11994 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011995 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011996 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011997 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11998 mem_alloc.pNext = NULL;
11999 mem_alloc.allocationSize = 0;
12000 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080012001
12002 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012003 mem_alloc.allocationSize = img_mem_reqs.size;
12004 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012005 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080012006 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080012007 ASSERT_VK_SUCCESS(err);
12008
12009 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012010 mem_alloc.allocationSize = img_mem_reqs.size;
12011 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012012 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012013 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012014 ASSERT_VK_SUCCESS(err);
12015
12016 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012017 mem_alloc.allocationSize = img_mem_reqs.size;
12018 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012019 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012020 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012021 ASSERT_VK_SUCCESS(err);
12022
12023 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12024 ASSERT_VK_SUCCESS(err);
12025 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12026 ASSERT_VK_SUCCESS(err);
12027 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12028 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012029
Tony Barbour552f6c02016-12-21 14:34:07 -070012030 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012031 VkImageCopy copy_region;
12032 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12033 copy_region.srcSubresource.mipLevel = 0;
12034 copy_region.srcSubresource.baseArrayLayer = 0;
12035 copy_region.srcSubresource.layerCount = 1;
12036 copy_region.srcOffset.x = 0;
12037 copy_region.srcOffset.y = 0;
12038 copy_region.srcOffset.z = 0;
12039 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12040 copy_region.dstSubresource.mipLevel = 0;
12041 copy_region.dstSubresource.baseArrayLayer = 0;
12042 copy_region.dstSubresource.layerCount = 1;
12043 copy_region.dstOffset.x = 0;
12044 copy_region.dstOffset.y = 0;
12045 copy_region.dstOffset.z = 0;
12046 copy_region.extent.width = 1;
12047 copy_region.extent.height = 1;
12048 copy_region.extent.depth = 1;
12049
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12051 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12052 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012053
Cort530cf382016-12-08 09:59:47 -080012054 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 -060012055 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012056 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12057 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012058 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12059 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012060 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 -060012061 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012063 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12064 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012065 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080012066 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 -060012067 m_errorMonitor->VerifyFound();
12068 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012070 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012071 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012072 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012073 "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 -080012074 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 -060012075 m_errorMonitor->VerifyFound();
12076 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12078 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12079 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012080 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 -060012081 m_errorMonitor->VerifyFound();
12082 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012084 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012085 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012086 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012087 "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 -080012088 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 -060012089 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012091 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12092 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012093 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012094 "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 -080012095 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 -060012096 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012097
Cort3b021012016-12-07 12:00:57 -080012098 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12099 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12100 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12101 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12102 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12103 transfer_dst_image_barrier[0].srcAccessMask = 0;
12104 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12105 transfer_dst_image_barrier[0].image = dst_image;
12106 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12107 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12108 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12109 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12110 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12111 transfer_dst_image_barrier[0].image = depth_image;
12112 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12113 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12114 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12115
12116 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012117 VkClearColorValue color_clear_value = {};
12118 VkImageSubresourceRange clear_range;
12119 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12120 clear_range.baseMipLevel = 0;
12121 clear_range.baseArrayLayer = 0;
12122 clear_range.layerCount = 1;
12123 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012124
Cort3b021012016-12-07 12:00:57 -080012125 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12126 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012129 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012130 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012131 // Fail due to provided layout not matching actual current layout for color clear.
12132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012133 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012134 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012135
Cort530cf382016-12-08 09:59:47 -080012136 VkClearDepthStencilValue depth_clear_value = {};
12137 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012138
12139 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12140 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012143 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012144 m_errorMonitor->VerifyFound();
12145 // Fail due to provided layout not matching actual current layout for depth clear.
12146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012147 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012148 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012149
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012150 // Now cause error due to bad image layout transition in PipelineBarrier
12151 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012152 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012153 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012154 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012155 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012156 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12157 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012158 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012160 "you cannot transition the layout of aspect 1 from "
12161 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12162 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012164 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12165 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012166 m_errorMonitor->VerifyFound();
12167
12168 // Finally some layout errors at RenderPass create time
12169 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12170 VkAttachmentReference attach = {};
12171 // perf warning for GENERAL layout w/ non-DS input attachment
12172 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12173 VkSubpassDescription subpass = {};
12174 subpass.inputAttachmentCount = 1;
12175 subpass.pInputAttachments = &attach;
12176 VkRenderPassCreateInfo rpci = {};
12177 rpci.subpassCount = 1;
12178 rpci.pSubpasses = &subpass;
12179 rpci.attachmentCount = 1;
12180 VkAttachmentDescription attach_desc = {};
12181 attach_desc.format = VK_FORMAT_UNDEFINED;
12182 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012183 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012184 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12186 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012187 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12188 m_errorMonitor->VerifyFound();
12189 // error w/ non-general layout
12190 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12191
12192 m_errorMonitor->SetDesiredFailureMsg(
12193 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12194 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12195 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12196 m_errorMonitor->VerifyFound();
12197 subpass.inputAttachmentCount = 0;
12198 subpass.colorAttachmentCount = 1;
12199 subpass.pColorAttachments = &attach;
12200 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12201 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12203 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012204 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12205 m_errorMonitor->VerifyFound();
12206 // error w/ non-color opt or GENERAL layout for color attachment
12207 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12208 m_errorMonitor->SetDesiredFailureMsg(
12209 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12210 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12211 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12212 m_errorMonitor->VerifyFound();
12213 subpass.colorAttachmentCount = 0;
12214 subpass.pDepthStencilAttachment = &attach;
12215 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12216 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12218 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012219 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12220 m_errorMonitor->VerifyFound();
12221 // error w/ non-ds opt or GENERAL layout for color attachment
12222 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12224 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12225 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012226 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12227 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012228 // For this error we need a valid renderpass so create default one
12229 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12230 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012231 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012232 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12233 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12234 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12235 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12236 // Can't do a CLEAR load on READ_ONLY initialLayout
12237 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12238 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12239 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012241 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012242 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12243 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012244
Cort3b021012016-12-07 12:00:57 -080012245 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12246 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12247 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012248 vkDestroyImage(m_device->device(), src_image, NULL);
12249 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012250 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012251}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012252
Tobin Ehlise0936662016-10-11 08:10:51 -060012253TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12254 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12255 VkResult err;
12256
Tony Barbour1fa09702017-03-16 12:09:08 -060012257 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012258
12259 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12260 VkImageTiling tiling;
12261 VkFormatProperties format_properties;
12262 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12263 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12264 tiling = VK_IMAGE_TILING_LINEAR;
12265 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12266 tiling = VK_IMAGE_TILING_OPTIMAL;
12267 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012268 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012269 return;
12270 }
12271
12272 VkDescriptorPoolSize ds_type = {};
12273 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12274 ds_type.descriptorCount = 1;
12275
12276 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12277 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12278 ds_pool_ci.maxSets = 1;
12279 ds_pool_ci.poolSizeCount = 1;
12280 ds_pool_ci.pPoolSizes = &ds_type;
12281 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12282
12283 VkDescriptorPool ds_pool;
12284 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12285 ASSERT_VK_SUCCESS(err);
12286
12287 VkDescriptorSetLayoutBinding dsl_binding = {};
12288 dsl_binding.binding = 0;
12289 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12290 dsl_binding.descriptorCount = 1;
12291 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12292 dsl_binding.pImmutableSamplers = NULL;
12293
12294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12296 ds_layout_ci.pNext = NULL;
12297 ds_layout_ci.bindingCount = 1;
12298 ds_layout_ci.pBindings = &dsl_binding;
12299
12300 VkDescriptorSetLayout ds_layout;
12301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12302 ASSERT_VK_SUCCESS(err);
12303
12304 VkDescriptorSetAllocateInfo alloc_info = {};
12305 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12306 alloc_info.descriptorSetCount = 1;
12307 alloc_info.descriptorPool = ds_pool;
12308 alloc_info.pSetLayouts = &ds_layout;
12309 VkDescriptorSet descriptor_set;
12310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12311 ASSERT_VK_SUCCESS(err);
12312
12313 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12314 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12315 pipeline_layout_ci.pNext = NULL;
12316 pipeline_layout_ci.setLayoutCount = 1;
12317 pipeline_layout_ci.pSetLayouts = &ds_layout;
12318 VkPipelineLayout pipeline_layout;
12319 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12320 ASSERT_VK_SUCCESS(err);
12321
12322 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012323 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012324 ASSERT_TRUE(image.initialized());
12325 VkImageView view = image.targetView(tex_format);
12326
12327 VkDescriptorImageInfo image_info = {};
12328 image_info.imageView = view;
12329 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12330
12331 VkWriteDescriptorSet descriptor_write = {};
12332 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12333 descriptor_write.dstSet = descriptor_set;
12334 descriptor_write.dstBinding = 0;
12335 descriptor_write.descriptorCount = 1;
12336 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12337 descriptor_write.pImageInfo = &image_info;
12338
12339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12340 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12341 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12342 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12343 m_errorMonitor->VerifyFound();
12344
12345 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12346 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12347 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12348 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12349}
12350
Mark Mueller93b938f2016-08-18 10:27:40 -060012351TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012352 TEST_DESCRIPTION(
12353 "Use vkCmdExecuteCommands with invalid state "
12354 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012355
Tony Barbour1fa09702017-03-16 12:09:08 -060012356 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012357 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12358
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012359 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012360 const char *simultaneous_use_message2 =
12361 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12362 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012363
12364 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012365 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012366 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012367 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12368 command_buffer_allocate_info.commandBufferCount = 1;
12369
12370 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012371 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012372 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12373 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012374 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012375 command_buffer_inheritance_info.renderPass = m_renderPass;
12376 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012377
Mark Mueller93b938f2016-08-18 10:27:40 -060012378 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012379 command_buffer_begin_info.flags =
12380 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012381 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12382
12383 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12384 vkEndCommandBuffer(secondary_command_buffer);
12385
Mark Mueller93b938f2016-08-18 10:27:40 -060012386 VkSubmitInfo submit_info = {};
12387 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12388 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012389 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012390
Mark Mueller4042b652016-09-05 22:52:21 -060012391 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012392 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12394 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012395 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012396 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012397 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12398 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012399
Dave Houltonfbf52152017-01-06 12:55:29 -070012400 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012401 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012402 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012403
Mark Mueller4042b652016-09-05 22:52:21 -060012404 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012405 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012406 m_errorMonitor->SetUnexpectedError(
12407 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12408 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012409 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012410 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012411
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12413 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012414 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012415 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12416 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012417
12418 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012419
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012420 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012421}
12422
Tony Barbour626994c2017-02-08 15:29:37 -070012423TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12424 TEST_DESCRIPTION(
12425 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12426 "errors");
12427 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12428 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 -060012429 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012430
12431 VkCommandBuffer cmd_bufs[2];
12432 VkCommandBufferAllocateInfo alloc_info;
12433 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12434 alloc_info.pNext = NULL;
12435 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012436 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012437 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12438 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12439
12440 VkCommandBufferBeginInfo cb_binfo;
12441 cb_binfo.pNext = NULL;
12442 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12443 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12444 cb_binfo.flags = 0;
12445 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12446 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12447 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12448 vkEndCommandBuffer(cmd_bufs[0]);
12449 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12450
12451 VkSubmitInfo submit_info = {};
12452 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12453 submit_info.commandBufferCount = 2;
12454 submit_info.pCommandBuffers = duplicates;
12455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12456 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12457 m_errorMonitor->VerifyFound();
12458 vkQueueWaitIdle(m_device->m_queue);
12459
12460 // Set one time use and now look for one time submit
12461 duplicates[0] = duplicates[1] = cmd_bufs[1];
12462 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12463 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12464 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12465 vkEndCommandBuffer(cmd_bufs[1]);
12466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12467 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12468 m_errorMonitor->VerifyFound();
12469 vkQueueWaitIdle(m_device->m_queue);
12470}
12471
Tobin Ehlisb093da82017-01-19 12:05:27 -070012472TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012473 TEST_DESCRIPTION(
12474 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12475 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012476
Tony Barbour1fa09702017-03-16 12:09:08 -060012477 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012478 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12479
12480 std::vector<const char *> device_extension_names;
12481 auto features = m_device->phy().features();
12482 // Make sure gs & ts are disabled
12483 features.geometryShader = false;
12484 features.tessellationShader = false;
12485 // The sacrificial device object
12486 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12487
12488 VkCommandPoolCreateInfo pool_create_info{};
12489 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12490 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12491
12492 VkCommandPool command_pool;
12493 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12494
12495 VkCommandBufferAllocateInfo cmd = {};
12496 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12497 cmd.pNext = NULL;
12498 cmd.commandPool = command_pool;
12499 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12500 cmd.commandBufferCount = 1;
12501
12502 VkCommandBuffer cmd_buffer;
12503 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12504 ASSERT_VK_SUCCESS(err);
12505
12506 VkEvent event;
12507 VkEventCreateInfo evci = {};
12508 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12509 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12510 ASSERT_VK_SUCCESS(result);
12511
12512 VkCommandBufferBeginInfo cbbi = {};
12513 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12514 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12516 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12517 m_errorMonitor->VerifyFound();
12518
12519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12520 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12521 m_errorMonitor->VerifyFound();
12522
12523 vkDestroyEvent(test_device.handle(), event, NULL);
12524 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12525}
12526
Chris Forbesd70103a2017-04-13 11:34:09 -070012527TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012528 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12530
Tony Barbour552f6c02016-12-21 14:34:07 -070012531 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012532
12533 VkEvent event;
12534 VkEventCreateInfo event_create_info = {};
12535 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12536 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012537 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012538
Tony Barbour552f6c02016-12-21 14:34:07 -070012539 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012540 vkDestroyEvent(m_device->device(), event, nullptr);
12541
12542 VkSubmitInfo submit_info = {};
12543 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12544 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012545 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012547 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12548 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070012549}
Mark Muellerc8d441e2016-08-23 17:36:00 -060012550
Chris Forbesd70103a2017-04-13 11:34:09 -070012551TEST_F(VkLayerTest, InUseDestroyedSignaled) {
12552 TEST_DESCRIPTION(
12553 "Use vkCmdExecuteCommands with invalid state "
12554 "in primary and secondary command buffers. "
12555 "Delete objects that are inuse. Call VkQueueSubmit "
12556 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012557
Chris Forbesd70103a2017-04-13 11:34:09 -070012558 ASSERT_NO_FATAL_FAILURE(Init());
12559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12560
12561 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012562
Mark Mueller917f6bc2016-08-30 10:57:19 -060012563 VkSemaphoreCreateInfo semaphore_create_info = {};
12564 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12565 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012566 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012567 VkFenceCreateInfo fence_create_info = {};
12568 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12569 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012570 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012571
12572 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012573 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012574 descriptor_pool_type_count.descriptorCount = 1;
12575
12576 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12577 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12578 descriptor_pool_create_info.maxSets = 1;
12579 descriptor_pool_create_info.poolSizeCount = 1;
12580 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012581 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012582
12583 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012584 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012585
12586 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012587 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012588 descriptorset_layout_binding.descriptorCount = 1;
12589 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12590
12591 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012592 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012593 descriptorset_layout_create_info.bindingCount = 1;
12594 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12595
12596 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012597 ASSERT_VK_SUCCESS(
12598 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012599
12600 VkDescriptorSet descriptorset;
12601 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012602 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012603 descriptorset_allocate_info.descriptorSetCount = 1;
12604 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12605 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012606 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012607
Mark Mueller4042b652016-09-05 22:52:21 -060012608 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12609
12610 VkDescriptorBufferInfo buffer_info = {};
12611 buffer_info.buffer = buffer_test.GetBuffer();
12612 buffer_info.offset = 0;
12613 buffer_info.range = 1024;
12614
12615 VkWriteDescriptorSet write_descriptor_set = {};
12616 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12617 write_descriptor_set.dstSet = descriptorset;
12618 write_descriptor_set.descriptorCount = 1;
12619 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12620 write_descriptor_set.pBufferInfo = &buffer_info;
12621
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012622 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012624 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12625 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012626
12627 VkPipelineObj pipe(m_device);
12628 pipe.AddColorAttachment();
12629 pipe.AddShader(&vs);
12630 pipe.AddShader(&fs);
12631
12632 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012633 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012634 pipeline_layout_create_info.setLayoutCount = 1;
12635 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12636
12637 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012638 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012639
12640 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12641
Chris Forbesd70103a2017-04-13 11:34:09 -070012642 VkEvent event;
12643 VkEventCreateInfo event_create_info = {};
12644 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12645 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12646
Tony Barbour552f6c02016-12-21 14:34:07 -070012647 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070012648
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012649 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012650
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012651 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12652 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12653 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012654
Tony Barbour552f6c02016-12-21 14:34:07 -070012655 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012656
Chris Forbesd70103a2017-04-13 11:34:09 -070012657 VkSubmitInfo submit_info = {};
12658 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12659 submit_info.commandBufferCount = 1;
12660 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012661 submit_info.signalSemaphoreCount = 1;
12662 submit_info.pSignalSemaphores = &semaphore;
12663 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012664 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012665
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012667 vkDestroyEvent(m_device->device(), event, nullptr);
12668 m_errorMonitor->VerifyFound();
12669
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012671 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12672 m_errorMonitor->VerifyFound();
12673
Jeremy Hayes08369882017-02-02 10:31:06 -070012674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012675 vkDestroyFence(m_device->device(), fence, nullptr);
12676 m_errorMonitor->VerifyFound();
12677
Tobin Ehlis122207b2016-09-01 08:50:06 -070012678 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012679 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12680 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012681 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012682 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12683 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012684 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012685 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12686 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012687 vkDestroyEvent(m_device->device(), event, nullptr);
12688 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012689 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012690 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12691}
12692
Tobin Ehlis2adda372016-09-01 08:51:06 -070012693TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12694 TEST_DESCRIPTION("Delete in-use query pool.");
12695
Tony Barbour1fa09702017-03-16 12:09:08 -060012696 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12698
12699 VkQueryPool query_pool;
12700 VkQueryPoolCreateInfo query_pool_ci{};
12701 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12702 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12703 query_pool_ci.queryCount = 1;
12704 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012705 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012706 // Reset query pool to create binding with cmd buffer
12707 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12708
Tony Barbour552f6c02016-12-21 14:34:07 -070012709 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012710
12711 VkSubmitInfo submit_info = {};
12712 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12713 submit_info.commandBufferCount = 1;
12714 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12715 // Submit cmd buffer and then destroy query pool while in-flight
12716 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12717
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012719 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12720 m_errorMonitor->VerifyFound();
12721
12722 vkQueueWaitIdle(m_device->m_queue);
12723 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012724 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012725 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012726 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12727}
12728
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012729TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12730 TEST_DESCRIPTION("Delete in-use pipeline.");
12731
Tony Barbour1fa09702017-03-16 12:09:08 -060012732 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12734
12735 // Empty pipeline layout used for binding PSO
12736 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12737 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12738 pipeline_layout_ci.setLayoutCount = 0;
12739 pipeline_layout_ci.pSetLayouts = NULL;
12740
12741 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012742 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012743 ASSERT_VK_SUCCESS(err);
12744
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012746 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012747 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12748 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012749 // Store pipeline handle so we can actually delete it before test finishes
12750 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012751 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012752 VkPipelineObj pipe(m_device);
12753 pipe.AddShader(&vs);
12754 pipe.AddShader(&fs);
12755 pipe.AddColorAttachment();
12756 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12757 delete_this_pipeline = pipe.handle();
12758
Tony Barbour552f6c02016-12-21 14:34:07 -070012759 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012760 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012761 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012762
Tony Barbour552f6c02016-12-21 14:34:07 -070012763 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012764
12765 VkSubmitInfo submit_info = {};
12766 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12767 submit_info.commandBufferCount = 1;
12768 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12769 // Submit cmd buffer and then pipeline destroyed while in-flight
12770 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012771 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012772 m_errorMonitor->VerifyFound();
12773 // Make sure queue finished and then actually delete pipeline
12774 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012775 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12776 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012777 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12778 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12779}
12780
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012781TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12782 TEST_DESCRIPTION("Delete in-use imageView.");
12783
Tony Barbour1fa09702017-03-16 12:09:08 -060012784 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12786
12787 VkDescriptorPoolSize ds_type_count;
12788 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12789 ds_type_count.descriptorCount = 1;
12790
12791 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12792 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12793 ds_pool_ci.maxSets = 1;
12794 ds_pool_ci.poolSizeCount = 1;
12795 ds_pool_ci.pPoolSizes = &ds_type_count;
12796
12797 VkDescriptorPool ds_pool;
12798 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12799 ASSERT_VK_SUCCESS(err);
12800
12801 VkSamplerCreateInfo sampler_ci = {};
12802 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12803 sampler_ci.pNext = NULL;
12804 sampler_ci.magFilter = VK_FILTER_NEAREST;
12805 sampler_ci.minFilter = VK_FILTER_NEAREST;
12806 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12807 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12808 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12809 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12810 sampler_ci.mipLodBias = 1.0;
12811 sampler_ci.anisotropyEnable = VK_FALSE;
12812 sampler_ci.maxAnisotropy = 1;
12813 sampler_ci.compareEnable = VK_FALSE;
12814 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12815 sampler_ci.minLod = 1.0;
12816 sampler_ci.maxLod = 1.0;
12817 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12818 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12819 VkSampler sampler;
12820
12821 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12822 ASSERT_VK_SUCCESS(err);
12823
12824 VkDescriptorSetLayoutBinding layout_binding;
12825 layout_binding.binding = 0;
12826 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12827 layout_binding.descriptorCount = 1;
12828 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12829 layout_binding.pImmutableSamplers = NULL;
12830
12831 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12832 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12833 ds_layout_ci.bindingCount = 1;
12834 ds_layout_ci.pBindings = &layout_binding;
12835 VkDescriptorSetLayout ds_layout;
12836 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12837 ASSERT_VK_SUCCESS(err);
12838
12839 VkDescriptorSetAllocateInfo alloc_info = {};
12840 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12841 alloc_info.descriptorSetCount = 1;
12842 alloc_info.descriptorPool = ds_pool;
12843 alloc_info.pSetLayouts = &ds_layout;
12844 VkDescriptorSet descriptor_set;
12845 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12846 ASSERT_VK_SUCCESS(err);
12847
12848 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12849 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12850 pipeline_layout_ci.pNext = NULL;
12851 pipeline_layout_ci.setLayoutCount = 1;
12852 pipeline_layout_ci.pSetLayouts = &ds_layout;
12853
12854 VkPipelineLayout pipeline_layout;
12855 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12856 ASSERT_VK_SUCCESS(err);
12857
12858 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012859 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 -060012860 ASSERT_TRUE(image.initialized());
12861
12862 VkImageView view;
12863 VkImageViewCreateInfo ivci = {};
12864 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12865 ivci.image = image.handle();
12866 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12867 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12868 ivci.subresourceRange.layerCount = 1;
12869 ivci.subresourceRange.baseMipLevel = 0;
12870 ivci.subresourceRange.levelCount = 1;
12871 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12872
12873 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12874 ASSERT_VK_SUCCESS(err);
12875
12876 VkDescriptorImageInfo image_info{};
12877 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12878 image_info.imageView = view;
12879 image_info.sampler = sampler;
12880
12881 VkWriteDescriptorSet descriptor_write = {};
12882 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12883 descriptor_write.dstSet = descriptor_set;
12884 descriptor_write.dstBinding = 0;
12885 descriptor_write.descriptorCount = 1;
12886 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12887 descriptor_write.pImageInfo = &image_info;
12888
12889 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12890
12891 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012892 char const *vsSource =
12893 "#version 450\n"
12894 "\n"
12895 "out gl_PerVertex { \n"
12896 " vec4 gl_Position;\n"
12897 "};\n"
12898 "void main(){\n"
12899 " gl_Position = vec4(1);\n"
12900 "}\n";
12901 char const *fsSource =
12902 "#version 450\n"
12903 "\n"
12904 "layout(set=0, binding=0) uniform sampler2D s;\n"
12905 "layout(location=0) out vec4 x;\n"
12906 "void main(){\n"
12907 " x = texture(s, vec2(1));\n"
12908 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012909 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12910 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12911 VkPipelineObj pipe(m_device);
12912 pipe.AddShader(&vs);
12913 pipe.AddShader(&fs);
12914 pipe.AddColorAttachment();
12915 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12916
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012918
Tony Barbour552f6c02016-12-21 14:34:07 -070012919 m_commandBuffer->BeginCommandBuffer();
12920 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012921 // Bind pipeline to cmd buffer
12922 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12923 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12924 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012925
12926 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12927 VkRect2D scissor = {{0, 0}, {16, 16}};
12928 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12929 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12930
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012931 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012932 m_commandBuffer->EndRenderPass();
12933 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012934 // Submit cmd buffer then destroy sampler
12935 VkSubmitInfo submit_info = {};
12936 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12937 submit_info.commandBufferCount = 1;
12938 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12939 // Submit cmd buffer and then destroy imageView while in-flight
12940 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12941
12942 vkDestroyImageView(m_device->device(), view, nullptr);
12943 m_errorMonitor->VerifyFound();
12944 vkQueueWaitIdle(m_device->m_queue);
12945 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012946 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012947 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012948 vkDestroyImageView(m_device->device(), view, NULL);
12949 vkDestroySampler(m_device->device(), sampler, nullptr);
12950 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12951 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12952 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12953}
12954
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012955TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12956 TEST_DESCRIPTION("Delete in-use bufferView.");
12957
Tony Barbour1fa09702017-03-16 12:09:08 -060012958 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12960
12961 VkDescriptorPoolSize ds_type_count;
12962 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12963 ds_type_count.descriptorCount = 1;
12964
12965 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12966 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12967 ds_pool_ci.maxSets = 1;
12968 ds_pool_ci.poolSizeCount = 1;
12969 ds_pool_ci.pPoolSizes = &ds_type_count;
12970
12971 VkDescriptorPool ds_pool;
12972 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12973 ASSERT_VK_SUCCESS(err);
12974
12975 VkDescriptorSetLayoutBinding layout_binding;
12976 layout_binding.binding = 0;
12977 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12978 layout_binding.descriptorCount = 1;
12979 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12980 layout_binding.pImmutableSamplers = NULL;
12981
12982 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12983 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12984 ds_layout_ci.bindingCount = 1;
12985 ds_layout_ci.pBindings = &layout_binding;
12986 VkDescriptorSetLayout ds_layout;
12987 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12988 ASSERT_VK_SUCCESS(err);
12989
12990 VkDescriptorSetAllocateInfo alloc_info = {};
12991 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12992 alloc_info.descriptorSetCount = 1;
12993 alloc_info.descriptorPool = ds_pool;
12994 alloc_info.pSetLayouts = &ds_layout;
12995 VkDescriptorSet descriptor_set;
12996 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12997 ASSERT_VK_SUCCESS(err);
12998
12999 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13000 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13001 pipeline_layout_ci.pNext = NULL;
13002 pipeline_layout_ci.setLayoutCount = 1;
13003 pipeline_layout_ci.pSetLayouts = &ds_layout;
13004
13005 VkPipelineLayout pipeline_layout;
13006 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13007 ASSERT_VK_SUCCESS(err);
13008
13009 VkBuffer buffer;
13010 uint32_t queue_family_index = 0;
13011 VkBufferCreateInfo buffer_create_info = {};
13012 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13013 buffer_create_info.size = 1024;
13014 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13015 buffer_create_info.queueFamilyIndexCount = 1;
13016 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13017
13018 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13019 ASSERT_VK_SUCCESS(err);
13020
13021 VkMemoryRequirements memory_reqs;
13022 VkDeviceMemory buffer_memory;
13023
13024 VkMemoryAllocateInfo memory_info = {};
13025 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13026 memory_info.allocationSize = 0;
13027 memory_info.memoryTypeIndex = 0;
13028
13029 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13030 memory_info.allocationSize = memory_reqs.size;
13031 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13032 ASSERT_TRUE(pass);
13033
13034 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13035 ASSERT_VK_SUCCESS(err);
13036 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13037 ASSERT_VK_SUCCESS(err);
13038
13039 VkBufferView view;
13040 VkBufferViewCreateInfo bvci = {};
13041 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13042 bvci.buffer = buffer;
13043 bvci.format = VK_FORMAT_R8_UNORM;
13044 bvci.range = VK_WHOLE_SIZE;
13045
13046 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13047 ASSERT_VK_SUCCESS(err);
13048
13049 VkWriteDescriptorSet descriptor_write = {};
13050 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13051 descriptor_write.dstSet = descriptor_set;
13052 descriptor_write.dstBinding = 0;
13053 descriptor_write.descriptorCount = 1;
13054 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13055 descriptor_write.pTexelBufferView = &view;
13056
13057 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13058
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013059 char const *vsSource =
13060 "#version 450\n"
13061 "\n"
13062 "out gl_PerVertex { \n"
13063 " vec4 gl_Position;\n"
13064 "};\n"
13065 "void main(){\n"
13066 " gl_Position = vec4(1);\n"
13067 "}\n";
13068 char const *fsSource =
13069 "#version 450\n"
13070 "\n"
13071 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13072 "layout(location=0) out vec4 x;\n"
13073 "void main(){\n"
13074 " x = imageLoad(s, 0);\n"
13075 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013076 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13077 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13078 VkPipelineObj pipe(m_device);
13079 pipe.AddShader(&vs);
13080 pipe.AddShader(&fs);
13081 pipe.AddColorAttachment();
13082 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13083
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013085
Tony Barbour552f6c02016-12-21 14:34:07 -070013086 m_commandBuffer->BeginCommandBuffer();
13087 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013088 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13089 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13090 VkRect2D scissor = {{0, 0}, {16, 16}};
13091 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13092 // Bind pipeline to cmd buffer
13093 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13094 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13095 &descriptor_set, 0, nullptr);
13096 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013097 m_commandBuffer->EndRenderPass();
13098 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013099
13100 VkSubmitInfo submit_info = {};
13101 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13102 submit_info.commandBufferCount = 1;
13103 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13104 // Submit cmd buffer and then destroy bufferView while in-flight
13105 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13106
13107 vkDestroyBufferView(m_device->device(), view, nullptr);
13108 m_errorMonitor->VerifyFound();
13109 vkQueueWaitIdle(m_device->m_queue);
13110 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013111 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013112 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013113 vkDestroyBufferView(m_device->device(), view, NULL);
13114 vkDestroyBuffer(m_device->device(), buffer, NULL);
13115 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13116 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13117 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13118 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13119}
13120
Tobin Ehlis209532e2016-09-07 13:52:18 -060013121TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13122 TEST_DESCRIPTION("Delete in-use sampler.");
13123
Tony Barbour1fa09702017-03-16 12:09:08 -060013124 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13126
13127 VkDescriptorPoolSize ds_type_count;
13128 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13129 ds_type_count.descriptorCount = 1;
13130
13131 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13132 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13133 ds_pool_ci.maxSets = 1;
13134 ds_pool_ci.poolSizeCount = 1;
13135 ds_pool_ci.pPoolSizes = &ds_type_count;
13136
13137 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013138 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013139 ASSERT_VK_SUCCESS(err);
13140
13141 VkSamplerCreateInfo sampler_ci = {};
13142 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13143 sampler_ci.pNext = NULL;
13144 sampler_ci.magFilter = VK_FILTER_NEAREST;
13145 sampler_ci.minFilter = VK_FILTER_NEAREST;
13146 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13147 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13148 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13149 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13150 sampler_ci.mipLodBias = 1.0;
13151 sampler_ci.anisotropyEnable = VK_FALSE;
13152 sampler_ci.maxAnisotropy = 1;
13153 sampler_ci.compareEnable = VK_FALSE;
13154 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13155 sampler_ci.minLod = 1.0;
13156 sampler_ci.maxLod = 1.0;
13157 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13158 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13159 VkSampler sampler;
13160
13161 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13162 ASSERT_VK_SUCCESS(err);
13163
13164 VkDescriptorSetLayoutBinding layout_binding;
13165 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013166 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013167 layout_binding.descriptorCount = 1;
13168 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13169 layout_binding.pImmutableSamplers = NULL;
13170
13171 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13172 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13173 ds_layout_ci.bindingCount = 1;
13174 ds_layout_ci.pBindings = &layout_binding;
13175 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013176 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013177 ASSERT_VK_SUCCESS(err);
13178
13179 VkDescriptorSetAllocateInfo alloc_info = {};
13180 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13181 alloc_info.descriptorSetCount = 1;
13182 alloc_info.descriptorPool = ds_pool;
13183 alloc_info.pSetLayouts = &ds_layout;
13184 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013185 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013186 ASSERT_VK_SUCCESS(err);
13187
13188 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13189 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13190 pipeline_layout_ci.pNext = NULL;
13191 pipeline_layout_ci.setLayoutCount = 1;
13192 pipeline_layout_ci.pSetLayouts = &ds_layout;
13193
13194 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013196 ASSERT_VK_SUCCESS(err);
13197
13198 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013199 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 -060013200 ASSERT_TRUE(image.initialized());
13201
13202 VkImageView view;
13203 VkImageViewCreateInfo ivci = {};
13204 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13205 ivci.image = image.handle();
13206 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13207 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13208 ivci.subresourceRange.layerCount = 1;
13209 ivci.subresourceRange.baseMipLevel = 0;
13210 ivci.subresourceRange.levelCount = 1;
13211 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13212
13213 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13214 ASSERT_VK_SUCCESS(err);
13215
13216 VkDescriptorImageInfo image_info{};
13217 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13218 image_info.imageView = view;
13219 image_info.sampler = sampler;
13220
13221 VkWriteDescriptorSet descriptor_write = {};
13222 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13223 descriptor_write.dstSet = descriptor_set;
13224 descriptor_write.dstBinding = 0;
13225 descriptor_write.descriptorCount = 1;
13226 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13227 descriptor_write.pImageInfo = &image_info;
13228
13229 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13230
13231 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013232 char const *vsSource =
13233 "#version 450\n"
13234 "\n"
13235 "out gl_PerVertex { \n"
13236 " vec4 gl_Position;\n"
13237 "};\n"
13238 "void main(){\n"
13239 " gl_Position = vec4(1);\n"
13240 "}\n";
13241 char const *fsSource =
13242 "#version 450\n"
13243 "\n"
13244 "layout(set=0, binding=0) uniform sampler2D s;\n"
13245 "layout(location=0) out vec4 x;\n"
13246 "void main(){\n"
13247 " x = texture(s, vec2(1));\n"
13248 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13251 VkPipelineObj pipe(m_device);
13252 pipe.AddShader(&vs);
13253 pipe.AddShader(&fs);
13254 pipe.AddColorAttachment();
13255 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13256
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013258
Tony Barbour552f6c02016-12-21 14:34:07 -070013259 m_commandBuffer->BeginCommandBuffer();
13260 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013261 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013262 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13263 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13264 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013265
13266 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13267 VkRect2D scissor = {{0, 0}, {16, 16}};
13268 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13269 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13270
Tobin Ehlis209532e2016-09-07 13:52:18 -060013271 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013272 m_commandBuffer->EndRenderPass();
13273 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013274 // Submit cmd buffer then destroy sampler
13275 VkSubmitInfo submit_info = {};
13276 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13277 submit_info.commandBufferCount = 1;
13278 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13279 // Submit cmd buffer and then destroy sampler while in-flight
13280 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13281
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013282 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013283 m_errorMonitor->VerifyFound();
13284 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013285
Tobin Ehlis209532e2016-09-07 13:52:18 -060013286 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013287 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13288 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013289 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013290 vkDestroyImageView(m_device->device(), view, NULL);
13291 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13292 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13293 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13294}
13295
Mark Mueller1cd9f412016-08-25 13:23:52 -060013296TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013297 TEST_DESCRIPTION(
13298 "Call VkQueueSubmit with a semaphore that is already "
13299 "signaled but not waited on by the queue. Wait on a "
13300 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013301
Tony Barbour1fa09702017-03-16 12:09:08 -060013302 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13304
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013305 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 -070013306 const char *invalid_fence_wait_message =
13307 " which has not been submitted on a Queue or during "
13308 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013309
Tony Barbour552f6c02016-12-21 14:34:07 -070013310 m_commandBuffer->BeginCommandBuffer();
13311 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013312
13313 VkSemaphoreCreateInfo semaphore_create_info = {};
13314 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13315 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013316 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013317 VkSubmitInfo submit_info = {};
13318 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13319 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013320 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013321 submit_info.signalSemaphoreCount = 1;
13322 submit_info.pSignalSemaphores = &semaphore;
13323 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013324 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013325 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013326 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013327 m_commandBuffer->BeginCommandBuffer();
13328 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013330 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13331 m_errorMonitor->VerifyFound();
13332
Mark Mueller1cd9f412016-08-25 13:23:52 -060013333 VkFenceCreateInfo fence_create_info = {};
13334 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13335 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013336 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013339 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13340 m_errorMonitor->VerifyFound();
13341
Mark Mueller4042b652016-09-05 22:52:21 -060013342 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013343 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013344 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13345}
13346
Tobin Ehlis4af23302016-07-19 10:50:30 -060013347TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013348 TEST_DESCRIPTION(
13349 "Bind a secondary command buffer with with a framebuffer "
13350 "that does not match the framebuffer for the active "
13351 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013352 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13354
13355 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013356 VkAttachmentDescription attachment = {0,
13357 VK_FORMAT_B8G8R8A8_UNORM,
13358 VK_SAMPLE_COUNT_1_BIT,
13359 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13360 VK_ATTACHMENT_STORE_OP_STORE,
13361 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13362 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13363 VK_IMAGE_LAYOUT_UNDEFINED,
13364 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013365
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013366 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013367
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013368 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013369
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013370 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013371
13372 VkRenderPass rp;
13373 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13374 ASSERT_VK_SUCCESS(err);
13375
13376 // A compatible framebuffer.
13377 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013378 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 -060013379 ASSERT_TRUE(image.initialized());
13380
13381 VkImageViewCreateInfo ivci = {
13382 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13383 nullptr,
13384 0,
13385 image.handle(),
13386 VK_IMAGE_VIEW_TYPE_2D,
13387 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013388 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13389 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013390 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13391 };
13392 VkImageView view;
13393 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13394 ASSERT_VK_SUCCESS(err);
13395
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013396 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013397 VkFramebuffer fb;
13398 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13399 ASSERT_VK_SUCCESS(err);
13400
13401 VkCommandBufferAllocateInfo cbai = {};
13402 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013403 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013404 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13405 cbai.commandBufferCount = 1;
13406
13407 VkCommandBuffer sec_cb;
13408 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13409 ASSERT_VK_SUCCESS(err);
13410 VkCommandBufferBeginInfo cbbi = {};
13411 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013412 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013413 cbii.renderPass = renderPass();
13414 cbii.framebuffer = fb;
13415 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13416 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013417 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 -060013418 cbbi.pInheritanceInfo = &cbii;
13419 vkBeginCommandBuffer(sec_cb, &cbbi);
13420 vkEndCommandBuffer(sec_cb);
13421
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013422 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013423 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13424 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013425
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013427 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013428 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13429 m_errorMonitor->VerifyFound();
13430 // Cleanup
13431 vkDestroyImageView(m_device->device(), view, NULL);
13432 vkDestroyRenderPass(m_device->device(), rp, NULL);
13433 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13434}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013435
13436TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013437 TEST_DESCRIPTION(
13438 "If logicOp is available on the device, set it to an "
13439 "invalid value. If logicOp is not available, attempt to "
13440 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013441 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13443
13444 auto features = m_device->phy().features();
13445 // Set the expected error depending on whether or not logicOp available
13446 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13448 "If logic operations feature not "
13449 "enabled, logicOpEnable must be "
13450 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013451 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013453 }
13454 // Create a pipeline using logicOp
13455 VkResult err;
13456
13457 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13458 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13459
13460 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013461 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013462 ASSERT_VK_SUCCESS(err);
13463
13464 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13465 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13466 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013467 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013468 vp_state_ci.pViewports = &vp;
13469 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013470 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013471 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013472
13473 VkPipelineShaderStageCreateInfo shaderStages[2];
13474 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13475
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013476 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13477 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013478 shaderStages[0] = vs.GetStageCreateInfo();
13479 shaderStages[1] = fs.GetStageCreateInfo();
13480
13481 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13482 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13483
13484 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13485 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13486 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13487
13488 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13489 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013490 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013491
13492 VkPipelineColorBlendAttachmentState att = {};
13493 att.blendEnable = VK_FALSE;
13494 att.colorWriteMask = 0xf;
13495
13496 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13497 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13498 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13499 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013500 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013501 cb_ci.attachmentCount = 1;
13502 cb_ci.pAttachments = &att;
13503
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013504 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13505 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13506 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13507
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013508 VkGraphicsPipelineCreateInfo gp_ci = {};
13509 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13510 gp_ci.stageCount = 2;
13511 gp_ci.pStages = shaderStages;
13512 gp_ci.pVertexInputState = &vi_ci;
13513 gp_ci.pInputAssemblyState = &ia_ci;
13514 gp_ci.pViewportState = &vp_state_ci;
13515 gp_ci.pRasterizationState = &rs_ci;
13516 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013517 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013518 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13519 gp_ci.layout = pipeline_layout;
13520 gp_ci.renderPass = renderPass();
13521
13522 VkPipelineCacheCreateInfo pc_ci = {};
13523 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13524
13525 VkPipeline pipeline;
13526 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013527 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013528 ASSERT_VK_SUCCESS(err);
13529
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013530 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013531 m_errorMonitor->VerifyFound();
13532 if (VK_SUCCESS == err) {
13533 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13534 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013535 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13536 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13537}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013538
Mike Stroyanaccf7692015-05-12 16:00:45 -060013539#if GTEST_IS_THREADSAFE
13540struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013541 VkCommandBuffer commandBuffer;
Mike Stroyanca855662017-05-02 11:06:27 -060013542 VkDevice device;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013543 VkEvent event;
13544 bool bailout;
13545};
13546
Karl Schultz6addd812016-02-02 17:17:23 -070013547extern "C" void *AddToCommandBuffer(void *arg) {
13548 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013549
Mike Stroyana6d14942016-07-13 15:10:05 -060013550 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013551 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013552 if (data->bailout) {
13553 break;
13554 }
13555 }
13556 return NULL;
13557}
13558
Karl Schultz6addd812016-02-02 17:17:23 -070013559TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013560 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013563
Tony Barbour1fa09702017-03-16 12:09:08 -060013564 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013565 ASSERT_NO_FATAL_FAILURE(InitViewport());
13566 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13567
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013568 // Calls AllocateCommandBuffers
13569 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013570
13571 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013572 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013573
13574 VkEventCreateInfo event_info;
13575 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013576 VkResult err;
13577
13578 memset(&event_info, 0, sizeof(event_info));
13579 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13580
Chia-I Wuf7458c52015-10-26 21:10:41 +080013581 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013582 ASSERT_VK_SUCCESS(err);
13583
Mike Stroyanaccf7692015-05-12 16:00:45 -060013584 err = vkResetEvent(device(), event);
13585 ASSERT_VK_SUCCESS(err);
13586
13587 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013588 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013589 data.event = event;
13590 data.bailout = false;
13591 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013592
13593 // First do some correct operations using multiple threads.
13594 // Add many entries to command buffer from another thread.
13595 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13596 // Make non-conflicting calls from this thread at the same time.
13597 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013598 uint32_t count;
13599 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013600 }
13601 test_platform_thread_join(thread, NULL);
13602
13603 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013604 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013605 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013606 // Add many entries to command buffer from this thread at the same time.
13607 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013608
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013609 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013610 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013611
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013612 m_errorMonitor->SetBailout(NULL);
13613
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013614 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013615
Chia-I Wuf7458c52015-10-26 21:10:41 +080013616 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013617}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013618#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013619
Karl Schultz6addd812016-02-02 17:17:23 -070013620TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013621 TEST_DESCRIPTION(
13622 "Test that an error is produced for a spirv module "
13623 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013624
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013626
Tony Barbour1fa09702017-03-16 12:09:08 -060013627 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13629
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013630 VkShaderModule module;
13631 VkShaderModuleCreateInfo moduleCreateInfo;
13632 struct icd_spv_header spv;
13633
13634 spv.magic = ICD_SPV_MAGIC;
13635 spv.version = ICD_SPV_VERSION;
13636 spv.gen_magic = 0;
13637
13638 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13639 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013640 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013641 moduleCreateInfo.codeSize = 4;
13642 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013643 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013644
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013645 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013646}
13647
Karl Schultz6addd812016-02-02 17:17:23 -070013648TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013649 TEST_DESCRIPTION(
13650 "Test that an error is produced for a spirv module "
13651 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013652
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013654
Tony Barbour1fa09702017-03-16 12:09:08 -060013655 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13657
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013658 VkShaderModule module;
13659 VkShaderModuleCreateInfo moduleCreateInfo;
13660 struct icd_spv_header spv;
13661
13662 spv.magic = ~ICD_SPV_MAGIC;
13663 spv.version = ICD_SPV_VERSION;
13664 spv.gen_magic = 0;
13665
13666 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13667 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013668 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013669 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13670 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013671 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013672
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013673 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013674}
13675
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013676#if 0
13677// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013678TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013680 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013681
Tony Barbour1fa09702017-03-16 12:09:08 -060013682 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13684
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013685 VkShaderModule module;
13686 VkShaderModuleCreateInfo moduleCreateInfo;
13687 struct icd_spv_header spv;
13688
13689 spv.magic = ICD_SPV_MAGIC;
13690 spv.version = ~ICD_SPV_VERSION;
13691 spv.gen_magic = 0;
13692
13693 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13694 moduleCreateInfo.pNext = NULL;
13695
Karl Schultz6addd812016-02-02 17:17:23 -070013696 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013697 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13698 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013699 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013700
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013701 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013702}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013703#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013704
Karl Schultz6addd812016-02-02 17:17:23 -070013705TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013706 TEST_DESCRIPTION(
13707 "Test that a warning is produced for a vertex output that "
13708 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013710
Tony Barbour1fa09702017-03-16 12:09:08 -060013711 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013712 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013713
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013714 char const *vsSource =
13715 "#version 450\n"
13716 "\n"
13717 "layout(location=0) out float x;\n"
13718 "out gl_PerVertex {\n"
13719 " vec4 gl_Position;\n"
13720 "};\n"
13721 "void main(){\n"
13722 " gl_Position = vec4(1);\n"
13723 " x = 0;\n"
13724 "}\n";
13725 char const *fsSource =
13726 "#version 450\n"
13727 "\n"
13728 "layout(location=0) out vec4 color;\n"
13729 "void main(){\n"
13730 " color = vec4(1);\n"
13731 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013732
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013733 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13734 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013735
13736 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013737 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013738 pipe.AddShader(&vs);
13739 pipe.AddShader(&fs);
13740
Chris Forbes9f7ff632015-05-25 11:13:08 +120013741 VkDescriptorSetObj descriptorSet(m_device);
13742 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013743 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013744
Tony Barbour5781e8f2015-08-04 16:23:11 -060013745 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013746
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013747 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013748}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013749
Mark Mueller098c9cb2016-09-08 09:01:57 -060013750TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13751 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13752
Tony Barbour1fa09702017-03-16 12:09:08 -060013753 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013754 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13755
13756 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013757 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013758
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013759 char const *vsSource =
13760 "#version 450\n"
13761 "\n"
13762 "out gl_PerVertex {\n"
13763 " vec4 gl_Position;\n"
13764 "};\n"
13765 "void main(){\n"
13766 " gl_Position = vec4(1);\n"
13767 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013768
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013769 char const *fsSource =
13770 "#version 450\n"
13771 "\n"
13772 "layout (constant_id = 0) const float r = 0.0f;\n"
13773 "layout(location = 0) out vec4 uFragColor;\n"
13774 "void main(){\n"
13775 " uFragColor = vec4(r,1,0,1);\n"
13776 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013777
13778 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13779 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13780
13781 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13782 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13783
13784 VkPipelineLayout pipeline_layout;
13785 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13786
13787 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13788 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13789 vp_state_create_info.viewportCount = 1;
13790 VkViewport viewport = {};
13791 vp_state_create_info.pViewports = &viewport;
13792 vp_state_create_info.scissorCount = 1;
13793 VkRect2D scissors = {};
13794 vp_state_create_info.pScissors = &scissors;
13795
13796 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13797
13798 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13799 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13800 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13801 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13802
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013803 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013804
13805 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13806 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13807
13808 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13809 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13810 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13811
13812 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13813 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13814 rasterization_state_create_info.pNext = nullptr;
13815 rasterization_state_create_info.lineWidth = 1.0f;
13816 rasterization_state_create_info.rasterizerDiscardEnable = true;
13817
13818 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13819 color_blend_attachment_state.blendEnable = VK_FALSE;
13820 color_blend_attachment_state.colorWriteMask = 0xf;
13821
13822 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13823 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13824 color_blend_state_create_info.attachmentCount = 1;
13825 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13826
13827 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13828 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13829 graphicspipe_create_info.stageCount = 2;
13830 graphicspipe_create_info.pStages = shader_stage_create_info;
13831 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13832 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13833 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13834 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13835 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13836 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13837 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13838 graphicspipe_create_info.layout = pipeline_layout;
13839 graphicspipe_create_info.renderPass = renderPass();
13840
13841 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13842 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13843
13844 VkPipelineCache pipelineCache;
13845 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13846
13847 // This structure maps constant ids to data locations.
13848 const VkSpecializationMapEntry entry =
13849 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013850 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013851
13852 uint32_t data = 1;
13853
13854 // Set up the info describing spec map and data
13855 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013856 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013857 };
13858 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13859
13860 VkPipeline pipeline;
13861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13862 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13863 m_errorMonitor->VerifyFound();
13864
13865 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13866 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13867}
13868
13869TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13870 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13871
Tony Barbour1fa09702017-03-16 12:09:08 -060013872 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13874
13875 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13876
13877 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13878 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13879 descriptor_pool_type_count[0].descriptorCount = 1;
13880 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13881 descriptor_pool_type_count[1].descriptorCount = 1;
13882
13883 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13884 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13885 descriptor_pool_create_info.maxSets = 1;
13886 descriptor_pool_create_info.poolSizeCount = 2;
13887 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13888 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13889
13890 VkDescriptorPool descriptorset_pool;
13891 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13892
13893 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13894 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13895 descriptorset_layout_binding.descriptorCount = 1;
13896 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013897 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013898
13899 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13900 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13901 descriptorset_layout_create_info.bindingCount = 1;
13902 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13903
13904 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013905 ASSERT_VK_SUCCESS(
13906 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013907
13908 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13909 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13910 descriptorset_allocate_info.descriptorSetCount = 1;
13911 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13912 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13913 VkDescriptorSet descriptorset;
13914 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13915
13916 // Challenge core_validation with a non uniform buffer type.
13917 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13918
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013919 char const *vsSource =
13920 "#version 450\n"
13921 "\n"
13922 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13923 " mat4 mvp;\n"
13924 "} ubuf;\n"
13925 "out gl_PerVertex {\n"
13926 " vec4 gl_Position;\n"
13927 "};\n"
13928 "void main(){\n"
13929 " gl_Position = ubuf.mvp * vec4(1);\n"
13930 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013931
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013932 char const *fsSource =
13933 "#version 450\n"
13934 "\n"
13935 "layout(location = 0) out vec4 uFragColor;\n"
13936 "void main(){\n"
13937 " uFragColor = vec4(0,1,0,1);\n"
13938 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013939
13940 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13941 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13942
13943 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13944 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13945 pipeline_layout_create_info.setLayoutCount = 1;
13946 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13947
13948 VkPipelineLayout pipeline_layout;
13949 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13950
13951 VkPipelineObj pipe(m_device);
13952 pipe.AddColorAttachment();
13953 pipe.AddShader(&vs);
13954 pipe.AddShader(&fs);
13955
13956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13957 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13958 m_errorMonitor->VerifyFound();
13959
13960 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13961 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13962 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13963}
13964
13965TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13966 TEST_DESCRIPTION(
13967 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13968
Tony Barbour1fa09702017-03-16 12:09:08 -060013969 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13971
13972 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13973
13974 VkDescriptorPoolSize descriptor_pool_type_count = {};
13975 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13976 descriptor_pool_type_count.descriptorCount = 1;
13977
13978 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13979 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13980 descriptor_pool_create_info.maxSets = 1;
13981 descriptor_pool_create_info.poolSizeCount = 1;
13982 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13983 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13984
13985 VkDescriptorPool descriptorset_pool;
13986 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13987
13988 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13989 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13990 descriptorset_layout_binding.descriptorCount = 1;
13991 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13992 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013993 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013994
13995 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13996 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13997 descriptorset_layout_create_info.bindingCount = 1;
13998 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13999
14000 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014001 ASSERT_VK_SUCCESS(
14002 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014003
14004 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14005 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14006 descriptorset_allocate_info.descriptorSetCount = 1;
14007 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14008 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14009 VkDescriptorSet descriptorset;
14010 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14011
14012 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14013
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014014 char const *vsSource =
14015 "#version 450\n"
14016 "\n"
14017 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14018 " mat4 mvp;\n"
14019 "} ubuf;\n"
14020 "out gl_PerVertex {\n"
14021 " vec4 gl_Position;\n"
14022 "};\n"
14023 "void main(){\n"
14024 " gl_Position = ubuf.mvp * vec4(1);\n"
14025 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014026
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014027 char const *fsSource =
14028 "#version 450\n"
14029 "\n"
14030 "layout(location = 0) out vec4 uFragColor;\n"
14031 "void main(){\n"
14032 " uFragColor = vec4(0,1,0,1);\n"
14033 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014034
14035 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14036 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14037
14038 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14039 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14040 pipeline_layout_create_info.setLayoutCount = 1;
14041 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14042
14043 VkPipelineLayout pipeline_layout;
14044 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14045
14046 VkPipelineObj pipe(m_device);
14047 pipe.AddColorAttachment();
14048 pipe.AddShader(&vs);
14049 pipe.AddShader(&fs);
14050
14051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14052 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14053 m_errorMonitor->VerifyFound();
14054
14055 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14056 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14057 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14058}
14059
14060TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014061 TEST_DESCRIPTION(
14062 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14063 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014064
Tony Barbour1fa09702017-03-16 12:09:08 -060014065 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014066 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14067
14068 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014069 "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 -060014070
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014071 char const *vsSource =
14072 "#version 450\n"
14073 "\n"
14074 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14075 "out gl_PerVertex {\n"
14076 " vec4 gl_Position;\n"
14077 "};\n"
14078 "void main(){\n"
14079 " gl_Position = vec4(consts.x);\n"
14080 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014081
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014082 char const *fsSource =
14083 "#version 450\n"
14084 "\n"
14085 "layout(location = 0) out vec4 uFragColor;\n"
14086 "void main(){\n"
14087 " uFragColor = vec4(0,1,0,1);\n"
14088 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014089
14090 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14091 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14092
14093 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14094 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14095
14096 // Set up a push constant range
14097 VkPushConstantRange push_constant_ranges = {};
14098 // Set to the wrong stage to challenge core_validation
14099 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14100 push_constant_ranges.size = 4;
14101
14102 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14103 pipeline_layout_create_info.pushConstantRangeCount = 1;
14104
14105 VkPipelineLayout pipeline_layout;
14106 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14107
14108 VkPipelineObj pipe(m_device);
14109 pipe.AddColorAttachment();
14110 pipe.AddShader(&vs);
14111 pipe.AddShader(&fs);
14112
14113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14114 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14115 m_errorMonitor->VerifyFound();
14116
14117 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14118}
14119
14120TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14121 TEST_DESCRIPTION(
14122 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14123
Tony Barbour1fa09702017-03-16 12:09:08 -060014124 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14126
14127 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014128 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014129
14130 // Some awkward steps are required to test with custom device features.
14131 std::vector<const char *> device_extension_names;
14132 auto features = m_device->phy().features();
14133 // Disable support for 64 bit floats
14134 features.shaderFloat64 = false;
14135 // The sacrificial device object
14136 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14137
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014138 char const *vsSource =
14139 "#version 450\n"
14140 "\n"
14141 "out gl_PerVertex {\n"
14142 " vec4 gl_Position;\n"
14143 "};\n"
14144 "void main(){\n"
14145 " gl_Position = vec4(1);\n"
14146 "}\n";
14147 char const *fsSource =
14148 "#version 450\n"
14149 "\n"
14150 "layout(location=0) out vec4 color;\n"
14151 "void main(){\n"
14152 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14153 " color = vec4(green);\n"
14154 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014155
14156 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14157 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14158
14159 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014160
14161 VkPipelineObj pipe(&test_device);
14162 pipe.AddColorAttachment();
14163 pipe.AddShader(&vs);
14164 pipe.AddShader(&fs);
14165
14166 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14167 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14168 VkPipelineLayout pipeline_layout;
14169 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14170
14171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14172 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14173 m_errorMonitor->VerifyFound();
14174
14175 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14176}
14177
Mark Lobodzinski20832822017-03-24 14:49:45 -060014178TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14179 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14180 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014181
Tony Barbour1fa09702017-03-16 12:09:08 -060014182 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14184
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014185 char const *vsSource =
14186 "#version 450\n"
14187 "\n"
14188 "out gl_PerVertex {\n"
14189 " vec4 gl_Position;\n"
14190 "};\n"
14191 "layout(xfb_buffer = 1) out;"
14192 "void main(){\n"
14193 " gl_Position = vec4(1);\n"
14194 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014195
Mark Lobodzinski20832822017-03-24 14:49:45 -060014196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014197
Mark Lobodzinski20832822017-03-24 14:49:45 -060014198 std::vector<unsigned int> spv;
14199 VkShaderModuleCreateInfo module_create_info;
14200 VkShaderModule shader_module;
14201 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14202 module_create_info.pNext = NULL;
14203 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14204 module_create_info.pCode = spv.data();
14205 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14206 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014207
Mark Lobodzinski20832822017-03-24 14:49:45 -060014208 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014209
Mark Lobodzinski20832822017-03-24 14:49:45 -060014210 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014211}
14212
Karl Schultz6addd812016-02-02 17:17:23 -070014213TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014214 TEST_DESCRIPTION(
14215 "Test that an error is produced for a fragment shader input "
14216 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014217
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014219
Tony Barbour1fa09702017-03-16 12:09:08 -060014220 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014222
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014223 char const *vsSource =
14224 "#version 450\n"
14225 "\n"
14226 "out gl_PerVertex {\n"
14227 " vec4 gl_Position;\n"
14228 "};\n"
14229 "void main(){\n"
14230 " gl_Position = vec4(1);\n"
14231 "}\n";
14232 char const *fsSource =
14233 "#version 450\n"
14234 "\n"
14235 "layout(location=0) in float x;\n"
14236 "layout(location=0) out vec4 color;\n"
14237 "void main(){\n"
14238 " color = vec4(x);\n"
14239 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014240
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014241 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14242 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014243
14244 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014245 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014246 pipe.AddShader(&vs);
14247 pipe.AddShader(&fs);
14248
Chris Forbes59cb88d2015-05-25 11:13:13 +120014249 VkDescriptorSetObj descriptorSet(m_device);
14250 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014251 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014252
Tony Barbour5781e8f2015-08-04 16:23:11 -060014253 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014254
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014255 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014256}
14257
Karl Schultz6addd812016-02-02 17:17:23 -070014258TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014259 TEST_DESCRIPTION(
14260 "Test that an error is produced for a fragment shader input "
14261 "within an interace block, which is not present in the outputs "
14262 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014264
Tony Barbour1fa09702017-03-16 12:09:08 -060014265 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014266 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14267
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014268 char const *vsSource =
14269 "#version 450\n"
14270 "\n"
14271 "out gl_PerVertex {\n"
14272 " vec4 gl_Position;\n"
14273 "};\n"
14274 "void main(){\n"
14275 " gl_Position = vec4(1);\n"
14276 "}\n";
14277 char const *fsSource =
14278 "#version 450\n"
14279 "\n"
14280 "in block { layout(location=0) float x; } ins;\n"
14281 "layout(location=0) out vec4 color;\n"
14282 "void main(){\n"
14283 " color = vec4(ins.x);\n"
14284 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014285
14286 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14287 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14288
14289 VkPipelineObj pipe(m_device);
14290 pipe.AddColorAttachment();
14291 pipe.AddShader(&vs);
14292 pipe.AddShader(&fs);
14293
14294 VkDescriptorSetObj descriptorSet(m_device);
14295 descriptorSet.AppendDummy();
14296 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14297
14298 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14299
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014300 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014301}
14302
Karl Schultz6addd812016-02-02 17:17:23 -070014303TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014304 TEST_DESCRIPTION(
14305 "Test that an error is produced for mismatched array sizes "
14306 "across the vertex->fragment shader interface");
14307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14308 "Type mismatch on location 0.0: 'ptr to "
14309 "output arr[2] of float32' vs 'ptr to "
14310 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014311
Tony Barbour1fa09702017-03-16 12:09:08 -060014312 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014313 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014315 char const *vsSource =
14316 "#version 450\n"
14317 "\n"
14318 "layout(location=0) out float x[2];\n"
14319 "out gl_PerVertex {\n"
14320 " vec4 gl_Position;\n"
14321 "};\n"
14322 "void main(){\n"
14323 " x[0] = 0; x[1] = 0;\n"
14324 " gl_Position = vec4(1);\n"
14325 "}\n";
14326 char const *fsSource =
14327 "#version 450\n"
14328 "\n"
14329 "layout(location=0) in float x[1];\n"
14330 "layout(location=0) out vec4 color;\n"
14331 "void main(){\n"
14332 " color = vec4(x[0]);\n"
14333 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014334
14335 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14336 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14337
14338 VkPipelineObj pipe(m_device);
14339 pipe.AddColorAttachment();
14340 pipe.AddShader(&vs);
14341 pipe.AddShader(&fs);
14342
14343 VkDescriptorSetObj descriptorSet(m_device);
14344 descriptorSet.AppendDummy();
14345 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14346
14347 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14348
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014349 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014350}
14351
Karl Schultz6addd812016-02-02 17:17:23 -070014352TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014353 TEST_DESCRIPTION(
14354 "Test that an error is produced for mismatched types across "
14355 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014357
Tony Barbour1fa09702017-03-16 12:09:08 -060014358 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014359 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014360
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014361 char const *vsSource =
14362 "#version 450\n"
14363 "\n"
14364 "layout(location=0) out int x;\n"
14365 "out gl_PerVertex {\n"
14366 " vec4 gl_Position;\n"
14367 "};\n"
14368 "void main(){\n"
14369 " x = 0;\n"
14370 " gl_Position = vec4(1);\n"
14371 "}\n";
14372 char const *fsSource =
14373 "#version 450\n"
14374 "\n"
14375 "layout(location=0) in float x;\n" /* VS writes int */
14376 "layout(location=0) out vec4 color;\n"
14377 "void main(){\n"
14378 " color = vec4(x);\n"
14379 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014380
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014381 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014383
14384 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014385 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014386 pipe.AddShader(&vs);
14387 pipe.AddShader(&fs);
14388
Chris Forbesb56af562015-05-25 11:13:17 +120014389 VkDescriptorSetObj descriptorSet(m_device);
14390 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014391 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014392
Tony Barbour5781e8f2015-08-04 16:23:11 -060014393 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014394
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014395 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014396}
14397
Karl Schultz6addd812016-02-02 17:17:23 -070014398TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014399 TEST_DESCRIPTION(
14400 "Test that an error is produced for mismatched types across "
14401 "the vertex->fragment shader interface, when the variable is contained within "
14402 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014404
Tony Barbour1fa09702017-03-16 12:09:08 -060014405 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14407
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014408 char const *vsSource =
14409 "#version 450\n"
14410 "\n"
14411 "out block { layout(location=0) int x; } outs;\n"
14412 "out gl_PerVertex {\n"
14413 " vec4 gl_Position;\n"
14414 "};\n"
14415 "void main(){\n"
14416 " outs.x = 0;\n"
14417 " gl_Position = vec4(1);\n"
14418 "}\n";
14419 char const *fsSource =
14420 "#version 450\n"
14421 "\n"
14422 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14423 "layout(location=0) out vec4 color;\n"
14424 "void main(){\n"
14425 " color = vec4(ins.x);\n"
14426 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014427
14428 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14429 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14430
14431 VkPipelineObj pipe(m_device);
14432 pipe.AddColorAttachment();
14433 pipe.AddShader(&vs);
14434 pipe.AddShader(&fs);
14435
14436 VkDescriptorSetObj descriptorSet(m_device);
14437 descriptorSet.AppendDummy();
14438 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14439
14440 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14441
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014442 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014443}
14444
14445TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014446 TEST_DESCRIPTION(
14447 "Test that an error is produced for location mismatches across "
14448 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14449 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014450 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 +130014451
Tony Barbour1fa09702017-03-16 12:09:08 -060014452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14454
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014455 char const *vsSource =
14456 "#version 450\n"
14457 "\n"
14458 "out block { layout(location=1) float x; } outs;\n"
14459 "out gl_PerVertex {\n"
14460 " vec4 gl_Position;\n"
14461 "};\n"
14462 "void main(){\n"
14463 " outs.x = 0;\n"
14464 " gl_Position = vec4(1);\n"
14465 "}\n";
14466 char const *fsSource =
14467 "#version 450\n"
14468 "\n"
14469 "in block { layout(location=0) float x; } ins;\n"
14470 "layout(location=0) out vec4 color;\n"
14471 "void main(){\n"
14472 " color = vec4(ins.x);\n"
14473 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014474
14475 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14476 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14477
14478 VkPipelineObj pipe(m_device);
14479 pipe.AddColorAttachment();
14480 pipe.AddShader(&vs);
14481 pipe.AddShader(&fs);
14482
14483 VkDescriptorSetObj descriptorSet(m_device);
14484 descriptorSet.AppendDummy();
14485 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14486
14487 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14488
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014489 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014490}
14491
14492TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014493 TEST_DESCRIPTION(
14494 "Test that an error is produced for component mismatches across the "
14495 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14496 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014497 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 +130014498
Tony Barbour1fa09702017-03-16 12:09:08 -060014499 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14501
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014502 char const *vsSource =
14503 "#version 450\n"
14504 "\n"
14505 "out block { layout(location=0, component=0) float x; } outs;\n"
14506 "out gl_PerVertex {\n"
14507 " vec4 gl_Position;\n"
14508 "};\n"
14509 "void main(){\n"
14510 " outs.x = 0;\n"
14511 " gl_Position = vec4(1);\n"
14512 "}\n";
14513 char const *fsSource =
14514 "#version 450\n"
14515 "\n"
14516 "in block { layout(location=0, component=1) float x; } ins;\n"
14517 "layout(location=0) out vec4 color;\n"
14518 "void main(){\n"
14519 " color = vec4(ins.x);\n"
14520 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014521
14522 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14523 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14524
14525 VkPipelineObj pipe(m_device);
14526 pipe.AddColorAttachment();
14527 pipe.AddShader(&vs);
14528 pipe.AddShader(&fs);
14529
14530 VkDescriptorSetObj descriptorSet(m_device);
14531 descriptorSet.AppendDummy();
14532 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14533
14534 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14535
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014536 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014537}
14538
Chris Forbes1f3b0152016-11-30 12:48:40 +130014539TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14540 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14541
Tony Barbour1fa09702017-03-16 12:09:08 -060014542 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14544
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014545 char const *vsSource =
14546 "#version 450\n"
14547 "layout(location=0) out mediump float x;\n"
14548 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14549 char const *fsSource =
14550 "#version 450\n"
14551 "layout(location=0) in highp float x;\n"
14552 "layout(location=0) out vec4 color;\n"
14553 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014554
14555 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14556 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14557
14558 VkPipelineObj pipe(m_device);
14559 pipe.AddColorAttachment();
14560 pipe.AddShader(&vs);
14561 pipe.AddShader(&fs);
14562
14563 VkDescriptorSetObj descriptorSet(m_device);
14564 descriptorSet.AppendDummy();
14565 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14566
14567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14568
14569 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14570
14571 m_errorMonitor->VerifyFound();
14572}
14573
Chris Forbes870a39e2016-11-30 12:55:56 +130014574TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14575 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14576
Tony Barbour1fa09702017-03-16 12:09:08 -060014577 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14579
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014580 char const *vsSource =
14581 "#version 450\n"
14582 "out block { layout(location=0) mediump float x; };\n"
14583 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14584 char const *fsSource =
14585 "#version 450\n"
14586 "in block { layout(location=0) highp float x; };\n"
14587 "layout(location=0) out vec4 color;\n"
14588 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014589
14590 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14591 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14592
14593 VkPipelineObj pipe(m_device);
14594 pipe.AddColorAttachment();
14595 pipe.AddShader(&vs);
14596 pipe.AddShader(&fs);
14597
14598 VkDescriptorSetObj descriptorSet(m_device);
14599 descriptorSet.AppendDummy();
14600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14601
14602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14603
14604 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14605
14606 m_errorMonitor->VerifyFound();
14607}
14608
Karl Schultz6addd812016-02-02 17:17:23 -070014609TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014610 TEST_DESCRIPTION(
14611 "Test that a warning is produced for a vertex attribute which is "
14612 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014614
Tony Barbour1fa09702017-03-16 12:09:08 -060014615 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014616 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014617
14618 VkVertexInputBindingDescription input_binding;
14619 memset(&input_binding, 0, sizeof(input_binding));
14620
14621 VkVertexInputAttributeDescription input_attrib;
14622 memset(&input_attrib, 0, sizeof(input_attrib));
14623 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14624
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014625 char const *vsSource =
14626 "#version 450\n"
14627 "\n"
14628 "out gl_PerVertex {\n"
14629 " vec4 gl_Position;\n"
14630 "};\n"
14631 "void main(){\n"
14632 " gl_Position = vec4(1);\n"
14633 "}\n";
14634 char const *fsSource =
14635 "#version 450\n"
14636 "\n"
14637 "layout(location=0) out vec4 color;\n"
14638 "void main(){\n"
14639 " color = vec4(1);\n"
14640 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014641
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14643 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014644
14645 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014646 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014647 pipe.AddShader(&vs);
14648 pipe.AddShader(&fs);
14649
14650 pipe.AddVertexInputBindings(&input_binding, 1);
14651 pipe.AddVertexInputAttribs(&input_attrib, 1);
14652
Chris Forbesde136e02015-05-25 11:13:28 +120014653 VkDescriptorSetObj descriptorSet(m_device);
14654 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014655 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014656
Tony Barbour5781e8f2015-08-04 16:23:11 -060014657 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014658
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014659 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014660}
14661
Karl Schultz6addd812016-02-02 17:17:23 -070014662TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014663 TEST_DESCRIPTION(
14664 "Test that a warning is produced for a location mismatch on "
14665 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014667
Tony Barbour1fa09702017-03-16 12:09:08 -060014668 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14670
14671 VkVertexInputBindingDescription input_binding;
14672 memset(&input_binding, 0, sizeof(input_binding));
14673
14674 VkVertexInputAttributeDescription input_attrib;
14675 memset(&input_attrib, 0, sizeof(input_attrib));
14676 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14677
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014678 char const *vsSource =
14679 "#version 450\n"
14680 "\n"
14681 "layout(location=1) in float x;\n"
14682 "out gl_PerVertex {\n"
14683 " vec4 gl_Position;\n"
14684 "};\n"
14685 "void main(){\n"
14686 " gl_Position = vec4(x);\n"
14687 "}\n";
14688 char const *fsSource =
14689 "#version 450\n"
14690 "\n"
14691 "layout(location=0) out vec4 color;\n"
14692 "void main(){\n"
14693 " color = vec4(1);\n"
14694 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014695
14696 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14697 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14698
14699 VkPipelineObj pipe(m_device);
14700 pipe.AddColorAttachment();
14701 pipe.AddShader(&vs);
14702 pipe.AddShader(&fs);
14703
14704 pipe.AddVertexInputBindings(&input_binding, 1);
14705 pipe.AddVertexInputAttribs(&input_attrib, 1);
14706
14707 VkDescriptorSetObj descriptorSet(m_device);
14708 descriptorSet.AppendDummy();
14709 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14710
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014711 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014712 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14713
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014714 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014715}
14716
Karl Schultz6addd812016-02-02 17:17:23 -070014717TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014718 TEST_DESCRIPTION(
14719 "Test that an error is produced for a vertex shader input which is not "
14720 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14722 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014723
Tony Barbour1fa09702017-03-16 12:09:08 -060014724 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014725 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014726
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014727 char const *vsSource =
14728 "#version 450\n"
14729 "\n"
14730 "layout(location=0) in vec4 x;\n" /* not provided */
14731 "out gl_PerVertex {\n"
14732 " vec4 gl_Position;\n"
14733 "};\n"
14734 "void main(){\n"
14735 " gl_Position = x;\n"
14736 "}\n";
14737 char const *fsSource =
14738 "#version 450\n"
14739 "\n"
14740 "layout(location=0) out vec4 color;\n"
14741 "void main(){\n"
14742 " color = vec4(1);\n"
14743 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014744
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014745 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14746 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014747
14748 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014749 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014750 pipe.AddShader(&vs);
14751 pipe.AddShader(&fs);
14752
Chris Forbes62e8e502015-05-25 11:13:29 +120014753 VkDescriptorSetObj descriptorSet(m_device);
14754 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014755 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014756
Tony Barbour5781e8f2015-08-04 16:23:11 -060014757 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014758
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014759 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014760}
14761
Karl Schultz6addd812016-02-02 17:17:23 -070014762TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014763 TEST_DESCRIPTION(
14764 "Test that an error is produced for a mismatch between the "
14765 "fundamental type (float/int/uint) of an attribute and the "
14766 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014767 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 -060014768
Tony Barbour1fa09702017-03-16 12:09:08 -060014769 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014770 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014771
14772 VkVertexInputBindingDescription input_binding;
14773 memset(&input_binding, 0, sizeof(input_binding));
14774
14775 VkVertexInputAttributeDescription input_attrib;
14776 memset(&input_attrib, 0, sizeof(input_attrib));
14777 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14778
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014779 char const *vsSource =
14780 "#version 450\n"
14781 "\n"
14782 "layout(location=0) in int x;\n" /* attrib provided float */
14783 "out gl_PerVertex {\n"
14784 " vec4 gl_Position;\n"
14785 "};\n"
14786 "void main(){\n"
14787 " gl_Position = vec4(x);\n"
14788 "}\n";
14789 char const *fsSource =
14790 "#version 450\n"
14791 "\n"
14792 "layout(location=0) out vec4 color;\n"
14793 "void main(){\n"
14794 " color = vec4(1);\n"
14795 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014796
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014797 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14798 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014799
14800 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014801 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014802 pipe.AddShader(&vs);
14803 pipe.AddShader(&fs);
14804
14805 pipe.AddVertexInputBindings(&input_binding, 1);
14806 pipe.AddVertexInputAttribs(&input_attrib, 1);
14807
Chris Forbesc97d98e2015-05-25 11:13:31 +120014808 VkDescriptorSetObj descriptorSet(m_device);
14809 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014810 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014811
Tony Barbour5781e8f2015-08-04 16:23:11 -060014812 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014813
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014814 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014815}
14816
Chris Forbesc68b43c2016-04-06 11:18:47 +120014817TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014818 TEST_DESCRIPTION(
14819 "Test that an error is produced for a pipeline containing multiple "
14820 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14822 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014823
Tony Barbour1fa09702017-03-16 12:09:08 -060014824 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14826
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014827 char const *vsSource =
14828 "#version 450\n"
14829 "\n"
14830 "out gl_PerVertex {\n"
14831 " vec4 gl_Position;\n"
14832 "};\n"
14833 "void main(){\n"
14834 " gl_Position = vec4(1);\n"
14835 "}\n";
14836 char const *fsSource =
14837 "#version 450\n"
14838 "\n"
14839 "layout(location=0) out vec4 color;\n"
14840 "void main(){\n"
14841 " color = vec4(1);\n"
14842 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014843
14844 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14845 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14846
14847 VkPipelineObj pipe(m_device);
14848 pipe.AddColorAttachment();
14849 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014850 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014851 pipe.AddShader(&fs);
14852
14853 VkDescriptorSetObj descriptorSet(m_device);
14854 descriptorSet.AppendDummy();
14855 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14856
14857 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14858
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014859 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014860}
14861
Chris Forbes82ff92a2016-09-09 10:50:24 +120014862TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014864
Tony Barbour1fa09702017-03-16 12:09:08 -060014865 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14867
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014868 char const *vsSource =
14869 "#version 450\n"
14870 "out gl_PerVertex {\n"
14871 " vec4 gl_Position;\n"
14872 "};\n"
14873 "void main(){\n"
14874 " gl_Position = vec4(0);\n"
14875 "}\n";
14876 char const *fsSource =
14877 "#version 450\n"
14878 "\n"
14879 "layout(location=0) out vec4 color;\n"
14880 "void main(){\n"
14881 " color = vec4(1);\n"
14882 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014883
14884 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14885 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14886
14887 VkPipelineObj pipe(m_device);
14888 pipe.AddColorAttachment();
14889 pipe.AddShader(&vs);
14890 pipe.AddShader(&fs);
14891
14892 VkDescriptorSetObj descriptorSet(m_device);
14893 descriptorSet.AppendDummy();
14894 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14895
14896 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14897
14898 m_errorMonitor->VerifyFound();
14899}
14900
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014901TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14903 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14904 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014905
Tony Barbour1fa09702017-03-16 12:09:08 -060014906 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014907 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14908
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014909 char const *vsSource =
14910 "#version 450\n"
14911 "void main(){ gl_Position = vec4(0); }\n";
14912 char const *fsSource =
14913 "#version 450\n"
14914 "\n"
14915 "layout(location=0) out vec4 color;\n"
14916 "void main(){\n"
14917 " color = vec4(1);\n"
14918 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014919
14920 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14921 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14922
14923 VkPipelineObj pipe(m_device);
14924 pipe.AddColorAttachment();
14925 pipe.AddShader(&vs);
14926 pipe.AddShader(&fs);
14927
14928 VkDescriptorSetObj descriptorSet(m_device);
14929 descriptorSet.AppendDummy();
14930 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14931
14932 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014933 {
14934 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14935 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14936 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014937 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014938 {
14939 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14940 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14941 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014942 },
14943 };
14944 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014945 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014946 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014947 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14948 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014949 VkRenderPass rp;
14950 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14951 ASSERT_VK_SUCCESS(err);
14952
14953 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14954
14955 m_errorMonitor->VerifyFound();
14956
14957 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14958}
14959
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014960TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014961 TEST_DESCRIPTION(
14962 "Test that an error is produced for a variable output from "
14963 "the TCS without the patch decoration, but consumed in the TES "
14964 "with the decoration.");
14965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14966 "is per-vertex in tessellation control shader stage "
14967 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014968
Tony Barbour1fa09702017-03-16 12:09:08 -060014969 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14971
Chris Forbesc1e852d2016-04-04 19:26:42 +120014972 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014973 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014974 return;
14975 }
14976
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014977 char const *vsSource =
14978 "#version 450\n"
14979 "void main(){}\n";
14980 char const *tcsSource =
14981 "#version 450\n"
14982 "layout(location=0) out int x[];\n"
14983 "layout(vertices=3) out;\n"
14984 "void main(){\n"
14985 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14986 " gl_TessLevelInner[0] = 1;\n"
14987 " x[gl_InvocationID] = gl_InvocationID;\n"
14988 "}\n";
14989 char const *tesSource =
14990 "#version 450\n"
14991 "layout(triangles, equal_spacing, cw) in;\n"
14992 "layout(location=0) patch in int x;\n"
14993 "out gl_PerVertex { vec4 gl_Position; };\n"
14994 "void main(){\n"
14995 " gl_Position.xyz = gl_TessCoord;\n"
14996 " gl_Position.w = x;\n"
14997 "}\n";
14998 char const *fsSource =
14999 "#version 450\n"
15000 "layout(location=0) out vec4 color;\n"
15001 "void main(){\n"
15002 " color = vec4(1);\n"
15003 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015004
15005 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15006 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15007 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15008 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15009
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015010 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15011 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015012
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015013 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015014
15015 VkPipelineObj pipe(m_device);
15016 pipe.SetInputAssembly(&iasci);
15017 pipe.SetTessellation(&tsci);
15018 pipe.AddColorAttachment();
15019 pipe.AddShader(&vs);
15020 pipe.AddShader(&tcs);
15021 pipe.AddShader(&tes);
15022 pipe.AddShader(&fs);
15023
15024 VkDescriptorSetObj descriptorSet(m_device);
15025 descriptorSet.AppendDummy();
15026 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15027
15028 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15029
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015030 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015031}
15032
Karl Schultz6addd812016-02-02 17:17:23 -070015033TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015034 TEST_DESCRIPTION(
15035 "Test that an error is produced for a vertex attribute setup where multiple "
15036 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15038 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015039
Tony Barbour1fa09702017-03-16 12:09:08 -060015040 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015041 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015042
15043 /* Two binding descriptions for binding 0 */
15044 VkVertexInputBindingDescription input_bindings[2];
15045 memset(input_bindings, 0, sizeof(input_bindings));
15046
15047 VkVertexInputAttributeDescription input_attrib;
15048 memset(&input_attrib, 0, sizeof(input_attrib));
15049 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15050
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015051 char const *vsSource =
15052 "#version 450\n"
15053 "\n"
15054 "layout(location=0) in float x;\n" /* attrib provided float */
15055 "out gl_PerVertex {\n"
15056 " vec4 gl_Position;\n"
15057 "};\n"
15058 "void main(){\n"
15059 " gl_Position = vec4(x);\n"
15060 "}\n";
15061 char const *fsSource =
15062 "#version 450\n"
15063 "\n"
15064 "layout(location=0) out vec4 color;\n"
15065 "void main(){\n"
15066 " color = vec4(1);\n"
15067 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015068
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015069 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15070 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015071
15072 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015073 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015074 pipe.AddShader(&vs);
15075 pipe.AddShader(&fs);
15076
15077 pipe.AddVertexInputBindings(input_bindings, 2);
15078 pipe.AddVertexInputAttribs(&input_attrib, 1);
15079
Chris Forbes280ba2c2015-06-12 11:16:41 +120015080 VkDescriptorSetObj descriptorSet(m_device);
15081 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015082 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015083
Tony Barbour5781e8f2015-08-04 16:23:11 -060015084 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015085
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015086 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015087}
Chris Forbes8f68b562015-05-25 11:13:32 +120015088
Karl Schultz6addd812016-02-02 17:17:23 -070015089TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015090 TEST_DESCRIPTION(
15091 "Test that an error is produced for a fragment shader which does not "
15092 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015094
Tony Barbour1fa09702017-03-16 12:09:08 -060015095 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015096
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015097 char const *vsSource =
15098 "#version 450\n"
15099 "\n"
15100 "out gl_PerVertex {\n"
15101 " vec4 gl_Position;\n"
15102 "};\n"
15103 "void main(){\n"
15104 " gl_Position = vec4(1);\n"
15105 "}\n";
15106 char const *fsSource =
15107 "#version 450\n"
15108 "\n"
15109 "void main(){\n"
15110 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015111
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015112 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15113 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015114
15115 VkPipelineObj pipe(m_device);
15116 pipe.AddShader(&vs);
15117 pipe.AddShader(&fs);
15118
Chia-I Wu08accc62015-07-07 11:50:03 +080015119 /* set up CB 0, not written */
15120 pipe.AddColorAttachment();
15121 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015122
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015123 VkDescriptorSetObj descriptorSet(m_device);
15124 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015125 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015126
Tony Barbour5781e8f2015-08-04 16:23:11 -060015127 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015128
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015129 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015130}
15131
Karl Schultz6addd812016-02-02 17:17:23 -070015132TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015133 TEST_DESCRIPTION(
15134 "Test that a warning is produced for a fragment shader which provides a spurious "
15135 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015137 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015138
Tony Barbour1fa09702017-03-16 12:09:08 -060015139 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015140
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015141 char const *vsSource =
15142 "#version 450\n"
15143 "\n"
15144 "out gl_PerVertex {\n"
15145 " vec4 gl_Position;\n"
15146 "};\n"
15147 "void main(){\n"
15148 " gl_Position = vec4(1);\n"
15149 "}\n";
15150 char const *fsSource =
15151 "#version 450\n"
15152 "\n"
15153 "layout(location=0) out vec4 x;\n"
15154 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15155 "void main(){\n"
15156 " x = vec4(1);\n"
15157 " y = vec4(1);\n"
15158 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015159
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015160 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15161 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015162
15163 VkPipelineObj pipe(m_device);
15164 pipe.AddShader(&vs);
15165 pipe.AddShader(&fs);
15166
Chia-I Wu08accc62015-07-07 11:50:03 +080015167 /* set up CB 0, not written */
15168 pipe.AddColorAttachment();
15169 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015170 /* FS writes CB 1, but we don't configure it */
15171
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015172 VkDescriptorSetObj descriptorSet(m_device);
15173 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015174 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015175
Tony Barbour5781e8f2015-08-04 16:23:11 -060015176 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015177
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015178 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015179}
15180
Karl Schultz6addd812016-02-02 17:17:23 -070015181TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015182 TEST_DESCRIPTION(
15183 "Test that an error is produced for a mismatch between the fundamental "
15184 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015186
Tony Barbour1fa09702017-03-16 12:09:08 -060015187 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015188
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015189 char const *vsSource =
15190 "#version 450\n"
15191 "\n"
15192 "out gl_PerVertex {\n"
15193 " vec4 gl_Position;\n"
15194 "};\n"
15195 "void main(){\n"
15196 " gl_Position = vec4(1);\n"
15197 "}\n";
15198 char const *fsSource =
15199 "#version 450\n"
15200 "\n"
15201 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15202 "void main(){\n"
15203 " x = ivec4(1);\n"
15204 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015205
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015206 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15207 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015208
15209 VkPipelineObj pipe(m_device);
15210 pipe.AddShader(&vs);
15211 pipe.AddShader(&fs);
15212
Chia-I Wu08accc62015-07-07 11:50:03 +080015213 /* set up CB 0; type is UNORM by default */
15214 pipe.AddColorAttachment();
15215 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015216
Chris Forbesa36d69e2015-05-25 11:13:44 +120015217 VkDescriptorSetObj descriptorSet(m_device);
15218 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015219 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015220
Tony Barbour5781e8f2015-08-04 16:23:11 -060015221 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015222
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015223 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015224}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015225
Karl Schultz6addd812016-02-02 17:17:23 -070015226TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015227 TEST_DESCRIPTION(
15228 "Test that an error is produced for a shader consuming a uniform "
15229 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015231
Tony Barbour1fa09702017-03-16 12:09:08 -060015232 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015233
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015234 char const *vsSource =
15235 "#version 450\n"
15236 "\n"
15237 "out gl_PerVertex {\n"
15238 " vec4 gl_Position;\n"
15239 "};\n"
15240 "void main(){\n"
15241 " gl_Position = vec4(1);\n"
15242 "}\n";
15243 char const *fsSource =
15244 "#version 450\n"
15245 "\n"
15246 "layout(location=0) out vec4 x;\n"
15247 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15248 "void main(){\n"
15249 " x = vec4(bar.y);\n"
15250 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015251
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015252 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15253 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015254
Chris Forbes556c76c2015-08-14 12:04:59 +120015255 VkPipelineObj pipe(m_device);
15256 pipe.AddShader(&vs);
15257 pipe.AddShader(&fs);
15258
15259 /* set up CB 0; type is UNORM by default */
15260 pipe.AddColorAttachment();
15261 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15262
15263 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015264 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015265
15266 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15267
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015268 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015269}
15270
Chris Forbes5c59e902016-02-26 16:56:09 +130015271TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015272 TEST_DESCRIPTION(
15273 "Test that an error is produced for a shader consuming push constants "
15274 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015276
Tony Barbour1fa09702017-03-16 12:09:08 -060015277 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015278
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015279 char const *vsSource =
15280 "#version 450\n"
15281 "\n"
15282 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15283 "out gl_PerVertex {\n"
15284 " vec4 gl_Position;\n"
15285 "};\n"
15286 "void main(){\n"
15287 " gl_Position = vec4(consts.x);\n"
15288 "}\n";
15289 char const *fsSource =
15290 "#version 450\n"
15291 "\n"
15292 "layout(location=0) out vec4 x;\n"
15293 "void main(){\n"
15294 " x = vec4(1);\n"
15295 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015296
15297 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15298 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15299
15300 VkPipelineObj pipe(m_device);
15301 pipe.AddShader(&vs);
15302 pipe.AddShader(&fs);
15303
15304 /* set up CB 0; type is UNORM by default */
15305 pipe.AddColorAttachment();
15306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15307
15308 VkDescriptorSetObj descriptorSet(m_device);
15309 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15310
15311 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15312
15313 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015314 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015315}
15316
Chris Forbes3fb17902016-08-22 14:57:55 +120015317TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015318 TEST_DESCRIPTION(
15319 "Test that an error is produced for a shader consuming an input attachment "
15320 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15322 "consumes input attachment index 0 but not provided in subpass");
15323
Tony Barbour1fa09702017-03-16 12:09:08 -060015324 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015325
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015326 char const *vsSource =
15327 "#version 450\n"
15328 "\n"
15329 "out gl_PerVertex {\n"
15330 " vec4 gl_Position;\n"
15331 "};\n"
15332 "void main(){\n"
15333 " gl_Position = vec4(1);\n"
15334 "}\n";
15335 char const *fsSource =
15336 "#version 450\n"
15337 "\n"
15338 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15339 "layout(location=0) out vec4 color;\n"
15340 "void main() {\n"
15341 " color = subpassLoad(x);\n"
15342 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015343
15344 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15345 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15346
15347 VkPipelineObj pipe(m_device);
15348 pipe.AddShader(&vs);
15349 pipe.AddShader(&fs);
15350 pipe.AddColorAttachment();
15351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15352
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015353 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15354 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015355 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015356 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015357 ASSERT_VK_SUCCESS(err);
15358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015359 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015360 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015361 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015362 ASSERT_VK_SUCCESS(err);
15363
15364 // error here.
15365 pipe.CreateVKPipeline(pl, renderPass());
15366
15367 m_errorMonitor->VerifyFound();
15368
15369 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15370 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15371}
15372
Chris Forbes5a9a0472016-08-22 16:02:09 +120015373TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015374 TEST_DESCRIPTION(
15375 "Test that an error is produced for a shader consuming an input attachment "
15376 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15378 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15379
Tony Barbour1fa09702017-03-16 12:09:08 -060015380 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015381
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015382 char const *vsSource =
15383 "#version 450\n"
15384 "\n"
15385 "out gl_PerVertex {\n"
15386 " vec4 gl_Position;\n"
15387 "};\n"
15388 "void main(){\n"
15389 " gl_Position = vec4(1);\n"
15390 "}\n";
15391 char const *fsSource =
15392 "#version 450\n"
15393 "\n"
15394 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15395 "layout(location=0) out vec4 color;\n"
15396 "void main() {\n"
15397 " color = subpassLoad(x);\n"
15398 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015399
15400 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15401 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15402
15403 VkPipelineObj pipe(m_device);
15404 pipe.AddShader(&vs);
15405 pipe.AddShader(&fs);
15406 pipe.AddColorAttachment();
15407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15408
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015409 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15410 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015411 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015412 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015413 ASSERT_VK_SUCCESS(err);
15414
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015415 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015416 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015417 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015418 ASSERT_VK_SUCCESS(err);
15419
15420 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015421 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15422 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15423 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15424 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15425 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 +120015426 };
15427 VkAttachmentReference color = {
15428 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15429 };
15430 VkAttachmentReference input = {
15431 1, VK_IMAGE_LAYOUT_GENERAL,
15432 };
15433
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015434 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015435
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015436 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015437 VkRenderPass rp;
15438 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15439 ASSERT_VK_SUCCESS(err);
15440
15441 // error here.
15442 pipe.CreateVKPipeline(pl, rp);
15443
15444 m_errorMonitor->VerifyFound();
15445
15446 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15447 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15448 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15449}
15450
Chris Forbes541f7b02016-08-22 15:30:27 +120015451TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015452 TEST_DESCRIPTION(
15453 "Test that an error is produced for a shader consuming an input attachment "
15454 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015456 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015457
Tony Barbour1fa09702017-03-16 12:09:08 -060015458 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015459
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015460 char const *vsSource =
15461 "#version 450\n"
15462 "\n"
15463 "out gl_PerVertex {\n"
15464 " vec4 gl_Position;\n"
15465 "};\n"
15466 "void main(){\n"
15467 " gl_Position = vec4(1);\n"
15468 "}\n";
15469 char const *fsSource =
15470 "#version 450\n"
15471 "\n"
15472 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15473 "layout(location=0) out vec4 color;\n"
15474 "void main() {\n"
15475 " color = subpassLoad(xs[0]);\n"
15476 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015477
15478 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15479 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15480
15481 VkPipelineObj pipe(m_device);
15482 pipe.AddShader(&vs);
15483 pipe.AddShader(&fs);
15484 pipe.AddColorAttachment();
15485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15486
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015487 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15488 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015489 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015490 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015491 ASSERT_VK_SUCCESS(err);
15492
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015493 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015494 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015495 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015496 ASSERT_VK_SUCCESS(err);
15497
15498 // error here.
15499 pipe.CreateVKPipeline(pl, renderPass());
15500
15501 m_errorMonitor->VerifyFound();
15502
15503 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15504 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15505}
15506
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015507TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015508 TEST_DESCRIPTION(
15509 "Test that an error is produced for a compute pipeline consuming a "
15510 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015512
Tony Barbour1fa09702017-03-16 12:09:08 -060015513 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015514
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015515 char const *csSource =
15516 "#version 450\n"
15517 "\n"
15518 "layout(local_size_x=1) in;\n"
15519 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15520 "void main(){\n"
15521 " x = vec4(1);\n"
15522 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015523
15524 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15525
15526 VkDescriptorSetObj descriptorSet(m_device);
15527 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15528
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015529 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15530 nullptr,
15531 0,
15532 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15533 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15534 descriptorSet.GetPipelineLayout(),
15535 VK_NULL_HANDLE,
15536 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015537
15538 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015539 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015540
15541 m_errorMonitor->VerifyFound();
15542
15543 if (err == VK_SUCCESS) {
15544 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15545 }
15546}
15547
Chris Forbes22a9b092016-07-19 14:34:05 +120015548TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015549 TEST_DESCRIPTION(
15550 "Test that an error is produced for a pipeline consuming a "
15551 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15553 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015554
Tony Barbour1fa09702017-03-16 12:09:08 -060015555 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015556
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015557 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15558 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015559 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015560 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015561 ASSERT_VK_SUCCESS(err);
15562
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015563 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015564 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015565 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015566 ASSERT_VK_SUCCESS(err);
15567
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015568 char const *csSource =
15569 "#version 450\n"
15570 "\n"
15571 "layout(local_size_x=1) in;\n"
15572 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15573 "void main() {\n"
15574 " x.x = 1.0f;\n"
15575 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015576 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15577
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015578 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15579 nullptr,
15580 0,
15581 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15582 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15583 pl,
15584 VK_NULL_HANDLE,
15585 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015586
15587 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015588 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015589
15590 m_errorMonitor->VerifyFound();
15591
15592 if (err == VK_SUCCESS) {
15593 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15594 }
15595
15596 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15597 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15598}
15599
Chris Forbes50020592016-07-27 13:52:41 +120015600TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015601 TEST_DESCRIPTION(
15602 "Test that an error is produced when an image view type "
15603 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015604
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015605 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 +120015606
Tony Barbour1fa09702017-03-16 12:09:08 -060015607 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15609
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015610 char const *vsSource =
15611 "#version 450\n"
15612 "\n"
15613 "out gl_PerVertex { vec4 gl_Position; };\n"
15614 "void main() { gl_Position = vec4(0); }\n";
15615 char const *fsSource =
15616 "#version 450\n"
15617 "\n"
15618 "layout(set=0, binding=0) uniform sampler3D s;\n"
15619 "layout(location=0) out vec4 color;\n"
15620 "void main() {\n"
15621 " color = texture(s, vec3(0));\n"
15622 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015623 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15624 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15625
15626 VkPipelineObj pipe(m_device);
15627 pipe.AddShader(&vs);
15628 pipe.AddShader(&fs);
15629 pipe.AddColorAttachment();
15630
15631 VkTextureObj texture(m_device, nullptr);
15632 VkSamplerObj sampler(m_device);
15633
15634 VkDescriptorSetObj descriptorSet(m_device);
15635 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15636 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15637
15638 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15639 ASSERT_VK_SUCCESS(err);
15640
Tony Barbour552f6c02016-12-21 14:34:07 -070015641 m_commandBuffer->BeginCommandBuffer();
15642 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015643
15644 m_commandBuffer->BindPipeline(pipe);
15645 m_commandBuffer->BindDescriptorSet(descriptorSet);
15646
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015647 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015648 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015649 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015650 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15651
15652 // error produced here.
15653 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15654
15655 m_errorMonitor->VerifyFound();
15656
Tony Barbour552f6c02016-12-21 14:34:07 -070015657 m_commandBuffer->EndRenderPass();
15658 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015659}
15660
Chris Forbes5533bfc2016-07-27 14:12:34 +120015661TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015662 TEST_DESCRIPTION(
15663 "Test that an error is produced when a multisampled images "
15664 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015665
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015667
Tony Barbour1fa09702017-03-16 12:09:08 -060015668 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15670
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015671 char const *vsSource =
15672 "#version 450\n"
15673 "\n"
15674 "out gl_PerVertex { vec4 gl_Position; };\n"
15675 "void main() { gl_Position = vec4(0); }\n";
15676 char const *fsSource =
15677 "#version 450\n"
15678 "\n"
15679 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15680 "layout(location=0) out vec4 color;\n"
15681 "void main() {\n"
15682 " color = texelFetch(s, ivec2(0), 0);\n"
15683 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015684 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15685 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15686
15687 VkPipelineObj pipe(m_device);
15688 pipe.AddShader(&vs);
15689 pipe.AddShader(&fs);
15690 pipe.AddColorAttachment();
15691
15692 VkTextureObj texture(m_device, nullptr);
15693 VkSamplerObj sampler(m_device);
15694
15695 VkDescriptorSetObj descriptorSet(m_device);
15696 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15697 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15698
15699 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15700 ASSERT_VK_SUCCESS(err);
15701
Tony Barbour552f6c02016-12-21 14:34:07 -070015702 m_commandBuffer->BeginCommandBuffer();
15703 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015704
15705 m_commandBuffer->BindPipeline(pipe);
15706 m_commandBuffer->BindDescriptorSet(descriptorSet);
15707
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015708 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015709 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015710 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015711 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15712
15713 // error produced here.
15714 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15715
15716 m_errorMonitor->VerifyFound();
15717
Tony Barbour552f6c02016-12-21 14:34:07 -070015718 m_commandBuffer->EndRenderPass();
15719 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015720}
15721
Mark Youngc48c4c12016-04-11 14:26:49 -060015722TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015724
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015725 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15726 {
15727 VkFormatProperties properties;
15728 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15729 if (properties.optimalTilingFeatures == 0) {
15730 printf(" Image format not supported; skipped.\n");
15731 return;
15732 }
15733 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015734
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015735 VkImageCreateInfo info = {};
15736 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15737 info.pNext = NULL;
15738 info.imageType = VK_IMAGE_TYPE_2D;
15739 info.format = format;
15740 info.extent.height = 32;
15741 info.extent.depth = 1;
15742 info.mipLevels = 1;
15743 info.arrayLayers = 1;
15744 info.samples = VK_SAMPLE_COUNT_1_BIT;
15745 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15746 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15747 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015748
15749 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015750 {
15751 VkImageFormatProperties properties;
15752 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15753 info.tiling, info.usage, info.flags, &properties);
15754 ASSERT_VK_SUCCESS(result);
15755 info.extent.width = properties.maxExtent.width + 1;
15756 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015757
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015758 VkImage image;
15759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15760 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015761 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015762}
15763
Mark Youngc48c4c12016-04-11 14:26:49 -060015764TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015765 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015766
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015767 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15768 {
15769 VkFormatProperties properties;
15770 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15771 if (properties.optimalTilingFeatures == 0) {
15772 printf(" Image format not supported; skipped.\n");
15773 return;
15774 }
15775 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015776
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015777 VkImageCreateInfo info = {};
15778 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15779 info.pNext = NULL;
15780 info.imageType = VK_IMAGE_TYPE_2D;
15781 info.format = format;
15782 info.extent.height = 32;
15783 info.extent.depth = 1;
15784 info.mipLevels = 1;
15785 info.arrayLayers = 1;
15786 info.samples = VK_SAMPLE_COUNT_1_BIT;
15787 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15788 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15789 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015790
15791 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015792 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015793
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015794 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015796 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15797 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015798 m_errorMonitor->VerifyFound();
15799}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015800
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015801TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015802 TEST_DESCRIPTION(
15803 "Create a render pass with an attachment description "
15804 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015805
Tony Barbour1fa09702017-03-16 12:09:08 -060015806 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15808
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015810
15811 VkAttachmentReference color_attach = {};
15812 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15813 color_attach.attachment = 0;
15814 VkSubpassDescription subpass = {};
15815 subpass.colorAttachmentCount = 1;
15816 subpass.pColorAttachments = &color_attach;
15817
15818 VkRenderPassCreateInfo rpci = {};
15819 rpci.subpassCount = 1;
15820 rpci.pSubpasses = &subpass;
15821 rpci.attachmentCount = 1;
15822 VkAttachmentDescription attach_desc = {};
15823 attach_desc.format = VK_FORMAT_UNDEFINED;
15824 rpci.pAttachments = &attach_desc;
15825 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15826 VkRenderPass rp;
15827 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15828
15829 m_errorMonitor->VerifyFound();
15830
15831 if (result == VK_SUCCESS) {
15832 vkDestroyRenderPass(m_device->device(), rp, NULL);
15833 }
15834}
15835
Karl Schultz6addd812016-02-02 17:17:23 -070015836TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015837 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015838
Mike Stroyana3082432015-09-25 13:39:21 -060015839 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015840 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15841 const int32_t tex_width = 32;
15842 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015843
15844 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015845 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15846 image_create_info.pNext = NULL;
15847 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15848 image_create_info.format = tex_format;
15849 image_create_info.extent.width = tex_width;
15850 image_create_info.extent.height = tex_height;
15851 image_create_info.extent.depth = 1;
15852 image_create_info.mipLevels = 1;
15853 image_create_info.arrayLayers = 1;
15854 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15855 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15856 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15857 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015858
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015859 VkImage image;
15860 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015861 ASSERT_VK_SUCCESS(err);
15862
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015863 VkMemoryRequirements requirements;
15864 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15865
15866 VkMemoryAllocateInfo alloc_info{};
15867 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15868 alloc_info.pNext = NULL;
15869 alloc_info.memoryTypeIndex = 0;
15870 alloc_info.allocationSize = requirements.size;
15871 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15872 ASSERT_TRUE(pass);
15873
15874 VkDeviceMemory memory;
15875 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15876 ASSERT_VK_SUCCESS(err);
15877
15878 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15879
Tobin Ehliscde08892015-09-22 10:11:37 -060015880 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015881 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015882 image_view_create_info.image = image;
15883 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15884 image_view_create_info.format = tex_format;
15885 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015886 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015887 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015888 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015889
15890 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015892 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015893 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015894
15895 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015896 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015897}
Mike Stroyana3082432015-09-25 13:39:21 -060015898
Mark Youngd339ba32016-05-30 13:28:35 -060015899TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15900 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015902 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015903
Tony Barbour1fa09702017-03-16 12:09:08 -060015904 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015905
15906 // Create an image and try to create a view with no memory backing the image
15907 VkImage image;
15908
15909 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15910 const int32_t tex_width = 32;
15911 const int32_t tex_height = 32;
15912
15913 VkImageCreateInfo image_create_info = {};
15914 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15915 image_create_info.pNext = NULL;
15916 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15917 image_create_info.format = tex_format;
15918 image_create_info.extent.width = tex_width;
15919 image_create_info.extent.height = tex_height;
15920 image_create_info.extent.depth = 1;
15921 image_create_info.mipLevels = 1;
15922 image_create_info.arrayLayers = 1;
15923 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15924 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15925 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15926 image_create_info.flags = 0;
15927
15928 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15929 ASSERT_VK_SUCCESS(err);
15930
15931 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015932 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015933 image_view_create_info.image = image;
15934 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15935 image_view_create_info.format = tex_format;
15936 image_view_create_info.subresourceRange.layerCount = 1;
15937 image_view_create_info.subresourceRange.baseMipLevel = 0;
15938 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015939 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015940
15941 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015942 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015943
15944 m_errorMonitor->VerifyFound();
15945 vkDestroyImage(m_device->device(), image, NULL);
15946 // If last error is success, it still created the view, so delete it.
15947 if (err == VK_SUCCESS) {
15948 vkDestroyImageView(m_device->device(), view, NULL);
15949 }
Mark Youngd339ba32016-05-30 13:28:35 -060015950}
15951
Karl Schultz6addd812016-02-02 17:17:23 -070015952TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015953 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015955
Tony Barbour1fa09702017-03-16 12:09:08 -060015956 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015957
Karl Schultz6addd812016-02-02 17:17:23 -070015958 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015959 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015960 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015961 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015962
15963 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015964 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015965 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015966 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15967 image_view_create_info.format = tex_format;
15968 image_view_create_info.subresourceRange.baseMipLevel = 0;
15969 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015970 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015971 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015972 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015973
15974 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015975 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015976
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015977 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015978}
15979
Mike Weiblena1e13f42017-02-09 21:25:59 -070015980TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15981 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15982
Tony Barbour1fa09702017-03-16 12:09:08 -060015983 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015984 VkSubresourceLayout subres_layout = {};
15985
15986 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15987 {
15988 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15989 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015990 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015991 ASSERT_TRUE(img.initialized());
15992
15993 VkImageSubresource subres = {};
15994 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15995 subres.mipLevel = 0;
15996 subres.arrayLayer = 0;
15997
15998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15999 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16000 m_errorMonitor->VerifyFound();
16001 }
16002
16003 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
16004 {
16005 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016006 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016007 ASSERT_TRUE(img.initialized());
16008
16009 VkImageSubresource subres = {};
16010 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16011 subres.mipLevel = 0;
16012 subres.arrayLayer = 0;
16013
16014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16016 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16017 m_errorMonitor->VerifyFound();
16018 }
16019
16020 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16021 {
16022 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016023 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016024 ASSERT_TRUE(img.initialized());
16025
16026 VkImageSubresource subres = {};
16027 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16028 subres.mipLevel = 1; // ERROR: triggers VU 00739
16029 subres.arrayLayer = 0;
16030
16031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16032 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16033 m_errorMonitor->VerifyFound();
16034 }
16035
16036 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16037 {
16038 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016039 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016040 ASSERT_TRUE(img.initialized());
16041
16042 VkImageSubresource subres = {};
16043 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16044 subres.mipLevel = 0;
16045 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16046
16047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16048 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16049 m_errorMonitor->VerifyFound();
16050 }
16051}
16052
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016053TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016054 VkResult err;
16055 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016056
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016058
Tony Barbour1fa09702017-03-16 12:09:08 -060016059 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016060
16061 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016062 VkImage srcImage;
16063 VkImage dstImage;
16064 VkDeviceMemory srcMem;
16065 VkDeviceMemory destMem;
16066 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016067
16068 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016069 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16070 image_create_info.pNext = NULL;
16071 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16072 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16073 image_create_info.extent.width = 32;
16074 image_create_info.extent.height = 32;
16075 image_create_info.extent.depth = 1;
16076 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016077 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016078 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16079 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16080 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16081 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016082
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016083 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016084 ASSERT_VK_SUCCESS(err);
16085
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016086 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016087 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016088 ASSERT_VK_SUCCESS(err);
16089
16090 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016091 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016092 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16093 memAlloc.pNext = NULL;
16094 memAlloc.allocationSize = 0;
16095 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016096
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016097 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016098 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016099 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016100 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016101 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016102 ASSERT_VK_SUCCESS(err);
16103
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016104 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016105 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016106 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016107 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016108 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016109 ASSERT_VK_SUCCESS(err);
16110
16111 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16112 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016113 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016114 ASSERT_VK_SUCCESS(err);
16115
Tony Barbour552f6c02016-12-21 14:34:07 -070016116 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016117 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016118 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016119 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016120 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016121 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016122 copyRegion.srcOffset.x = 0;
16123 copyRegion.srcOffset.y = 0;
16124 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016125 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016126 copyRegion.dstSubresource.mipLevel = 0;
16127 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016128 // Introduce failure by forcing the dst layerCount to differ from src
16129 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016130 copyRegion.dstOffset.x = 0;
16131 copyRegion.dstOffset.y = 0;
16132 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016133 copyRegion.extent.width = 1;
16134 copyRegion.extent.height = 1;
16135 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016136 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016137 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016138
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016139 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016140
Chia-I Wuf7458c52015-10-26 21:10:41 +080016141 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016142 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016143 vkFreeMemory(m_device->device(), srcMem, NULL);
16144 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016145}
16146
Tony Barbourd6673642016-05-05 14:46:39 -060016147TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016148 TEST_DESCRIPTION("Creating images with unsuported formats ");
16149
Tony Barbour1fa09702017-03-16 12:09:08 -060016150 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016152
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016153 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016154 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016155 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016156 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16157 image_create_info.format = VK_FORMAT_UNDEFINED;
16158 image_create_info.extent.width = 32;
16159 image_create_info.extent.height = 32;
16160 image_create_info.extent.depth = 1;
16161 image_create_info.mipLevels = 1;
16162 image_create_info.arrayLayers = 1;
16163 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16164 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16165 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016166
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16168 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016169
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016170 VkImage image;
16171 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016172 m_errorMonitor->VerifyFound();
16173
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016174 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016175 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016176 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16177 VkFormat format = static_cast<VkFormat>(f);
16178 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016179 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016180 unsupported = format;
16181 break;
16182 }
16183 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016184
Tony Barbourd6673642016-05-05 14:46:39 -060016185 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016186 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016188
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016189 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016190 m_errorMonitor->VerifyFound();
16191 }
16192}
16193
16194TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016195 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16196
Tony Barbour1fa09702017-03-16 12:09:08 -060016197 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016198 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016199 if (!depth_format) {
16200 return;
16201 }
Tony Barbourd6673642016-05-05 14:46:39 -060016202
16203 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016204 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 -060016205 VK_IMAGE_TILING_OPTIMAL, 0);
16206 ASSERT_TRUE(image.initialized());
16207
16208 VkImageView imgView;
16209 VkImageViewCreateInfo imgViewInfo = {};
16210 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16211 imgViewInfo.image = image.handle();
16212 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16213 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16214 imgViewInfo.subresourceRange.layerCount = 1;
16215 imgViewInfo.subresourceRange.baseMipLevel = 0;
16216 imgViewInfo.subresourceRange.levelCount = 1;
16217 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16218
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016219 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016220 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016222 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16223 m_errorMonitor->VerifyFound();
16224 imgViewInfo.subresourceRange.baseMipLevel = 0;
16225
Tony Barbourd6673642016-05-05 14:46:39 -060016226 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16227 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016229 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16230 m_errorMonitor->VerifyFound();
16231 imgViewInfo.subresourceRange.levelCount = 1;
16232
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016233 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16234 imgViewInfo.subresourceRange.levelCount = 2;
16235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16236 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16237 m_errorMonitor->VerifyFound();
16238 imgViewInfo.subresourceRange.levelCount = 1;
16239
16240 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16241 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16243 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16244 m_errorMonitor->VerifyFound();
16245 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16246
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016247 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16248 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016249 m_errorMonitor->SetDesiredFailureMsg(
16250 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16251 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016252 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16253 m_errorMonitor->VerifyFound();
16254 imgViewInfo.subresourceRange.layerCount = 1;
16255
Tony Barbourd6673642016-05-05 14:46:39 -060016256 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016257 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016258 m_errorMonitor->SetDesiredFailureMsg(
16259 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16260 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016261 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16262 m_errorMonitor->VerifyFound();
16263 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16264
Tony Barbourd6673642016-05-05 14:46:39 -060016265 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16266 // VIEW_CREATE_ERROR
16267 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016269 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16270 m_errorMonitor->VerifyFound();
16271 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16272
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016273 // TODO: Update framework to easily passing mutable flag into ImageObj init
16274 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016275 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16276 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16277 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016278 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16279 // VIEW_CREATE_ERROR
16280 VkImageCreateInfo mutImgInfo = image.create_info();
16281 VkImage mutImage;
16282 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016283 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016284 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16285 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016286 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016287 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016288
16289 VkMemoryRequirements requirements;
16290 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16291
16292 VkMemoryAllocateInfo alloc_info{};
16293 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16294 alloc_info.pNext = NULL;
16295 alloc_info.memoryTypeIndex = 0;
16296 alloc_info.allocationSize = requirements.size;
16297 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16298 ASSERT_TRUE(pass);
16299
16300 VkDeviceMemory memory;
16301 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16302 ASSERT_VK_SUCCESS(ret);
16303
16304 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16305 ASSERT_VK_SUCCESS(ret);
16306
Tony Barbourd6673642016-05-05 14:46:39 -060016307 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016309 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16310 m_errorMonitor->VerifyFound();
16311 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016312
16313 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016314 vkDestroyImage(m_device->handle(), mutImage, NULL);
16315}
16316
Dave Houlton75967fc2017-03-06 17:21:16 -070016317TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16318 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16319
Tony Barbour1fa09702017-03-16 12:09:08 -060016320 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016321
Jamie Madill35127872017-03-15 16:17:46 -040016322 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016323 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16324 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16325 if (device_features.textureCompressionBC) {
16326 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16327 } else if (device_features.textureCompressionETC2) {
16328 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16329 } else if (device_features.textureCompressionASTC_LDR) {
16330 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16331 } else {
16332 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16333 return;
16334 }
16335
16336 VkImageCreateInfo ci;
16337 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16338 ci.pNext = NULL;
16339 ci.flags = 0;
16340 ci.imageType = VK_IMAGE_TYPE_2D;
16341 ci.format = compressed_format;
16342 ci.extent = {32, 32, 1};
16343 ci.mipLevels = 6;
16344 ci.arrayLayers = 1;
16345 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16346 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16347 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16348 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16349 ci.queueFamilyIndexCount = 0;
16350 ci.pQueueFamilyIndices = NULL;
16351 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16352
16353 VkImageObj image(m_device);
16354 image.init(&ci);
16355 ASSERT_TRUE(image.initialized());
16356
16357 VkImageObj odd_image(m_device);
16358 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16359 odd_image.init(&ci);
16360 ASSERT_TRUE(odd_image.initialized());
16361
16362 // Allocate buffers
16363 VkMemoryPropertyFlags reqs = 0;
16364 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16365 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16366 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16367 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16368 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16369
16370 VkBufferImageCopy region = {};
16371 region.bufferRowLength = 0;
16372 region.bufferImageHeight = 0;
16373 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16374 region.imageSubresource.layerCount = 1;
16375 region.imageOffset = {0, 0, 0};
16376 region.bufferOffset = 0;
16377
16378 // start recording
16379 m_commandBuffer->BeginCommandBuffer();
16380
16381 // Mip level copies that work - 5 levels
16382 m_errorMonitor->ExpectSuccess();
16383
16384 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16385 region.imageExtent = {32, 32, 1};
16386 region.imageSubresource.mipLevel = 0;
16387 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16388 &region);
16389 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16390 &region);
16391
16392 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16393 region.imageExtent = {8, 8, 1};
16394 region.imageSubresource.mipLevel = 2;
16395 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16396 &region);
16397 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16398 &region);
16399
16400 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16401 region.imageExtent = {4, 4, 1};
16402 region.imageSubresource.mipLevel = 3;
16403 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16404 &region);
16405 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16406 &region);
16407
16408 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16409 region.imageExtent = {2, 2, 1};
16410 region.imageSubresource.mipLevel = 4;
16411 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16412 &region);
16413 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16414 &region);
16415
16416 region.imageExtent = {1, 1, 1};
16417 region.imageSubresource.mipLevel = 5;
16418 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16419 &region);
16420 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16421 &region);
16422 m_errorMonitor->VerifyNotFound();
16423
16424 // Buffer must accomodate a full compressed block, regardless of texel count
16425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16426 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16427 &region);
16428 m_errorMonitor->VerifyFound();
16429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16430 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16431 &region);
16432 m_errorMonitor->VerifyFound();
16433
16434 // Copy width < compressed block size, but not the full mip width
16435 region.imageExtent = {1, 2, 1};
16436 region.imageSubresource.mipLevel = 4;
16437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16438 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16439 &region);
16440 m_errorMonitor->VerifyFound();
16441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16442 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16443 &region);
16444 m_errorMonitor->VerifyFound();
16445
16446 // Copy height < compressed block size but not the full mip height
16447 region.imageExtent = {2, 1, 1};
16448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16449 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16450 &region);
16451 m_errorMonitor->VerifyFound();
16452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16453 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16454 &region);
16455 m_errorMonitor->VerifyFound();
16456
16457 // Offsets must be multiple of compressed block size
16458 region.imageOffset = {1, 1, 0};
16459 region.imageExtent = {1, 1, 1};
16460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16461 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16462 &region);
16463 m_errorMonitor->VerifyFound();
16464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16465 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16466 &region);
16467 m_errorMonitor->VerifyFound();
16468
16469 // Offset + extent width = mip width - should succeed
16470 region.imageOffset = {4, 4, 0};
16471 region.imageExtent = {3, 4, 1};
16472 region.imageSubresource.mipLevel = 2;
16473 m_errorMonitor->ExpectSuccess();
16474 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16475 &region);
16476 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16477 &region);
16478 m_errorMonitor->VerifyNotFound();
16479
16480 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16481 region.imageExtent = {4, 4, 1};
16482 m_errorMonitor->ExpectSuccess();
16483 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16484 &region);
16485 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16486 &region);
16487 m_errorMonitor->VerifyNotFound();
16488
16489 // Offset + extent width < mip width and not a multiple of block width - should fail
16490 region.imageExtent = {3, 3, 1};
16491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16492 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16493 &region);
16494 m_errorMonitor->VerifyFound();
16495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16496 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16497 &region);
16498 m_errorMonitor->VerifyFound();
16499}
16500
Dave Houlton59a20702017-02-02 17:26:23 -070016501TEST_F(VkLayerTest, ImageBufferCopyTests) {
16502 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16503
Tony Barbour1fa09702017-03-16 12:09:08 -060016504 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016505 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16506 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16507 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16508 return;
16509 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016510
16511 // Bail if any dimension of transfer granularity is 0.
16512 auto index = m_device->graphics_queue_node_index_;
16513 auto queue_family_properties = m_device->phy().queue_properties();
16514 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16515 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16516 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16517 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16518 return;
16519 }
16520
Dave Houlton59a20702017-02-02 17:26:23 -070016521 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16522 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16523 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016524 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16525 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16526 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16527 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16528
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016529 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016530 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16531 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016532 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016533 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16534 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016535 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 -070016536 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016537 ASSERT_TRUE(image_64k.initialized());
16538 ASSERT_TRUE(image_16k.initialized());
16539 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016540
Dave Houltonf3229d52017-02-21 15:59:08 -070016541 // Verify all needed Depth/Stencil formats are supported
16542 bool missing_ds_support = false;
16543 VkFormatProperties props = {0, 0, 0};
16544 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16545 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16546 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16547 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16548 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16549 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16550 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16551 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16552
16553 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016554 ds_image_4D_1S.Init(
16555 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016556 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16557 VK_IMAGE_TILING_OPTIMAL, 0);
16558 ASSERT_TRUE(ds_image_4D_1S.initialized());
16559
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016560 ds_image_3D_1S.Init(
16561 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016562 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16563 VK_IMAGE_TILING_OPTIMAL, 0);
16564 ASSERT_TRUE(ds_image_3D_1S.initialized());
16565
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016566 ds_image_2D.Init(
16567 256, 256, 1, VK_FORMAT_D16_UNORM,
16568 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16569 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016570 ASSERT_TRUE(ds_image_2D.initialized());
16571
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016572 ds_image_1S.Init(
16573 256, 256, 1, VK_FORMAT_S8_UINT,
16574 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16575 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016576 ASSERT_TRUE(ds_image_1S.initialized());
16577 }
16578
16579 // Allocate buffers
16580 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016581 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016582 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16583 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16584 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16585 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016586
16587 VkBufferImageCopy region = {};
16588 region.bufferRowLength = 0;
16589 region.bufferImageHeight = 0;
16590 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16591 region.imageSubresource.layerCount = 1;
16592 region.imageOffset = {0, 0, 0};
16593 region.imageExtent = {64, 64, 1};
16594 region.bufferOffset = 0;
16595
16596 // attempt copies before putting command buffer in recording state
16597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16598 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16599 &region);
16600 m_errorMonitor->VerifyFound();
16601
16602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16603 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16604 &region);
16605 m_errorMonitor->VerifyFound();
16606
16607 // start recording
16608 m_commandBuffer->BeginCommandBuffer();
16609
16610 // successful copies
16611 m_errorMonitor->ExpectSuccess();
16612 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16613 &region);
16614 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16615 &region);
16616 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16617 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16618 &region);
16619 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16620 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16621 &region);
16622 region.imageOffset.x = 0;
16623 region.imageExtent.height = 64;
16624 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16625 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16626 &region);
16627 m_errorMonitor->VerifyNotFound();
16628
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016629 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016630 region.imageExtent = {65, 64, 1};
16631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16632 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16633 &region);
16634 m_errorMonitor->VerifyFound();
16635
16636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16637 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16638 &region);
16639 m_errorMonitor->VerifyFound();
16640
16641 // image/buffer too small (offset) on copy to image
16642 region.imageExtent = {64, 64, 1};
16643 region.imageOffset = {0, 4, 0};
16644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16645 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16646 &region);
16647 m_errorMonitor->VerifyFound();
16648
16649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16650 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16651 &region);
16652 m_errorMonitor->VerifyFound();
16653
16654 // image/buffer too small on copy to buffer
16655 region.imageExtent = {64, 64, 1};
16656 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016657 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16659 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16660 &region);
16661 m_errorMonitor->VerifyFound();
16662
16663 region.imageExtent = {64, 65, 1};
16664 region.bufferOffset = 0;
16665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16666 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16667 &region);
16668 m_errorMonitor->VerifyFound();
16669
16670 // buffer size ok but rowlength causes loose packing
16671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16672 region.imageExtent = {64, 64, 1};
16673 region.bufferRowLength = 68;
16674 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16675 &region);
16676 m_errorMonitor->VerifyFound();
16677
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016678 // An extent with zero area should produce a warning, but no error
16679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16680 region.imageExtent.width = 0;
16681 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16682 &region);
16683 m_errorMonitor->VerifyFound();
16684
Dave Houlton59a20702017-02-02 17:26:23 -070016685 // aspect bits
16686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16687 region.imageExtent = {64, 64, 1};
16688 region.bufferRowLength = 0;
16689 region.bufferImageHeight = 0;
16690 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16691 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16692 buffer_16k.handle(), 1, &region);
16693 m_errorMonitor->VerifyFound();
16694
16695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16696 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16697 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16698 &region);
16699 m_errorMonitor->VerifyFound();
16700
16701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16702 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16703 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16704 buffer_16k.handle(), 1, &region);
16705 m_errorMonitor->VerifyFound();
16706
Dave Houltonf3229d52017-02-21 15:59:08 -070016707 // Test Depth/Stencil copies
16708 if (missing_ds_support) {
16709 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16710 } else {
16711 VkBufferImageCopy ds_region = {};
16712 ds_region.bufferOffset = 0;
16713 ds_region.bufferRowLength = 0;
16714 ds_region.bufferImageHeight = 0;
16715 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16716 ds_region.imageSubresource.mipLevel = 0;
16717 ds_region.imageSubresource.baseArrayLayer = 0;
16718 ds_region.imageSubresource.layerCount = 1;
16719 ds_region.imageOffset = {0, 0, 0};
16720 ds_region.imageExtent = {256, 256, 1};
16721
16722 // Depth copies that should succeed
16723 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16724 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16725 buffer_256k.handle(), 1, &ds_region);
16726 m_errorMonitor->VerifyNotFound();
16727
16728 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16729 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16730 buffer_256k.handle(), 1, &ds_region);
16731 m_errorMonitor->VerifyNotFound();
16732
16733 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16734 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16735 buffer_128k.handle(), 1, &ds_region);
16736 m_errorMonitor->VerifyNotFound();
16737
16738 // Depth copies that should fail
16739 ds_region.bufferOffset = 4;
16740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16741 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16742 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16743 buffer_256k.handle(), 1, &ds_region);
16744 m_errorMonitor->VerifyFound();
16745
16746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16747 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16748 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16749 buffer_256k.handle(), 1, &ds_region);
16750 m_errorMonitor->VerifyFound();
16751
16752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16753 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16754 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16755 buffer_128k.handle(), 1, &ds_region);
16756 m_errorMonitor->VerifyFound();
16757
16758 // Stencil copies that should succeed
16759 ds_region.bufferOffset = 0;
16760 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16761 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16762 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16763 buffer_64k.handle(), 1, &ds_region);
16764 m_errorMonitor->VerifyNotFound();
16765
16766 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16767 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16768 buffer_64k.handle(), 1, &ds_region);
16769 m_errorMonitor->VerifyNotFound();
16770
16771 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16772 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16773 buffer_64k.handle(), 1, &ds_region);
16774 m_errorMonitor->VerifyNotFound();
16775
16776 // Stencil copies that should fail
16777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16778 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16779 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16780 buffer_16k.handle(), 1, &ds_region);
16781 m_errorMonitor->VerifyFound();
16782
16783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16784 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16785 ds_region.bufferRowLength = 260;
16786 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16787 buffer_64k.handle(), 1, &ds_region);
16788 m_errorMonitor->VerifyFound();
16789
16790 ds_region.bufferRowLength = 0;
16791 ds_region.bufferOffset = 4;
16792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16793 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16794 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16795 buffer_64k.handle(), 1, &ds_region);
16796 m_errorMonitor->VerifyFound();
16797 }
16798
Dave Houlton584d51e2017-02-16 12:52:54 -070016799 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016800 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016801 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016802 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16803 device_features.textureCompressionASTC_LDR)) {
16804 printf(" No compressed formats supported - block compression tests skipped.\n");
16805 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016806 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16807 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016808 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016809 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16810 0);
16811 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 -070016812 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016813 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016814 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 -070016815 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016816 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 -070016817 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016818 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016819 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 -070016820 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016821 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 -070016822 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016823 }
16824 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016825
Dave Houlton584d51e2017-02-16 12:52:54 -070016826 // Just fits
16827 m_errorMonitor->ExpectSuccess();
16828 region.imageExtent = {128, 128, 1};
16829 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16830 buffer_16k.handle(), 1, &region);
16831 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016832
Dave Houlton584d51e2017-02-16 12:52:54 -070016833 // with offset, too big for buffer
16834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16835 region.bufferOffset = 16;
16836 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16837 buffer_16k.handle(), 1, &region);
16838 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016839 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016840
Dave Houlton67e9b532017-03-02 17:00:10 -070016841 // extents that are not a multiple of compressed block size
16842 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16843 region.imageExtent.width = 66;
16844 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16845 buffer_16k.handle(), 1, &region);
16846 m_errorMonitor->VerifyFound();
16847 region.imageExtent.width = 128;
16848
16849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016850 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016851 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16852 buffer_16k.handle(), 1, &region);
16853 m_errorMonitor->VerifyFound();
16854 region.imageExtent.height = 128;
16855
16856 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16857
16858 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16859 m_errorMonitor->ExpectSuccess();
16860 region.imageExtent.width = 66;
16861 region.imageOffset.x = 64;
16862 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16863 buffer_16k.handle(), 1, &region);
16864 region.imageExtent.width = 16;
16865 region.imageOffset.x = 0;
16866 region.imageExtent.height = 2;
16867 region.imageOffset.y = 128;
16868 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016869 buffer_16k.handle(), 1, &region);
16870 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016871 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016872
Dave Houlton584d51e2017-02-16 12:52:54 -070016873 // buffer offset must be a multiple of texel block size (16)
16874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16876 region.imageExtent = {64, 64, 1};
16877 region.bufferOffset = 24;
16878 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16879 buffer_16k.handle(), 1, &region);
16880 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016881
Dave Houlton584d51e2017-02-16 12:52:54 -070016882 // rowlength not a multiple of block width (4)
16883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16884 region.bufferOffset = 0;
16885 region.bufferRowLength = 130;
16886 region.bufferImageHeight = 0;
16887 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16888 buffer_64k.handle(), 1, &region);
16889 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016890
Dave Houlton584d51e2017-02-16 12:52:54 -070016891 // imageheight not a multiple of block height (4)
16892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16893 region.bufferRowLength = 0;
16894 region.bufferImageHeight = 130;
16895 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16896 buffer_64k.handle(), 1, &region);
16897 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016898 }
Dave Houlton59a20702017-02-02 17:26:23 -070016899}
16900
Tony Barbourd6673642016-05-05 14:46:39 -060016901TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016902 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016903
Tony Barbour1fa09702017-03-16 12:09:08 -060016904 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016905
Rene Lindsay135204f2016-12-22 17:11:09 -070016906 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016907 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016908 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 -070016909 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016910 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016911 vk_testing::Buffer buffer;
16912 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016913 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016914 VkBufferImageCopy region = {};
16915 region.bufferRowLength = 128;
16916 region.bufferImageHeight = 128;
16917 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16918 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016919 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016920 region.imageExtent.height = 4;
16921 region.imageExtent.width = 4;
16922 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016923
16924 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016925 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 -070016926 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016927 ASSERT_TRUE(image2.initialized());
16928 vk_testing::Buffer buffer2;
16929 VkMemoryPropertyFlags reqs2 = 0;
16930 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16931 VkBufferImageCopy region2 = {};
16932 region2.bufferRowLength = 128;
16933 region2.bufferImageHeight = 128;
16934 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16935 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16936 region2.imageSubresource.layerCount = 1;
16937 region2.imageExtent.height = 4;
16938 region2.imageExtent.width = 4;
16939 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016940 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016941
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016942 // Image must have offset.z of 0 and extent.depth of 1
16943 // Introduce failure by setting imageExtent.depth to 0
16944 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016946 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016947 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016948 m_errorMonitor->VerifyFound();
16949
16950 region.imageExtent.depth = 1;
16951
16952 // Image must have offset.z of 0 and extent.depth of 1
16953 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016954 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016955 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016958 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016959 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016960 m_errorMonitor->VerifyFound();
16961
16962 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016963 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16964 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016965 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016967 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16968 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016969 m_errorMonitor->VerifyFound();
16970
16971 // BufferOffset must be a multiple of 4
16972 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016973 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016975 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16976 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016977 m_errorMonitor->VerifyFound();
16978
16979 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16980 region.bufferOffset = 0;
16981 region.imageExtent.height = 128;
16982 region.imageExtent.width = 128;
16983 // Introduce failure by setting bufferRowLength > 0 but less than width
16984 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016986 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16987 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016988 m_errorMonitor->VerifyFound();
16989
16990 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16991 region.bufferRowLength = 128;
16992 // Introduce failure by setting bufferRowHeight > 0 but less than height
16993 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016995 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16996 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016997 m_errorMonitor->VerifyFound();
16998
16999 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060017000 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017001 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 -070017002 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017003 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017004 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 -070017005 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017006 VkImageBlit blitRegion = {};
17007 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17008 blitRegion.srcSubresource.baseArrayLayer = 0;
17009 blitRegion.srcSubresource.layerCount = 1;
17010 blitRegion.srcSubresource.mipLevel = 0;
17011 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17012 blitRegion.dstSubresource.baseArrayLayer = 0;
17013 blitRegion.dstSubresource.layerCount = 1;
17014 blitRegion.dstSubresource.mipLevel = 0;
17015
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017016 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17018 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17020 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017021 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17022 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017023 m_errorMonitor->VerifyFound();
17024
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017026 VkImageMemoryBarrier img_barrier;
17027 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17028 img_barrier.pNext = NULL;
17029 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17030 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17031 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17032 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17033 img_barrier.image = image.handle();
17034 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17035 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17036 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17037 img_barrier.subresourceRange.baseArrayLayer = 0;
17038 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017039 img_barrier.subresourceRange.layerCount = 0;
17040 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017041 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17042 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017043 m_errorMonitor->VerifyFound();
17044 img_barrier.subresourceRange.layerCount = 1;
17045}
17046
17047TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017048 TEST_DESCRIPTION("Exceed the limits of image format ");
17049
Tony Barbour1fa09702017-03-16 12:09:08 -060017050 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017051
17052 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17053 {
17054 VkFormatProperties properties;
17055 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17056 if (properties.linearTilingFeatures == 0) {
17057 printf(" Image format not supported; skipped.\n");
17058 return;
17059 }
17060 }
17061
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017063 VkImageCreateInfo image_create_info = {};
17064 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17065 image_create_info.pNext = NULL;
17066 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017067 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017068 image_create_info.extent.width = 32;
17069 image_create_info.extent.height = 32;
17070 image_create_info.extent.depth = 1;
17071 image_create_info.mipLevels = 1;
17072 image_create_info.arrayLayers = 1;
17073 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17074 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17075 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17076 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17077 image_create_info.flags = 0;
17078
17079 VkImage nullImg;
17080 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017081 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17082 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017083 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017084 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17085 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17086 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017087 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017088
Tony Barbour0907e362017-03-09 15:05:30 -070017089 uint32_t maxDim =
17090 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17091 // If max mip levels exceeds image extents, skip the max mip levels test
17092 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17094 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17095 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17096 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17097 m_errorMonitor->VerifyFound();
17098 image_create_info.mipLevels = 1;
17099 }
Tony Barbourd6673642016-05-05 14:46:39 -060017100
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017102 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17103 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17104 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17105 m_errorMonitor->VerifyFound();
17106 image_create_info.arrayLayers = 1;
17107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017109 int samples = imgFmtProps.sampleCounts >> 1;
17110 image_create_info.samples = (VkSampleCountFlagBits)samples;
17111 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17112 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17113 m_errorMonitor->VerifyFound();
17114 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17115
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17117 "pCreateInfo->initialLayout, must be "
17118 "VK_IMAGE_LAYOUT_UNDEFINED or "
17119 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017120 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17121 // Expect INVALID_LAYOUT
17122 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17123 m_errorMonitor->VerifyFound();
17124 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17125}
17126
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017127TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017128 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017130
Tony Barbour1fa09702017-03-16 12:09:08 -060017131 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017132
17133 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017134 src_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017135 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017136 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017137
Tony Barbour552f6c02016-12-21 14:34:07 -070017138 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017139 VkImageCopy copy_region;
17140 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17141 copy_region.srcSubresource.mipLevel = 0;
17142 copy_region.srcSubresource.baseArrayLayer = 0;
17143 copy_region.srcSubresource.layerCount = 0;
17144 copy_region.srcOffset.x = 0;
17145 copy_region.srcOffset.y = 0;
17146 copy_region.srcOffset.z = 0;
17147 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17148 copy_region.dstSubresource.mipLevel = 0;
17149 copy_region.dstSubresource.baseArrayLayer = 0;
17150 copy_region.dstSubresource.layerCount = 0;
17151 copy_region.dstOffset.x = 0;
17152 copy_region.dstOffset.y = 0;
17153 copy_region.dstOffset.z = 0;
17154 copy_region.extent.width = 64;
17155 copy_region.extent.height = 64;
17156 copy_region.extent.depth = 1;
17157 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17158 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017159 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017160
17161 m_errorMonitor->VerifyFound();
17162}
17163
17164TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017165 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017167
Tony Barbour1fa09702017-03-16 12:09:08 -060017168 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017169
17170 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017171 src_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017172 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017173 dst_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017174
Tony Barbour552f6c02016-12-21 14:34:07 -070017175 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017176 VkImageCopy copy_region;
17177 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17178 copy_region.srcSubresource.mipLevel = 0;
17179 copy_region.srcSubresource.baseArrayLayer = 0;
17180 copy_region.srcSubresource.layerCount = 0;
17181 copy_region.srcOffset.x = 0;
17182 copy_region.srcOffset.y = 0;
17183 copy_region.srcOffset.z = 0;
17184 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17185 copy_region.dstSubresource.mipLevel = 0;
17186 copy_region.dstSubresource.baseArrayLayer = 0;
17187 copy_region.dstSubresource.layerCount = 0;
17188 copy_region.dstOffset.x = 0;
17189 copy_region.dstOffset.y = 0;
17190 copy_region.dstOffset.z = 0;
17191 copy_region.extent.width = 64;
17192 copy_region.extent.height = 64;
17193 copy_region.extent.depth = 1;
17194 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17195 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017196 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017197
17198 m_errorMonitor->VerifyFound();
17199}
17200
Karl Schultz6addd812016-02-02 17:17:23 -070017201TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017202 VkResult err;
17203 bool pass;
17204
17205 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017207
Tony Barbour1fa09702017-03-16 12:09:08 -060017208 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017209
17210 // Create two images of different types and try to copy between them
17211 VkImage srcImage;
17212 VkImage dstImage;
17213 VkDeviceMemory srcMem;
17214 VkDeviceMemory destMem;
17215 VkMemoryRequirements memReqs;
17216
17217 VkImageCreateInfo image_create_info = {};
17218 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17219 image_create_info.pNext = NULL;
17220 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17221 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17222 image_create_info.extent.width = 32;
17223 image_create_info.extent.height = 32;
17224 image_create_info.extent.depth = 1;
17225 image_create_info.mipLevels = 1;
17226 image_create_info.arrayLayers = 1;
17227 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17228 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17229 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17230 image_create_info.flags = 0;
17231
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017232 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017233 ASSERT_VK_SUCCESS(err);
17234
17235 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17236 // Introduce failure by creating second image with a different-sized format.
17237 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017238 VkFormatProperties properties;
17239 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17240 if (properties.optimalTilingFeatures == 0) {
17241 printf(" Image format not supported; skipped.\n");
17242 return;
17243 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017244
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017245 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017246 ASSERT_VK_SUCCESS(err);
17247
17248 // Allocate memory
17249 VkMemoryAllocateInfo memAlloc = {};
17250 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17251 memAlloc.pNext = NULL;
17252 memAlloc.allocationSize = 0;
17253 memAlloc.memoryTypeIndex = 0;
17254
17255 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17256 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017257 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017258 ASSERT_TRUE(pass);
17259 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17260 ASSERT_VK_SUCCESS(err);
17261
17262 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17263 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017264 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017265 ASSERT_TRUE(pass);
17266 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17267 ASSERT_VK_SUCCESS(err);
17268
17269 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17270 ASSERT_VK_SUCCESS(err);
17271 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17272 ASSERT_VK_SUCCESS(err);
17273
Tony Barbour552f6c02016-12-21 14:34:07 -070017274 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017275 VkImageCopy copyRegion;
17276 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17277 copyRegion.srcSubresource.mipLevel = 0;
17278 copyRegion.srcSubresource.baseArrayLayer = 0;
17279 copyRegion.srcSubresource.layerCount = 0;
17280 copyRegion.srcOffset.x = 0;
17281 copyRegion.srcOffset.y = 0;
17282 copyRegion.srcOffset.z = 0;
17283 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17284 copyRegion.dstSubresource.mipLevel = 0;
17285 copyRegion.dstSubresource.baseArrayLayer = 0;
17286 copyRegion.dstSubresource.layerCount = 0;
17287 copyRegion.dstOffset.x = 0;
17288 copyRegion.dstOffset.y = 0;
17289 copyRegion.dstOffset.z = 0;
17290 copyRegion.extent.width = 1;
17291 copyRegion.extent.height = 1;
17292 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017293 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017294 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017295
17296 m_errorMonitor->VerifyFound();
17297
17298 vkDestroyImage(m_device->device(), srcImage, NULL);
17299 vkDestroyImage(m_device->device(), dstImage, NULL);
17300 vkFreeMemory(m_device->device(), srcMem, NULL);
17301 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017302}
17303
Karl Schultz6addd812016-02-02 17:17:23 -070017304TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17305 VkResult err;
17306 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017307
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017308 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17310 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017311
Tony Barbour1fa09702017-03-16 12:09:08 -060017312 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017313 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017314 if (!depth_format) {
17315 return;
17316 }
Mike Stroyana3082432015-09-25 13:39:21 -060017317
17318 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017319 VkImage srcImage;
17320 VkImage dstImage;
17321 VkDeviceMemory srcMem;
17322 VkDeviceMemory destMem;
17323 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017324
17325 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017326 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17327 image_create_info.pNext = NULL;
17328 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017329 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017330 image_create_info.extent.width = 32;
17331 image_create_info.extent.height = 32;
17332 image_create_info.extent.depth = 1;
17333 image_create_info.mipLevels = 1;
17334 image_create_info.arrayLayers = 1;
17335 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060017336 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070017337 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17338 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017339 VkFormatProperties properties;
17340 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17341 if (properties.optimalTilingFeatures == 0) {
17342 printf(" Image format not supported; skipped.\n");
17343 return;
17344 }
Mike Stroyana3082432015-09-25 13:39:21 -060017345
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017346 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017347 ASSERT_VK_SUCCESS(err);
17348
Karl Schultzbdb75952016-04-19 11:36:49 -060017349 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17350
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017351 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017352 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017353 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017354 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017355
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017356 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017357 ASSERT_VK_SUCCESS(err);
17358
17359 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017360 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017361 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17362 memAlloc.pNext = NULL;
17363 memAlloc.allocationSize = 0;
17364 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017365
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017366 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017367 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017368 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017369 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017370 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017371 ASSERT_VK_SUCCESS(err);
17372
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017373 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017374 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017375 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017376 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017377 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017378 ASSERT_VK_SUCCESS(err);
17379
17380 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17381 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017382 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017383 ASSERT_VK_SUCCESS(err);
17384
Tony Barbour552f6c02016-12-21 14:34:07 -070017385 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017386 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017387 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017388 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017389 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017390 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017391 copyRegion.srcOffset.x = 0;
17392 copyRegion.srcOffset.y = 0;
17393 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017394 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017395 copyRegion.dstSubresource.mipLevel = 0;
17396 copyRegion.dstSubresource.baseArrayLayer = 0;
17397 copyRegion.dstSubresource.layerCount = 0;
17398 copyRegion.dstOffset.x = 0;
17399 copyRegion.dstOffset.y = 0;
17400 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017401 copyRegion.extent.width = 1;
17402 copyRegion.extent.height = 1;
17403 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017404 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017405 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017406
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017407 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017408
Chia-I Wuf7458c52015-10-26 21:10:41 +080017409 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017410 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017411 vkFreeMemory(m_device->device(), srcMem, NULL);
17412 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017413}
17414
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017415TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17416 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017417
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017418 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017419
17420 VkImageFormatProperties image_format_properties;
17421 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17422 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17423 &image_format_properties);
17424
17425 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17426 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17427 printf(" Image multi-sample support not found; skipped.\n");
17428 return;
17429 }
17430
17431 VkImageCreateInfo ci;
17432 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17433 ci.pNext = NULL;
17434 ci.flags = 0;
17435 ci.imageType = VK_IMAGE_TYPE_2D;
17436 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17437 ci.extent = {128, 128, 1};
17438 ci.mipLevels = 1;
17439 ci.arrayLayers = 1;
17440 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17441 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17442 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17443 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17444 ci.queueFamilyIndexCount = 0;
17445 ci.pQueueFamilyIndices = NULL;
17446 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17447
17448 VkImageObj image1(m_device);
17449 image1.init(&ci);
17450 ASSERT_TRUE(image1.initialized());
17451
17452 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17453 VkImageObj image2(m_device);
17454 image2.init(&ci);
17455 ASSERT_TRUE(image2.initialized());
17456
17457 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17458 VkImageObj image4(m_device);
17459 image4.init(&ci);
17460 ASSERT_TRUE(image4.initialized());
17461
17462 m_commandBuffer->BeginCommandBuffer();
17463
17464 VkImageCopy copyRegion;
17465 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17466 copyRegion.srcSubresource.mipLevel = 0;
17467 copyRegion.srcSubresource.baseArrayLayer = 0;
17468 copyRegion.srcSubresource.layerCount = 1;
17469 copyRegion.srcOffset = {0, 0, 0};
17470 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17471 copyRegion.dstSubresource.mipLevel = 0;
17472 copyRegion.dstSubresource.baseArrayLayer = 0;
17473 copyRegion.dstSubresource.layerCount = 1;
17474 copyRegion.dstOffset = {0, 0, 0};
17475 copyRegion.extent = {128, 128, 1};
17476
17477 // Copy a single sample image to/from a multi-sample image
17478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17479 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17480 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17481 m_errorMonitor->VerifyFound();
17482
17483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17484 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17485 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17486 m_errorMonitor->VerifyFound();
17487
17488 // Copy between multi-sample images with different sample counts
17489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17490 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17491 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17492 m_errorMonitor->VerifyFound();
17493
17494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17495 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17496 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17497 m_errorMonitor->VerifyFound();
17498
17499 m_commandBuffer->EndCommandBuffer();
17500}
17501
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017502TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17503 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017504 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017505 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017506 if (!ds_format) {
17507 return;
17508 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017509
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017510 VkFormatProperties properties;
17511 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
17512 if (properties.optimalTilingFeatures == 0) {
17513 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
17514 return;
17515 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017516 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017517 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 -060017518 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 -060017519 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017520 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17521 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017522 ASSERT_TRUE(color_image.initialized());
17523 ASSERT_TRUE(depth_image.initialized());
17524 ASSERT_TRUE(ds_image.initialized());
17525
17526 VkImageCopy copyRegion;
17527 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17528 copyRegion.srcSubresource.mipLevel = 0;
17529 copyRegion.srcSubresource.baseArrayLayer = 0;
17530 copyRegion.srcSubresource.layerCount = 1;
17531 copyRegion.srcOffset = {0, 0, 0};
17532 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17533 copyRegion.dstSubresource.mipLevel = 0;
17534 copyRegion.dstSubresource.baseArrayLayer = 0;
17535 copyRegion.dstSubresource.layerCount = 1;
17536 copyRegion.dstOffset = {64, 0, 0};
17537 copyRegion.extent = {64, 128, 1};
17538
17539 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17541 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17542 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17543 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017544 m_errorMonitor->VerifyFound();
17545
17546 m_commandBuffer->BeginCommandBuffer();
17547
17548 // Src and dest aspect masks don't match
17549 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017551 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17552 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017553 m_errorMonitor->VerifyFound();
17554 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17555
17556 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017557 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017558 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17560 // These aspect/format mismatches are redundant but unavoidable here
17561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017563 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17564 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017565 m_errorMonitor->VerifyFound();
17566 // Metadata aspect is illegal - VU 01222
17567 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17568 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17570 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017571 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17572 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017573 m_errorMonitor->VerifyFound();
17574
17575 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17576 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17577
17578 // Aspect mask doesn't match source image format - VU 01200
17579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17580 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17582 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17583 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17584 m_errorMonitor->VerifyFound();
17585
17586 // Aspect mask doesn't match dest image format - VU 01201
17587 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17588 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17590 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17592 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17593 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17594 m_errorMonitor->VerifyFound();
17595
17596 m_commandBuffer->EndCommandBuffer();
17597}
17598
Karl Schultz6addd812016-02-02 17:17:23 -070017599TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17600 VkResult err;
17601 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017602
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17604 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017605
Tony Barbour1fa09702017-03-16 12:09:08 -060017606 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017607
17608 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017609 VkImage srcImage;
17610 VkImage dstImage;
17611 VkDeviceMemory srcMem;
17612 VkDeviceMemory destMem;
17613 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017614
17615 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017616 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17617 image_create_info.pNext = NULL;
17618 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17619 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17620 image_create_info.extent.width = 32;
17621 image_create_info.extent.height = 1;
17622 image_create_info.extent.depth = 1;
17623 image_create_info.mipLevels = 1;
17624 image_create_info.arrayLayers = 1;
17625 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17626 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17627 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17628 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017629
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017630 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017631 ASSERT_VK_SUCCESS(err);
17632
Karl Schultz6addd812016-02-02 17:17:23 -070017633 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017634
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017635 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017636 ASSERT_VK_SUCCESS(err);
17637
17638 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017639 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017640 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17641 memAlloc.pNext = NULL;
17642 memAlloc.allocationSize = 0;
17643 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017644
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017645 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017646 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017647 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017648 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017649 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017650 ASSERT_VK_SUCCESS(err);
17651
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017652 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017653 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017654 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017655 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017656 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017657 ASSERT_VK_SUCCESS(err);
17658
17659 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17660 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017661 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017662 ASSERT_VK_SUCCESS(err);
17663
Tony Barbour552f6c02016-12-21 14:34:07 -070017664 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017665 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017666 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17667 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017668 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017669 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017670 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017671 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017672 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017673 resolveRegion.srcOffset.x = 0;
17674 resolveRegion.srcOffset.y = 0;
17675 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017676 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017677 resolveRegion.dstSubresource.mipLevel = 0;
17678 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017679 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017680 resolveRegion.dstOffset.x = 0;
17681 resolveRegion.dstOffset.y = 0;
17682 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017683 resolveRegion.extent.width = 1;
17684 resolveRegion.extent.height = 1;
17685 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017686 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017687 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017688
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017689 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017690
Chia-I Wuf7458c52015-10-26 21:10:41 +080017691 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017692 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017693 vkFreeMemory(m_device->device(), srcMem, NULL);
17694 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017695}
17696
Karl Schultz6addd812016-02-02 17:17:23 -070017697TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17698 VkResult err;
17699 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017700
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17702 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017703
Tony Barbour1fa09702017-03-16 12:09:08 -060017704 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017705
Chris Forbesa7530692016-05-08 12:35:39 +120017706 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017707 VkImage srcImage;
17708 VkImage dstImage;
17709 VkDeviceMemory srcMem;
17710 VkDeviceMemory destMem;
17711 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017712
17713 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017714 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17715 image_create_info.pNext = NULL;
17716 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17717 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17718 image_create_info.extent.width = 32;
17719 image_create_info.extent.height = 1;
17720 image_create_info.extent.depth = 1;
17721 image_create_info.mipLevels = 1;
17722 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017723 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017724 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17725 // Note: Some implementations expect color attachment usage for any
17726 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017727 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017728 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017729
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017730 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017731 ASSERT_VK_SUCCESS(err);
17732
Karl Schultz6addd812016-02-02 17:17:23 -070017733 // Note: Some implementations expect color attachment usage for any
17734 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017735 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017736
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017737 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017738 ASSERT_VK_SUCCESS(err);
17739
17740 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017741 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017742 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17743 memAlloc.pNext = NULL;
17744 memAlloc.allocationSize = 0;
17745 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017746
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017747 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017748 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017749 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017750 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017751 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017752 ASSERT_VK_SUCCESS(err);
17753
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017754 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017755 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017756 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017757 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017758 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017759 ASSERT_VK_SUCCESS(err);
17760
17761 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17762 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017763 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017764 ASSERT_VK_SUCCESS(err);
17765
Tony Barbour552f6c02016-12-21 14:34:07 -070017766 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017767 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017768 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17769 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017770 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017771 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017772 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017773 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017774 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017775 resolveRegion.srcOffset.x = 0;
17776 resolveRegion.srcOffset.y = 0;
17777 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017778 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017779 resolveRegion.dstSubresource.mipLevel = 0;
17780 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017781 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017782 resolveRegion.dstOffset.x = 0;
17783 resolveRegion.dstOffset.y = 0;
17784 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017785 resolveRegion.extent.width = 1;
17786 resolveRegion.extent.height = 1;
17787 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017788 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017789 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017790
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017791 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017792
Chia-I Wuf7458c52015-10-26 21:10:41 +080017793 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017794 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017795 vkFreeMemory(m_device->device(), srcMem, NULL);
17796 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017797}
17798
Karl Schultz6addd812016-02-02 17:17:23 -070017799TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17800 VkResult err;
17801 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017802
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017804 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017805
Tony Barbour1fa09702017-03-16 12:09:08 -060017806 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017807
17808 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017809 VkImage srcImage;
17810 VkImage dstImage;
17811 VkDeviceMemory srcMem;
17812 VkDeviceMemory destMem;
17813 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017814
17815 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017816 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17817 image_create_info.pNext = NULL;
17818 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17819 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17820 image_create_info.extent.width = 32;
17821 image_create_info.extent.height = 1;
17822 image_create_info.extent.depth = 1;
17823 image_create_info.mipLevels = 1;
17824 image_create_info.arrayLayers = 1;
17825 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17826 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17827 // Note: Some implementations expect color attachment usage for any
17828 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017829 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017830 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017831
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017833 ASSERT_VK_SUCCESS(err);
17834
Karl Schultz6addd812016-02-02 17:17:23 -070017835 // Set format to something other than source image
17836 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17837 // Note: Some implementations expect color attachment usage for any
17838 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017839 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017840 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017841
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017842 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017843 ASSERT_VK_SUCCESS(err);
17844
17845 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017846 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017847 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17848 memAlloc.pNext = NULL;
17849 memAlloc.allocationSize = 0;
17850 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017851
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017852 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017853 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017854 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017855 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017856 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017857 ASSERT_VK_SUCCESS(err);
17858
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017859 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017860 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017861 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017862 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017863 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017864 ASSERT_VK_SUCCESS(err);
17865
17866 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17867 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017868 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017869 ASSERT_VK_SUCCESS(err);
17870
Tony Barbour552f6c02016-12-21 14:34:07 -070017871 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017872 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017873 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17874 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017875 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017876 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017877 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017878 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017879 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017880 resolveRegion.srcOffset.x = 0;
17881 resolveRegion.srcOffset.y = 0;
17882 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017883 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017884 resolveRegion.dstSubresource.mipLevel = 0;
17885 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017886 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017887 resolveRegion.dstOffset.x = 0;
17888 resolveRegion.dstOffset.y = 0;
17889 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017890 resolveRegion.extent.width = 1;
17891 resolveRegion.extent.height = 1;
17892 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017893 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017894 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017895
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017896 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017897
Chia-I Wuf7458c52015-10-26 21:10:41 +080017898 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017899 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017900 vkFreeMemory(m_device->device(), srcMem, NULL);
17901 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017902}
17903
Karl Schultz6addd812016-02-02 17:17:23 -070017904TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17905 VkResult err;
17906 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017907
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017909 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017910
Tony Barbour1fa09702017-03-16 12:09:08 -060017911 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017912
17913 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017914 VkImage srcImage;
17915 VkImage dstImage;
17916 VkDeviceMemory srcMem;
17917 VkDeviceMemory destMem;
17918 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017919
17920 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017921 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17922 image_create_info.pNext = NULL;
17923 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17924 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17925 image_create_info.extent.width = 32;
17926 image_create_info.extent.height = 1;
17927 image_create_info.extent.depth = 1;
17928 image_create_info.mipLevels = 1;
17929 image_create_info.arrayLayers = 1;
17930 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17931 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17932 // Note: Some implementations expect color attachment usage for any
17933 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017934 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017935 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017936
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017937 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017938 ASSERT_VK_SUCCESS(err);
17939
Karl Schultz6addd812016-02-02 17:17:23 -070017940 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17941 // Note: Some implementations expect color attachment usage for any
17942 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017943 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017944 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017945
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017946 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017947 ASSERT_VK_SUCCESS(err);
17948
17949 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017950 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017951 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17952 memAlloc.pNext = NULL;
17953 memAlloc.allocationSize = 0;
17954 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017955
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017956 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017957 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017958 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017959 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017960 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017961 ASSERT_VK_SUCCESS(err);
17962
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017963 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017964 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017965 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017966 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017967 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017968 ASSERT_VK_SUCCESS(err);
17969
17970 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17971 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017972 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017973 ASSERT_VK_SUCCESS(err);
17974
Tony Barbour552f6c02016-12-21 14:34:07 -070017975 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017976 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017977 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17978 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017979 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017980 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017981 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017982 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017983 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017984 resolveRegion.srcOffset.x = 0;
17985 resolveRegion.srcOffset.y = 0;
17986 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017987 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017988 resolveRegion.dstSubresource.mipLevel = 0;
17989 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017990 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017991 resolveRegion.dstOffset.x = 0;
17992 resolveRegion.dstOffset.y = 0;
17993 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017994 resolveRegion.extent.width = 1;
17995 resolveRegion.extent.height = 1;
17996 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017997 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017998 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017999
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018000 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018001
Chia-I Wuf7458c52015-10-26 21:10:41 +080018002 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018003 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018004 vkFreeMemory(m_device->device(), srcMem, NULL);
18005 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018006}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018007
Karl Schultz6addd812016-02-02 17:17:23 -070018008TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018009 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018010 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18011 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018012 // The image format check comes 2nd in validation so we trigger it first,
18013 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018014 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018015
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18017 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018018
Tony Barbour1fa09702017-03-16 12:09:08 -060018019 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018020 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018021 if (!depth_format) {
18022 return;
18023 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018024
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018025 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018026 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18027 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018028
18029 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018030 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18031 ds_pool_ci.pNext = NULL;
18032 ds_pool_ci.maxSets = 1;
18033 ds_pool_ci.poolSizeCount = 1;
18034 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018035
18036 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018037 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018038 ASSERT_VK_SUCCESS(err);
18039
18040 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018041 dsl_binding.binding = 0;
18042 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18043 dsl_binding.descriptorCount = 1;
18044 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18045 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018046
18047 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018048 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18049 ds_layout_ci.pNext = NULL;
18050 ds_layout_ci.bindingCount = 1;
18051 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018052 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018053 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018054 ASSERT_VK_SUCCESS(err);
18055
18056 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018057 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018058 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018059 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018060 alloc_info.descriptorPool = ds_pool;
18061 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018062 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018063 ASSERT_VK_SUCCESS(err);
18064
Karl Schultz6addd812016-02-02 17:17:23 -070018065 VkImage image_bad;
18066 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018067 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018068 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018069 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018070 const int32_t tex_width = 32;
18071 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -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;
18077 image_create_info.format = tex_format_bad;
18078 image_create_info.extent.width = tex_width;
18079 image_create_info.extent.height = tex_height;
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;
18084 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018085 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018086 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018087
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018088 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018089 ASSERT_VK_SUCCESS(err);
18090 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018091 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18092 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018093 ASSERT_VK_SUCCESS(err);
18094
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018095 // ---Bind image memory---
18096 VkMemoryRequirements img_mem_reqs;
18097 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18098 VkMemoryAllocateInfo image_alloc_info = {};
18099 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18100 image_alloc_info.pNext = NULL;
18101 image_alloc_info.memoryTypeIndex = 0;
18102 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018103 bool pass =
18104 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 -070018105 ASSERT_TRUE(pass);
18106 VkDeviceMemory mem;
18107 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18108 ASSERT_VK_SUCCESS(err);
18109 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18110 ASSERT_VK_SUCCESS(err);
18111 // -----------------------
18112
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018113 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018114 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018115 image_view_create_info.image = image_bad;
18116 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18117 image_view_create_info.format = tex_format_bad;
18118 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18119 image_view_create_info.subresourceRange.baseMipLevel = 0;
18120 image_view_create_info.subresourceRange.layerCount = 1;
18121 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018122 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018123
18124 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018125 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018126
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018127 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018128
Chia-I Wuf7458c52015-10-26 21:10:41 +080018129 vkDestroyImage(m_device->device(), image_bad, NULL);
18130 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018131 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18132 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018133
18134 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018135}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018136
18137TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018138 TEST_DESCRIPTION(
18139 "Call ClearColorImage w/ a depth|stencil image and "
18140 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018141
Tony Barbour1fa09702017-03-16 12:09:08 -060018142 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018143 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018144 if (!depth_format) {
18145 return;
18146 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18148
Tony Barbour552f6c02016-12-21 14:34:07 -070018149 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018150
18151 // Color image
18152 VkClearColorValue clear_color;
18153 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18154 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18155 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18156 const int32_t img_width = 32;
18157 const int32_t img_height = 32;
18158 VkImageCreateInfo image_create_info = {};
18159 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18160 image_create_info.pNext = NULL;
18161 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18162 image_create_info.format = color_format;
18163 image_create_info.extent.width = img_width;
18164 image_create_info.extent.height = img_height;
18165 image_create_info.extent.depth = 1;
18166 image_create_info.mipLevels = 1;
18167 image_create_info.arrayLayers = 1;
18168 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18169 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18170 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18171
18172 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018173 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018174
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018175 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018176
18177 // Depth/Stencil image
18178 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018179 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018180 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18181 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018182 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018183 ds_image_create_info.extent.width = 64;
18184 ds_image_create_info.extent.height = 64;
18185 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018186 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 -060018187
18188 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018189 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018190
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018191 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 -060018192
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018194
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018195 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018196 &color_range);
18197
18198 m_errorMonitor->VerifyFound();
18199
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18201 "vkCmdClearColorImage called with "
18202 "image created without "
18203 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018204
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018205 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018206 &color_range);
18207
18208 m_errorMonitor->VerifyFound();
18209
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018210 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18212 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018213
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018214 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18215 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018216
18217 m_errorMonitor->VerifyFound();
18218}
Tobin Ehliscde08892015-09-22 10:11:37 -060018219
Mike Schuchardt35fece12017-03-07 14:40:28 -070018220TEST_F(VkLayerTest, CommandQueueFlags) {
18221 TEST_DESCRIPTION(
18222 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18223 "graphics-only command");
18224
18225 ASSERT_NO_FATAL_FAILURE(Init());
18226
18227 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018228 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018229 printf(" Non-graphics queue family not found; skipped.\n");
18230 return;
18231 } else {
18232 // Create command pool on a non-graphics queue
18233 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18234
18235 // Setup command buffer on pool
18236 VkCommandBufferObj command_buffer(m_device, &command_pool);
18237 command_buffer.BeginCommandBuffer();
18238
18239 // Issue a graphics only command
18240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18241 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18242 command_buffer.SetViewport(0, 1, &viewport);
18243 m_errorMonitor->VerifyFound();
18244 }
18245}
18246
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018247// WSI Enabled Tests
18248//
Chris Forbes09368e42016-10-13 11:59:22 +130018249#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018250TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18251
18252#if defined(VK_USE_PLATFORM_XCB_KHR)
18253 VkSurfaceKHR surface = VK_NULL_HANDLE;
18254
18255 VkResult err;
18256 bool pass;
18257 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18258 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18259 // uint32_t swapchain_image_count = 0;
18260 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18261 // uint32_t image_index = 0;
18262 // VkPresentInfoKHR present_info = {};
18263
Tony Barbour1fa09702017-03-16 12:09:08 -060018264 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018265
18266 // Use the create function from one of the VK_KHR_*_surface extension in
18267 // order to create a surface, testing all known errors in the process,
18268 // before successfully creating a surface:
18269 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18271 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18272 pass = (err != VK_SUCCESS);
18273 ASSERT_TRUE(pass);
18274 m_errorMonitor->VerifyFound();
18275
18276 // Next, try to create a surface with the wrong
18277 // VkXcbSurfaceCreateInfoKHR::sType:
18278 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18279 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18281 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18282 pass = (err != VK_SUCCESS);
18283 ASSERT_TRUE(pass);
18284 m_errorMonitor->VerifyFound();
18285
18286 // Create a native window, and then correctly create a surface:
18287 xcb_connection_t *connection;
18288 xcb_screen_t *screen;
18289 xcb_window_t xcb_window;
18290 xcb_intern_atom_reply_t *atom_wm_delete_window;
18291
18292 const xcb_setup_t *setup;
18293 xcb_screen_iterator_t iter;
18294 int scr;
18295 uint32_t value_mask, value_list[32];
18296 int width = 1;
18297 int height = 1;
18298
18299 connection = xcb_connect(NULL, &scr);
18300 ASSERT_TRUE(connection != NULL);
18301 setup = xcb_get_setup(connection);
18302 iter = xcb_setup_roots_iterator(setup);
18303 while (scr-- > 0)
18304 xcb_screen_next(&iter);
18305 screen = iter.data;
18306
18307 xcb_window = xcb_generate_id(connection);
18308
18309 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18310 value_list[0] = screen->black_pixel;
18311 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18312
18313 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18314 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18315
18316 /* Magic code that will send notification when window is destroyed */
18317 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18318 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18319
18320 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18321 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18322 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18323 free(reply);
18324
18325 xcb_map_window(connection, xcb_window);
18326
18327 // Force the x/y coordinates to 100,100 results are identical in consecutive
18328 // runs
18329 const uint32_t coords[] = { 100, 100 };
18330 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18331
18332 // Finally, try to correctly create a surface:
18333 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18334 xcb_create_info.pNext = NULL;
18335 xcb_create_info.flags = 0;
18336 xcb_create_info.connection = connection;
18337 xcb_create_info.window = xcb_window;
18338 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18339 pass = (err == VK_SUCCESS);
18340 ASSERT_TRUE(pass);
18341
18342 // Check if surface supports presentation:
18343
18344 // 1st, do so without having queried the queue families:
18345 VkBool32 supported = false;
18346 // TODO: Get the following error to come out:
18347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18348 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18349 "function");
18350 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18351 pass = (err != VK_SUCCESS);
18352 // ASSERT_TRUE(pass);
18353 // m_errorMonitor->VerifyFound();
18354
18355 // Next, query a queue family index that's too large:
18356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18357 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18358 pass = (err != VK_SUCCESS);
18359 ASSERT_TRUE(pass);
18360 m_errorMonitor->VerifyFound();
18361
18362 // Finally, do so correctly:
18363 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18364 // SUPPORTED
18365 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18366 pass = (err == VK_SUCCESS);
18367 ASSERT_TRUE(pass);
18368
18369 // Before proceeding, try to create a swapchain without having called
18370 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18371 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18372 swapchain_create_info.pNext = NULL;
18373 swapchain_create_info.flags = 0;
18374 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18375 swapchain_create_info.surface = surface;
18376 swapchain_create_info.imageArrayLayers = 1;
18377 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18378 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18380 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18381 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18382 pass = (err != VK_SUCCESS);
18383 ASSERT_TRUE(pass);
18384 m_errorMonitor->VerifyFound();
18385
18386 // Get the surface capabilities:
18387 VkSurfaceCapabilitiesKHR surface_capabilities;
18388
18389 // Do so correctly (only error logged by this entrypoint is if the
18390 // extension isn't enabled):
18391 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18392 pass = (err == VK_SUCCESS);
18393 ASSERT_TRUE(pass);
18394
18395 // Get the surface formats:
18396 uint32_t surface_format_count;
18397
18398 // First, try without a pointer to surface_format_count:
18399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18400 "specified as NULL");
18401 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18402 pass = (err == VK_SUCCESS);
18403 ASSERT_TRUE(pass);
18404 m_errorMonitor->VerifyFound();
18405
18406 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18407 // correctly done a 1st try (to get the count):
18408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18409 surface_format_count = 0;
18410 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18411 pass = (err == VK_SUCCESS);
18412 ASSERT_TRUE(pass);
18413 m_errorMonitor->VerifyFound();
18414
18415 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18416 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18417 pass = (err == VK_SUCCESS);
18418 ASSERT_TRUE(pass);
18419
18420 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18421 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18422
18423 // Next, do a 2nd try with surface_format_count being set too high:
18424 surface_format_count += 5;
18425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18426 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18427 pass = (err == VK_SUCCESS);
18428 ASSERT_TRUE(pass);
18429 m_errorMonitor->VerifyFound();
18430
18431 // Finally, do a correct 1st and 2nd try:
18432 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18433 pass = (err == VK_SUCCESS);
18434 ASSERT_TRUE(pass);
18435 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18436 pass = (err == VK_SUCCESS);
18437 ASSERT_TRUE(pass);
18438
18439 // Get the surface present modes:
18440 uint32_t surface_present_mode_count;
18441
18442 // First, try without a pointer to surface_format_count:
18443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18444 "specified as NULL");
18445
18446 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18447 pass = (err == VK_SUCCESS);
18448 ASSERT_TRUE(pass);
18449 m_errorMonitor->VerifyFound();
18450
18451 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18452 // correctly done a 1st try (to get the count):
18453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18454 surface_present_mode_count = 0;
18455 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18456 (VkPresentModeKHR *)&surface_present_mode_count);
18457 pass = (err == VK_SUCCESS);
18458 ASSERT_TRUE(pass);
18459 m_errorMonitor->VerifyFound();
18460
18461 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18462 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18463 pass = (err == VK_SUCCESS);
18464 ASSERT_TRUE(pass);
18465
18466 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18467 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18468
18469 // Next, do a 2nd try with surface_format_count being set too high:
18470 surface_present_mode_count += 5;
18471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18472 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18473 pass = (err == VK_SUCCESS);
18474 ASSERT_TRUE(pass);
18475 m_errorMonitor->VerifyFound();
18476
18477 // Finally, do a correct 1st and 2nd try:
18478 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18479 pass = (err == VK_SUCCESS);
18480 ASSERT_TRUE(pass);
18481 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18482 pass = (err == VK_SUCCESS);
18483 ASSERT_TRUE(pass);
18484
18485 // Create a swapchain:
18486
18487 // First, try without a pointer to swapchain_create_info:
18488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18489 "specified as NULL");
18490
18491 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18492 pass = (err != VK_SUCCESS);
18493 ASSERT_TRUE(pass);
18494 m_errorMonitor->VerifyFound();
18495
18496 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18497 // sType:
18498 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18500
18501 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18502 pass = (err != VK_SUCCESS);
18503 ASSERT_TRUE(pass);
18504 m_errorMonitor->VerifyFound();
18505
18506 // Next, call with a NULL swapchain pointer:
18507 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18508 swapchain_create_info.pNext = NULL;
18509 swapchain_create_info.flags = 0;
18510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18511 "specified as NULL");
18512
18513 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18514 pass = (err != VK_SUCCESS);
18515 ASSERT_TRUE(pass);
18516 m_errorMonitor->VerifyFound();
18517
18518 // TODO: Enhance swapchain layer so that
18519 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18520
18521 // Next, call with a queue family index that's too large:
18522 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18523 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18524 swapchain_create_info.queueFamilyIndexCount = 2;
18525 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18527 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18528 pass = (err != VK_SUCCESS);
18529 ASSERT_TRUE(pass);
18530 m_errorMonitor->VerifyFound();
18531
18532 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18533 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18534 swapchain_create_info.queueFamilyIndexCount = 1;
18535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18536 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18537 "pCreateInfo->pQueueFamilyIndices).");
18538 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18539 pass = (err != VK_SUCCESS);
18540 ASSERT_TRUE(pass);
18541 m_errorMonitor->VerifyFound();
18542
18543 // Next, call with an invalid imageSharingMode:
18544 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18545 swapchain_create_info.queueFamilyIndexCount = 1;
18546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18547 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18548 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18549 pass = (err != VK_SUCCESS);
18550 ASSERT_TRUE(pass);
18551 m_errorMonitor->VerifyFound();
18552 // Fix for the future:
18553 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18554 // SUPPORTED
18555 swapchain_create_info.queueFamilyIndexCount = 0;
18556 queueFamilyIndex[0] = 0;
18557 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18558
18559 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18560 // Get the images from a swapchain:
18561 // Acquire an image from a swapchain:
18562 // Present an image to a swapchain:
18563 // Destroy the swapchain:
18564
18565 // TODOs:
18566 //
18567 // - Try destroying the device without first destroying the swapchain
18568 //
18569 // - Try destroying the device without first destroying the surface
18570 //
18571 // - Try destroying the surface without first destroying the swapchain
18572
18573 // Destroy the surface:
18574 vkDestroySurfaceKHR(instance(), surface, NULL);
18575
18576 // Tear down the window:
18577 xcb_destroy_window(connection, xcb_window);
18578 xcb_disconnect(connection);
18579
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018580#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018581 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018582#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018583}
Chris Forbes09368e42016-10-13 11:59:22 +130018584#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018585
18586//
18587// POSITIVE VALIDATION TESTS
18588//
18589// These tests do not expect to encounter ANY validation errors pass only if this is true
18590
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018591TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18592 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018593 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018594 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18595
18596 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18597 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018598 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018599 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18600 command_buffer_allocate_info.commandBufferCount = 1;
18601
18602 VkCommandBuffer secondary_command_buffer;
18603 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18604 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18605 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18606 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18607 command_buffer_inheritance_info.renderPass = m_renderPass;
18608 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18609
18610 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18611 command_buffer_begin_info.flags =
18612 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18613 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18614
18615 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18616 VkClearAttachment color_attachment;
18617 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18618 color_attachment.clearValue.color.float32[0] = 0;
18619 color_attachment.clearValue.color.float32[1] = 0;
18620 color_attachment.clearValue.color.float32[2] = 0;
18621 color_attachment.clearValue.color.float32[3] = 0;
18622 color_attachment.colorAttachment = 0;
18623 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18624 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18625}
18626
Tobin Ehlise0006882016-11-03 10:14:28 -060018627TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018628 TEST_DESCRIPTION(
18629 "Perform an image layout transition in a secondary command buffer followed "
18630 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018631 VkResult err;
18632 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018633 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018634 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018635 if (!depth_format) {
18636 return;
18637 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018638 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18639 // Allocate a secondary and primary cmd buffer
18640 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18641 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018642 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018643 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18644 command_buffer_allocate_info.commandBufferCount = 1;
18645
18646 VkCommandBuffer secondary_command_buffer;
18647 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18648 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18649 VkCommandBuffer primary_command_buffer;
18650 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18651 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18652 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18653 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18654 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18655 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18656 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18657
18658 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18659 ASSERT_VK_SUCCESS(err);
18660 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018661 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 -060018662 ASSERT_TRUE(image.initialized());
18663 VkImageMemoryBarrier img_barrier = {};
18664 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18665 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18666 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18667 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18668 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18669 img_barrier.image = image.handle();
18670 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18671 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18672 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18673 img_barrier.subresourceRange.baseArrayLayer = 0;
18674 img_barrier.subresourceRange.baseMipLevel = 0;
18675 img_barrier.subresourceRange.layerCount = 1;
18676 img_barrier.subresourceRange.levelCount = 1;
18677 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18678 0, nullptr, 1, &img_barrier);
18679 err = vkEndCommandBuffer(secondary_command_buffer);
18680 ASSERT_VK_SUCCESS(err);
18681
18682 // Now update primary cmd buffer to execute secondary and transitions image
18683 command_buffer_begin_info.pInheritanceInfo = nullptr;
18684 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18685 ASSERT_VK_SUCCESS(err);
18686 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18687 VkImageMemoryBarrier img_barrier2 = {};
18688 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18689 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18690 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18691 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18692 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18693 img_barrier2.image = image.handle();
18694 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18695 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18696 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18697 img_barrier2.subresourceRange.baseArrayLayer = 0;
18698 img_barrier2.subresourceRange.baseMipLevel = 0;
18699 img_barrier2.subresourceRange.layerCount = 1;
18700 img_barrier2.subresourceRange.levelCount = 1;
18701 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18702 nullptr, 1, &img_barrier2);
18703 err = vkEndCommandBuffer(primary_command_buffer);
18704 ASSERT_VK_SUCCESS(err);
18705 VkSubmitInfo submit_info = {};
18706 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18707 submit_info.commandBufferCount = 1;
18708 submit_info.pCommandBuffers = &primary_command_buffer;
18709 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18710 ASSERT_VK_SUCCESS(err);
18711 m_errorMonitor->VerifyNotFound();
18712 err = vkDeviceWaitIdle(m_device->device());
18713 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018714 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18715 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018716}
18717
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018718// This is a positive test. No failures are expected.
18719TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018720 TEST_DESCRIPTION(
18721 "Ensure that the vkUpdateDescriptorSets validation code "
18722 "is ignoring VkWriteDescriptorSet members that are not "
18723 "related to the descriptor type specified by "
18724 "VkWriteDescriptorSet::descriptorType. Correct "
18725 "validation behavior will result in the test running to "
18726 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018727
18728 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18729
Tony Barbour1fa09702017-03-16 12:09:08 -060018730 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018731
18732 // Image Case
18733 {
18734 m_errorMonitor->ExpectSuccess();
18735
18736 VkImage image;
18737 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18738 const int32_t tex_width = 32;
18739 const int32_t tex_height = 32;
18740 VkImageCreateInfo image_create_info = {};
18741 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18742 image_create_info.pNext = NULL;
18743 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18744 image_create_info.format = tex_format;
18745 image_create_info.extent.width = tex_width;
18746 image_create_info.extent.height = tex_height;
18747 image_create_info.extent.depth = 1;
18748 image_create_info.mipLevels = 1;
18749 image_create_info.arrayLayers = 1;
18750 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18751 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18752 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18753 image_create_info.flags = 0;
18754 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18755 ASSERT_VK_SUCCESS(err);
18756
18757 VkMemoryRequirements memory_reqs;
18758 VkDeviceMemory image_memory;
18759 bool pass;
18760 VkMemoryAllocateInfo memory_info = {};
18761 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18762 memory_info.pNext = NULL;
18763 memory_info.allocationSize = 0;
18764 memory_info.memoryTypeIndex = 0;
18765 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18766 memory_info.allocationSize = memory_reqs.size;
18767 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18768 ASSERT_TRUE(pass);
18769 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18770 ASSERT_VK_SUCCESS(err);
18771 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18772 ASSERT_VK_SUCCESS(err);
18773
18774 VkImageViewCreateInfo image_view_create_info = {};
18775 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18776 image_view_create_info.image = image;
18777 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18778 image_view_create_info.format = tex_format;
18779 image_view_create_info.subresourceRange.layerCount = 1;
18780 image_view_create_info.subresourceRange.baseMipLevel = 0;
18781 image_view_create_info.subresourceRange.levelCount = 1;
18782 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18783
18784 VkImageView view;
18785 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18786 ASSERT_VK_SUCCESS(err);
18787
18788 VkDescriptorPoolSize ds_type_count = {};
18789 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18790 ds_type_count.descriptorCount = 1;
18791
18792 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18793 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18794 ds_pool_ci.pNext = NULL;
18795 ds_pool_ci.maxSets = 1;
18796 ds_pool_ci.poolSizeCount = 1;
18797 ds_pool_ci.pPoolSizes = &ds_type_count;
18798
18799 VkDescriptorPool ds_pool;
18800 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18801 ASSERT_VK_SUCCESS(err);
18802
18803 VkDescriptorSetLayoutBinding dsl_binding = {};
18804 dsl_binding.binding = 0;
18805 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18806 dsl_binding.descriptorCount = 1;
18807 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18808 dsl_binding.pImmutableSamplers = NULL;
18809
18810 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18811 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18812 ds_layout_ci.pNext = NULL;
18813 ds_layout_ci.bindingCount = 1;
18814 ds_layout_ci.pBindings = &dsl_binding;
18815 VkDescriptorSetLayout ds_layout;
18816 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18817 ASSERT_VK_SUCCESS(err);
18818
18819 VkDescriptorSet descriptor_set;
18820 VkDescriptorSetAllocateInfo alloc_info = {};
18821 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18822 alloc_info.descriptorSetCount = 1;
18823 alloc_info.descriptorPool = ds_pool;
18824 alloc_info.pSetLayouts = &ds_layout;
18825 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18826 ASSERT_VK_SUCCESS(err);
18827
18828 VkDescriptorImageInfo image_info = {};
18829 image_info.imageView = view;
18830 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18831
18832 VkWriteDescriptorSet descriptor_write;
18833 memset(&descriptor_write, 0, sizeof(descriptor_write));
18834 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18835 descriptor_write.dstSet = descriptor_set;
18836 descriptor_write.dstBinding = 0;
18837 descriptor_write.descriptorCount = 1;
18838 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18839 descriptor_write.pImageInfo = &image_info;
18840
18841 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18842 // be
18843 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18844 // This will most likely produce a crash if the parameter_validation
18845 // layer
18846 // does not correctly ignore pBufferInfo.
18847 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18848 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18849
18850 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18851
18852 m_errorMonitor->VerifyNotFound();
18853
18854 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18855 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18856 vkDestroyImageView(m_device->device(), view, NULL);
18857 vkDestroyImage(m_device->device(), image, NULL);
18858 vkFreeMemory(m_device->device(), image_memory, NULL);
18859 }
18860
18861 // Buffer Case
18862 {
18863 m_errorMonitor->ExpectSuccess();
18864
18865 VkBuffer buffer;
18866 uint32_t queue_family_index = 0;
18867 VkBufferCreateInfo buffer_create_info = {};
18868 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18869 buffer_create_info.size = 1024;
18870 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18871 buffer_create_info.queueFamilyIndexCount = 1;
18872 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18873
18874 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18875 ASSERT_VK_SUCCESS(err);
18876
18877 VkMemoryRequirements memory_reqs;
18878 VkDeviceMemory buffer_memory;
18879 bool pass;
18880 VkMemoryAllocateInfo memory_info = {};
18881 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18882 memory_info.pNext = NULL;
18883 memory_info.allocationSize = 0;
18884 memory_info.memoryTypeIndex = 0;
18885
18886 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18887 memory_info.allocationSize = memory_reqs.size;
18888 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18889 ASSERT_TRUE(pass);
18890
18891 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18892 ASSERT_VK_SUCCESS(err);
18893 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18894 ASSERT_VK_SUCCESS(err);
18895
18896 VkDescriptorPoolSize ds_type_count = {};
18897 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18898 ds_type_count.descriptorCount = 1;
18899
18900 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18901 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18902 ds_pool_ci.pNext = NULL;
18903 ds_pool_ci.maxSets = 1;
18904 ds_pool_ci.poolSizeCount = 1;
18905 ds_pool_ci.pPoolSizes = &ds_type_count;
18906
18907 VkDescriptorPool ds_pool;
18908 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18909 ASSERT_VK_SUCCESS(err);
18910
18911 VkDescriptorSetLayoutBinding dsl_binding = {};
18912 dsl_binding.binding = 0;
18913 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18914 dsl_binding.descriptorCount = 1;
18915 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18916 dsl_binding.pImmutableSamplers = NULL;
18917
18918 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18919 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18920 ds_layout_ci.pNext = NULL;
18921 ds_layout_ci.bindingCount = 1;
18922 ds_layout_ci.pBindings = &dsl_binding;
18923 VkDescriptorSetLayout ds_layout;
18924 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18925 ASSERT_VK_SUCCESS(err);
18926
18927 VkDescriptorSet descriptor_set;
18928 VkDescriptorSetAllocateInfo alloc_info = {};
18929 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18930 alloc_info.descriptorSetCount = 1;
18931 alloc_info.descriptorPool = ds_pool;
18932 alloc_info.pSetLayouts = &ds_layout;
18933 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18934 ASSERT_VK_SUCCESS(err);
18935
18936 VkDescriptorBufferInfo buffer_info = {};
18937 buffer_info.buffer = buffer;
18938 buffer_info.offset = 0;
18939 buffer_info.range = 1024;
18940
18941 VkWriteDescriptorSet descriptor_write;
18942 memset(&descriptor_write, 0, sizeof(descriptor_write));
18943 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18944 descriptor_write.dstSet = descriptor_set;
18945 descriptor_write.dstBinding = 0;
18946 descriptor_write.descriptorCount = 1;
18947 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18948 descriptor_write.pBufferInfo = &buffer_info;
18949
18950 // Set pImageInfo and pTexelBufferView to invalid values, which should
18951 // be
18952 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18953 // This will most likely produce a crash if the parameter_validation
18954 // layer
18955 // does not correctly ignore pImageInfo.
18956 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18957 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18958
18959 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18960
18961 m_errorMonitor->VerifyNotFound();
18962
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018963 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18964 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18965 vkDestroyBuffer(m_device->device(), buffer, NULL);
18966 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18967 }
18968
18969 // Texel Buffer Case
18970 {
18971 m_errorMonitor->ExpectSuccess();
18972
18973 VkBuffer buffer;
18974 uint32_t queue_family_index = 0;
18975 VkBufferCreateInfo buffer_create_info = {};
18976 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18977 buffer_create_info.size = 1024;
18978 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18979 buffer_create_info.queueFamilyIndexCount = 1;
18980 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18981
18982 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18983 ASSERT_VK_SUCCESS(err);
18984
18985 VkMemoryRequirements memory_reqs;
18986 VkDeviceMemory buffer_memory;
18987 bool pass;
18988 VkMemoryAllocateInfo memory_info = {};
18989 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18990 memory_info.pNext = NULL;
18991 memory_info.allocationSize = 0;
18992 memory_info.memoryTypeIndex = 0;
18993
18994 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18995 memory_info.allocationSize = memory_reqs.size;
18996 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18997 ASSERT_TRUE(pass);
18998
18999 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19000 ASSERT_VK_SUCCESS(err);
19001 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19002 ASSERT_VK_SUCCESS(err);
19003
19004 VkBufferViewCreateInfo buff_view_ci = {};
19005 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
19006 buff_view_ci.buffer = buffer;
19007 buff_view_ci.format = VK_FORMAT_R8_UNORM;
19008 buff_view_ci.range = VK_WHOLE_SIZE;
19009 VkBufferView buffer_view;
19010 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19011
19012 VkDescriptorPoolSize ds_type_count = {};
19013 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19014 ds_type_count.descriptorCount = 1;
19015
19016 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19017 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19018 ds_pool_ci.pNext = NULL;
19019 ds_pool_ci.maxSets = 1;
19020 ds_pool_ci.poolSizeCount = 1;
19021 ds_pool_ci.pPoolSizes = &ds_type_count;
19022
19023 VkDescriptorPool ds_pool;
19024 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19025 ASSERT_VK_SUCCESS(err);
19026
19027 VkDescriptorSetLayoutBinding dsl_binding = {};
19028 dsl_binding.binding = 0;
19029 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19030 dsl_binding.descriptorCount = 1;
19031 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19032 dsl_binding.pImmutableSamplers = NULL;
19033
19034 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19035 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19036 ds_layout_ci.pNext = NULL;
19037 ds_layout_ci.bindingCount = 1;
19038 ds_layout_ci.pBindings = &dsl_binding;
19039 VkDescriptorSetLayout ds_layout;
19040 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19041 ASSERT_VK_SUCCESS(err);
19042
19043 VkDescriptorSet descriptor_set;
19044 VkDescriptorSetAllocateInfo alloc_info = {};
19045 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19046 alloc_info.descriptorSetCount = 1;
19047 alloc_info.descriptorPool = ds_pool;
19048 alloc_info.pSetLayouts = &ds_layout;
19049 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19050 ASSERT_VK_SUCCESS(err);
19051
19052 VkWriteDescriptorSet descriptor_write;
19053 memset(&descriptor_write, 0, sizeof(descriptor_write));
19054 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19055 descriptor_write.dstSet = descriptor_set;
19056 descriptor_write.dstBinding = 0;
19057 descriptor_write.descriptorCount = 1;
19058 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19059 descriptor_write.pTexelBufferView = &buffer_view;
19060
19061 // Set pImageInfo and pBufferInfo to invalid values, which should be
19062 // ignored for descriptorType ==
19063 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19064 // This will most likely produce a crash if the parameter_validation
19065 // layer
19066 // does not correctly ignore pImageInfo and pBufferInfo.
19067 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19068 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19069
19070 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19071
19072 m_errorMonitor->VerifyNotFound();
19073
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019074 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19075 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19076 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19077 vkDestroyBuffer(m_device->device(), buffer, NULL);
19078 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19079 }
19080}
19081
Tobin Ehlisf7428442016-10-25 07:58:24 -060019082TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19083 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19084
Tony Barbour1fa09702017-03-16 12:09:08 -060019085 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019086 // Create layout where two binding #s are "1"
19087 static const uint32_t NUM_BINDINGS = 3;
19088 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19089 dsl_binding[0].binding = 1;
19090 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19091 dsl_binding[0].descriptorCount = 1;
19092 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19093 dsl_binding[0].pImmutableSamplers = NULL;
19094 dsl_binding[1].binding = 0;
19095 dsl_binding[1].descriptorCount = 1;
19096 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19097 dsl_binding[1].descriptorCount = 1;
19098 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19099 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019100 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019101 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19102 dsl_binding[2].descriptorCount = 1;
19103 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19104 dsl_binding[2].pImmutableSamplers = NULL;
19105
19106 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19107 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19108 ds_layout_ci.pNext = NULL;
19109 ds_layout_ci.bindingCount = NUM_BINDINGS;
19110 ds_layout_ci.pBindings = dsl_binding;
19111 VkDescriptorSetLayout ds_layout;
19112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19113 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19114 m_errorMonitor->VerifyFound();
19115}
19116
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019117TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019118 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19119
Tony Barbour1fa09702017-03-16 12:09:08 -060019120 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019121
Tony Barbour552f6c02016-12-21 14:34:07 -070019122 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019123
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019124 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19125
19126 {
19127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19128 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19129 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19130 m_errorMonitor->VerifyFound();
19131 }
19132
19133 {
19134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19135 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19136 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19137 m_errorMonitor->VerifyFound();
19138 }
19139
19140 {
19141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19142 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
19143 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19144 m_errorMonitor->VerifyFound();
19145 }
19146
19147 {
19148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19149 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
19150 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19151 m_errorMonitor->VerifyFound();
19152 }
19153
19154 {
19155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
19156 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
19157 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19158 m_errorMonitor->VerifyFound();
19159 }
19160
19161 {
19162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
19163 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19164 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19165 m_errorMonitor->VerifyFound();
19166 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019167
19168 {
19169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19170 VkRect2D scissor = {{-1, 0}, {16, 16}};
19171 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19172 m_errorMonitor->VerifyFound();
19173 }
19174
19175 {
19176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19177 VkRect2D scissor = {{0, -2}, {16, 16}};
19178 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19179 m_errorMonitor->VerifyFound();
19180 }
19181
19182 {
19183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19184 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
19185 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19186 m_errorMonitor->VerifyFound();
19187 }
19188
19189 {
19190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
19191 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19192 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19193 m_errorMonitor->VerifyFound();
19194 }
19195
Tony Barbour552f6c02016-12-21 14:34:07 -070019196 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019197}
19198
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019199// This is a positive test. No failures are expected.
19200TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19201 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19202 VkResult err;
19203
Tony Barbour1fa09702017-03-16 12:09:08 -060019204 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019205 m_errorMonitor->ExpectSuccess();
19206 VkDescriptorPoolSize ds_type_count = {};
19207 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19208 ds_type_count.descriptorCount = 2;
19209
19210 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19211 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19212 ds_pool_ci.pNext = NULL;
19213 ds_pool_ci.maxSets = 1;
19214 ds_pool_ci.poolSizeCount = 1;
19215 ds_pool_ci.pPoolSizes = &ds_type_count;
19216
19217 VkDescriptorPool ds_pool;
19218 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19219 ASSERT_VK_SUCCESS(err);
19220
19221 // Create layout with two uniform buffer descriptors w/ empty binding between them
19222 static const uint32_t NUM_BINDINGS = 3;
19223 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19224 dsl_binding[0].binding = 0;
19225 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19226 dsl_binding[0].descriptorCount = 1;
19227 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19228 dsl_binding[0].pImmutableSamplers = NULL;
19229 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019230 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019231 dsl_binding[2].binding = 2;
19232 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19233 dsl_binding[2].descriptorCount = 1;
19234 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19235 dsl_binding[2].pImmutableSamplers = NULL;
19236
19237 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19238 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19239 ds_layout_ci.pNext = NULL;
19240 ds_layout_ci.bindingCount = NUM_BINDINGS;
19241 ds_layout_ci.pBindings = dsl_binding;
19242 VkDescriptorSetLayout ds_layout;
19243 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19244 ASSERT_VK_SUCCESS(err);
19245
19246 VkDescriptorSet descriptor_set = {};
19247 VkDescriptorSetAllocateInfo alloc_info = {};
19248 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19249 alloc_info.descriptorSetCount = 1;
19250 alloc_info.descriptorPool = ds_pool;
19251 alloc_info.pSetLayouts = &ds_layout;
19252 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19253 ASSERT_VK_SUCCESS(err);
19254
19255 // Create a buffer to be used for update
19256 VkBufferCreateInfo buff_ci = {};
19257 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19258 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19259 buff_ci.size = 256;
19260 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19261 VkBuffer buffer;
19262 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19263 ASSERT_VK_SUCCESS(err);
19264 // Have to bind memory to buffer before descriptor update
19265 VkMemoryAllocateInfo mem_alloc = {};
19266 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19267 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019268 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019269 mem_alloc.memoryTypeIndex = 0;
19270
19271 VkMemoryRequirements mem_reqs;
19272 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19273 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19274 if (!pass) {
19275 vkDestroyBuffer(m_device->device(), buffer, NULL);
19276 return;
19277 }
19278
19279 VkDeviceMemory mem;
19280 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19281 ASSERT_VK_SUCCESS(err);
19282 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19283 ASSERT_VK_SUCCESS(err);
19284
19285 // Only update the descriptor at binding 2
19286 VkDescriptorBufferInfo buff_info = {};
19287 buff_info.buffer = buffer;
19288 buff_info.offset = 0;
19289 buff_info.range = VK_WHOLE_SIZE;
19290 VkWriteDescriptorSet descriptor_write = {};
19291 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19292 descriptor_write.dstBinding = 2;
19293 descriptor_write.descriptorCount = 1;
19294 descriptor_write.pTexelBufferView = nullptr;
19295 descriptor_write.pBufferInfo = &buff_info;
19296 descriptor_write.pImageInfo = nullptr;
19297 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19298 descriptor_write.dstSet = descriptor_set;
19299
19300 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19301
19302 m_errorMonitor->VerifyNotFound();
19303 // Cleanup
19304 vkFreeMemory(m_device->device(), mem, NULL);
19305 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19306 vkDestroyBuffer(m_device->device(), buffer, NULL);
19307 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19308}
19309
19310// This is a positive test. No failures are expected.
19311TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19312 VkResult err;
19313 bool pass;
19314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019315 TEST_DESCRIPTION(
19316 "Create a buffer, allocate memory, bind memory, destroy "
19317 "the buffer, create an image, and bind the same memory to "
19318 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019319
19320 m_errorMonitor->ExpectSuccess();
19321
Tony Barbour1fa09702017-03-16 12:09:08 -060019322 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019323
19324 VkBuffer buffer;
19325 VkImage image;
19326 VkDeviceMemory mem;
19327 VkMemoryRequirements mem_reqs;
19328
19329 VkBufferCreateInfo buf_info = {};
19330 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19331 buf_info.pNext = NULL;
19332 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19333 buf_info.size = 256;
19334 buf_info.queueFamilyIndexCount = 0;
19335 buf_info.pQueueFamilyIndices = NULL;
19336 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19337 buf_info.flags = 0;
19338 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19339 ASSERT_VK_SUCCESS(err);
19340
19341 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19342
19343 VkMemoryAllocateInfo alloc_info = {};
19344 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19345 alloc_info.pNext = NULL;
19346 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019347
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019348 // Ensure memory is big enough for both bindings
19349 alloc_info.allocationSize = 0x10000;
19350
19351 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19352 if (!pass) {
19353 vkDestroyBuffer(m_device->device(), buffer, NULL);
19354 return;
19355 }
19356
19357 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19358 ASSERT_VK_SUCCESS(err);
19359
19360 uint8_t *pData;
19361 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19362 ASSERT_VK_SUCCESS(err);
19363
19364 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19365
19366 vkUnmapMemory(m_device->device(), mem);
19367
19368 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19369 ASSERT_VK_SUCCESS(err);
19370
19371 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19372 // memory. In fact, it was never used by the GPU.
19373 // Just be be sure, wait for idle.
19374 vkDestroyBuffer(m_device->device(), buffer, NULL);
19375 vkDeviceWaitIdle(m_device->device());
19376
Tobin Ehlis6a005702016-12-28 15:25:56 -070019377 // Use optimal as some platforms report linear support but then fail image creation
19378 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19379 VkImageFormatProperties image_format_properties;
19380 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19381 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19382 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019383 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019384 vkFreeMemory(m_device->device(), mem, NULL);
19385 return;
19386 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019387 VkImageCreateInfo image_create_info = {};
19388 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19389 image_create_info.pNext = NULL;
19390 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19391 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19392 image_create_info.extent.width = 64;
19393 image_create_info.extent.height = 64;
19394 image_create_info.extent.depth = 1;
19395 image_create_info.mipLevels = 1;
19396 image_create_info.arrayLayers = 1;
19397 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019398 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019399 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19400 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19401 image_create_info.queueFamilyIndexCount = 0;
19402 image_create_info.pQueueFamilyIndices = NULL;
19403 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19404 image_create_info.flags = 0;
19405
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019406 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019407 * to be textures or it will be the staging image if they are not.
19408 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019409 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19410 ASSERT_VK_SUCCESS(err);
19411
19412 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19413
Tobin Ehlis6a005702016-12-28 15:25:56 -070019414 VkMemoryAllocateInfo mem_alloc = {};
19415 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19416 mem_alloc.pNext = NULL;
19417 mem_alloc.allocationSize = 0;
19418 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019419 mem_alloc.allocationSize = mem_reqs.size;
19420
19421 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19422 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019423 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019424 vkDestroyImage(m_device->device(), image, NULL);
19425 return;
19426 }
19427
19428 // VALIDATION FAILURE:
19429 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19430 ASSERT_VK_SUCCESS(err);
19431
19432 m_errorMonitor->VerifyNotFound();
19433
19434 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019435 vkDestroyImage(m_device->device(), image, NULL);
19436}
19437
Tony Barbourab713912017-02-02 14:17:35 -070019438// This is a positive test. No failures are expected.
19439TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19440 VkResult err;
19441
19442 TEST_DESCRIPTION(
19443 "Call all applicable destroy and free routines with NULL"
19444 "handles, expecting no validation errors");
19445
19446 m_errorMonitor->ExpectSuccess();
19447
Tony Barbour1fa09702017-03-16 12:09:08 -060019448 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019449 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19450 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19451 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19452 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19453 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19454 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19455 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19456 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19457 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19458 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19459 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19460 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19461 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19462 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19463 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19464 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19465 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19466 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19467 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19468 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19469
19470 VkCommandPool command_pool;
19471 VkCommandPoolCreateInfo pool_create_info{};
19472 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19473 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19474 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19475 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19476 VkCommandBuffer command_buffers[3] = {};
19477 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19478 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19479 command_buffer_allocate_info.commandPool = command_pool;
19480 command_buffer_allocate_info.commandBufferCount = 1;
19481 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19482 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19483 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19484 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19485
19486 VkDescriptorPoolSize ds_type_count = {};
19487 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19488 ds_type_count.descriptorCount = 1;
19489
19490 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19491 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19492 ds_pool_ci.pNext = NULL;
19493 ds_pool_ci.maxSets = 1;
19494 ds_pool_ci.poolSizeCount = 1;
19495 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19496 ds_pool_ci.pPoolSizes = &ds_type_count;
19497
19498 VkDescriptorPool ds_pool;
19499 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19500 ASSERT_VK_SUCCESS(err);
19501
19502 VkDescriptorSetLayoutBinding dsl_binding = {};
19503 dsl_binding.binding = 2;
19504 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19505 dsl_binding.descriptorCount = 1;
19506 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19507 dsl_binding.pImmutableSamplers = NULL;
19508 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19509 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19510 ds_layout_ci.pNext = NULL;
19511 ds_layout_ci.bindingCount = 1;
19512 ds_layout_ci.pBindings = &dsl_binding;
19513 VkDescriptorSetLayout ds_layout;
19514 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19515 ASSERT_VK_SUCCESS(err);
19516
19517 VkDescriptorSet descriptor_sets[3] = {};
19518 VkDescriptorSetAllocateInfo alloc_info = {};
19519 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19520 alloc_info.descriptorSetCount = 1;
19521 alloc_info.descriptorPool = ds_pool;
19522 alloc_info.pSetLayouts = &ds_layout;
19523 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19524 ASSERT_VK_SUCCESS(err);
19525 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19526 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19527 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19528
19529 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19530
19531 m_errorMonitor->VerifyNotFound();
19532}
19533
Tony Barbour626994c2017-02-08 15:29:37 -070019534TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019535 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019536
19537 m_errorMonitor->ExpectSuccess();
19538
Tony Barbour1fa09702017-03-16 12:09:08 -060019539 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019540 VkCommandBuffer cmd_bufs[4];
19541 VkCommandBufferAllocateInfo alloc_info;
19542 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19543 alloc_info.pNext = NULL;
19544 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019545 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019546 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19547 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19548 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019549 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019550 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19551 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019552 ASSERT_TRUE(image.initialized());
19553 VkCommandBufferBeginInfo cb_binfo;
19554 cb_binfo.pNext = NULL;
19555 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19556 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19557 cb_binfo.flags = 0;
19558 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19559 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19560 VkImageMemoryBarrier img_barrier = {};
19561 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19562 img_barrier.pNext = NULL;
19563 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19564 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19565 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19566 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19567 img_barrier.image = image.handle();
19568 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19569 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19570 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19571 img_barrier.subresourceRange.baseArrayLayer = 0;
19572 img_barrier.subresourceRange.baseMipLevel = 0;
19573 img_barrier.subresourceRange.layerCount = 1;
19574 img_barrier.subresourceRange.levelCount = 1;
19575 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19576 &img_barrier);
19577 vkEndCommandBuffer(cmd_bufs[0]);
19578 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19579 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19580 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19581 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19582 &img_barrier);
19583 vkEndCommandBuffer(cmd_bufs[1]);
19584 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19585 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19586 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19587 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19588 &img_barrier);
19589 vkEndCommandBuffer(cmd_bufs[2]);
19590 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19591 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19592 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19593 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19594 &img_barrier);
19595 vkEndCommandBuffer(cmd_bufs[3]);
19596
19597 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19598 VkSemaphore semaphore1, semaphore2;
19599 VkSemaphoreCreateInfo semaphore_create_info{};
19600 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19601 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19602 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19603 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19604 VkSubmitInfo submit_info[3];
19605 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19606 submit_info[0].pNext = nullptr;
19607 submit_info[0].commandBufferCount = 1;
19608 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19609 submit_info[0].signalSemaphoreCount = 1;
19610 submit_info[0].pSignalSemaphores = &semaphore1;
19611 submit_info[0].waitSemaphoreCount = 0;
19612 submit_info[0].pWaitDstStageMask = nullptr;
19613 submit_info[0].pWaitDstStageMask = flags;
19614 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19615 submit_info[1].pNext = nullptr;
19616 submit_info[1].commandBufferCount = 1;
19617 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19618 submit_info[1].waitSemaphoreCount = 1;
19619 submit_info[1].pWaitSemaphores = &semaphore1;
19620 submit_info[1].signalSemaphoreCount = 1;
19621 submit_info[1].pSignalSemaphores = &semaphore2;
19622 submit_info[1].pWaitDstStageMask = flags;
19623 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19624 submit_info[2].pNext = nullptr;
19625 submit_info[2].commandBufferCount = 2;
19626 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19627 submit_info[2].waitSemaphoreCount = 1;
19628 submit_info[2].pWaitSemaphores = &semaphore2;
19629 submit_info[2].signalSemaphoreCount = 0;
19630 submit_info[2].pSignalSemaphores = nullptr;
19631 submit_info[2].pWaitDstStageMask = flags;
19632 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19633 vkQueueWaitIdle(m_device->m_queue);
19634
19635 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19636 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19637 m_errorMonitor->VerifyNotFound();
19638}
19639
Tobin Ehlis953e8392016-11-17 10:54:13 -070019640TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19641 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19642 // We previously had a bug where dynamic offset of inactive bindings was still being used
19643 VkResult err;
19644 m_errorMonitor->ExpectSuccess();
19645
Tony Barbour1fa09702017-03-16 12:09:08 -060019646 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019647 ASSERT_NO_FATAL_FAILURE(InitViewport());
19648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19649
19650 VkDescriptorPoolSize ds_type_count = {};
19651 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19652 ds_type_count.descriptorCount = 3;
19653
19654 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19655 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19656 ds_pool_ci.pNext = NULL;
19657 ds_pool_ci.maxSets = 1;
19658 ds_pool_ci.poolSizeCount = 1;
19659 ds_pool_ci.pPoolSizes = &ds_type_count;
19660
19661 VkDescriptorPool ds_pool;
19662 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19663 ASSERT_VK_SUCCESS(err);
19664
19665 const uint32_t BINDING_COUNT = 3;
19666 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019667 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019668 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19669 dsl_binding[0].descriptorCount = 1;
19670 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19671 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019672 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019673 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19674 dsl_binding[1].descriptorCount = 1;
19675 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19676 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019677 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019678 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19679 dsl_binding[2].descriptorCount = 1;
19680 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19681 dsl_binding[2].pImmutableSamplers = NULL;
19682
19683 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19684 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19685 ds_layout_ci.pNext = NULL;
19686 ds_layout_ci.bindingCount = BINDING_COUNT;
19687 ds_layout_ci.pBindings = dsl_binding;
19688 VkDescriptorSetLayout ds_layout;
19689 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19690 ASSERT_VK_SUCCESS(err);
19691
19692 VkDescriptorSet descriptor_set;
19693 VkDescriptorSetAllocateInfo alloc_info = {};
19694 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19695 alloc_info.descriptorSetCount = 1;
19696 alloc_info.descriptorPool = ds_pool;
19697 alloc_info.pSetLayouts = &ds_layout;
19698 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19699 ASSERT_VK_SUCCESS(err);
19700
19701 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19702 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19703 pipeline_layout_ci.pNext = NULL;
19704 pipeline_layout_ci.setLayoutCount = 1;
19705 pipeline_layout_ci.pSetLayouts = &ds_layout;
19706
19707 VkPipelineLayout pipeline_layout;
19708 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19709 ASSERT_VK_SUCCESS(err);
19710
19711 // Create two buffers to update the descriptors with
19712 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19713 uint32_t qfi = 0;
19714 VkBufferCreateInfo buffCI = {};
19715 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19716 buffCI.size = 2048;
19717 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19718 buffCI.queueFamilyIndexCount = 1;
19719 buffCI.pQueueFamilyIndices = &qfi;
19720
19721 VkBuffer dyub1;
19722 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19723 ASSERT_VK_SUCCESS(err);
19724 // buffer2
19725 buffCI.size = 1024;
19726 VkBuffer dyub2;
19727 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19728 ASSERT_VK_SUCCESS(err);
19729 // Allocate memory and bind to buffers
19730 VkMemoryAllocateInfo mem_alloc[2] = {};
19731 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19732 mem_alloc[0].pNext = NULL;
19733 mem_alloc[0].memoryTypeIndex = 0;
19734 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19735 mem_alloc[1].pNext = NULL;
19736 mem_alloc[1].memoryTypeIndex = 0;
19737
19738 VkMemoryRequirements mem_reqs1;
19739 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19740 VkMemoryRequirements mem_reqs2;
19741 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19742 mem_alloc[0].allocationSize = mem_reqs1.size;
19743 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19744 mem_alloc[1].allocationSize = mem_reqs2.size;
19745 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19746 if (!pass) {
19747 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19748 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19749 return;
19750 }
19751
19752 VkDeviceMemory mem1;
19753 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19754 ASSERT_VK_SUCCESS(err);
19755 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19756 ASSERT_VK_SUCCESS(err);
19757 VkDeviceMemory mem2;
19758 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19759 ASSERT_VK_SUCCESS(err);
19760 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19761 ASSERT_VK_SUCCESS(err);
19762 // Update descriptors
19763 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19764 buff_info[0].buffer = dyub1;
19765 buff_info[0].offset = 0;
19766 buff_info[0].range = 256;
19767 buff_info[1].buffer = dyub1;
19768 buff_info[1].offset = 256;
19769 buff_info[1].range = 512;
19770 buff_info[2].buffer = dyub2;
19771 buff_info[2].offset = 0;
19772 buff_info[2].range = 512;
19773
19774 VkWriteDescriptorSet descriptor_write;
19775 memset(&descriptor_write, 0, sizeof(descriptor_write));
19776 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19777 descriptor_write.dstSet = descriptor_set;
19778 descriptor_write.dstBinding = 0;
19779 descriptor_write.descriptorCount = BINDING_COUNT;
19780 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19781 descriptor_write.pBufferInfo = buff_info;
19782
19783 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19784
Tony Barbour552f6c02016-12-21 14:34:07 -070019785 m_commandBuffer->BeginCommandBuffer();
19786 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019787
19788 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019789 char const *vsSource =
19790 "#version 450\n"
19791 "\n"
19792 "out gl_PerVertex { \n"
19793 " vec4 gl_Position;\n"
19794 "};\n"
19795 "void main(){\n"
19796 " gl_Position = vec4(1);\n"
19797 "}\n";
19798 char const *fsSource =
19799 "#version 450\n"
19800 "\n"
19801 "layout(location=0) out vec4 x;\n"
19802 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19803 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19804 "void main(){\n"
19805 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19806 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019807 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19808 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19809 VkPipelineObj pipe(m_device);
19810 pipe.SetViewport(m_viewports);
19811 pipe.SetScissor(m_scissors);
19812 pipe.AddShader(&vs);
19813 pipe.AddShader(&fs);
19814 pipe.AddColorAttachment();
19815 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19816
19817 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19818 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19819 // we used to have a bug in this case.
19820 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19821 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19822 &descriptor_set, BINDING_COUNT, dyn_off);
19823 Draw(1, 0, 0, 0);
19824 m_errorMonitor->VerifyNotFound();
19825
19826 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19827 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19828 vkFreeMemory(m_device->device(), mem1, NULL);
19829 vkFreeMemory(m_device->device(), mem2, NULL);
19830
19831 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19832 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19833 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19834}
19835
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019836TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019837 TEST_DESCRIPTION(
19838 "Ensure that validations handling of non-coherent memory "
19839 "mapping while using VK_WHOLE_SIZE does not cause access "
19840 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019841 VkResult err;
19842 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019843 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019844
19845 VkDeviceMemory mem;
19846 VkMemoryRequirements mem_reqs;
19847 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019848 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019849 VkMemoryAllocateInfo alloc_info = {};
19850 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19851 alloc_info.pNext = NULL;
19852 alloc_info.memoryTypeIndex = 0;
19853
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019854 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019855 alloc_info.allocationSize = allocation_size;
19856
19857 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19858 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 -070019859 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019860 if (!pass) {
19861 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019862 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19863 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019864 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019865 pass = m_device->phy().set_memory_type(
19866 mem_reqs.memoryTypeBits, &alloc_info,
19867 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19868 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019869 if (!pass) {
19870 return;
19871 }
19872 }
19873 }
19874
19875 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19876 ASSERT_VK_SUCCESS(err);
19877
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019878 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019879 m_errorMonitor->ExpectSuccess();
19880 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19881 ASSERT_VK_SUCCESS(err);
19882 VkMappedMemoryRange mmr = {};
19883 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19884 mmr.memory = mem;
19885 mmr.offset = 0;
19886 mmr.size = VK_WHOLE_SIZE;
19887 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19888 ASSERT_VK_SUCCESS(err);
19889 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19890 ASSERT_VK_SUCCESS(err);
19891 m_errorMonitor->VerifyNotFound();
19892 vkUnmapMemory(m_device->device(), mem);
19893
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019894 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019895 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019896 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019897 ASSERT_VK_SUCCESS(err);
19898 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19899 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019900 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019901 mmr.size = VK_WHOLE_SIZE;
19902 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19903 ASSERT_VK_SUCCESS(err);
19904 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19905 ASSERT_VK_SUCCESS(err);
19906 m_errorMonitor->VerifyNotFound();
19907 vkUnmapMemory(m_device->device(), mem);
19908
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019909 // Map with offset and size
19910 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019911 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019912 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019913 ASSERT_VK_SUCCESS(err);
19914 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19915 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019916 mmr.offset = 4 * atom_size;
19917 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019918 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19919 ASSERT_VK_SUCCESS(err);
19920 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19921 ASSERT_VK_SUCCESS(err);
19922 m_errorMonitor->VerifyNotFound();
19923 vkUnmapMemory(m_device->device(), mem);
19924
19925 // Map without offset and flush WHOLE_SIZE with two separate offsets
19926 m_errorMonitor->ExpectSuccess();
19927 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19928 ASSERT_VK_SUCCESS(err);
19929 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19930 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019931 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019932 mmr.size = VK_WHOLE_SIZE;
19933 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19934 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019935 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019936 mmr.size = VK_WHOLE_SIZE;
19937 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19938 ASSERT_VK_SUCCESS(err);
19939 m_errorMonitor->VerifyNotFound();
19940 vkUnmapMemory(m_device->device(), mem);
19941
19942 vkFreeMemory(m_device->device(), mem, NULL);
19943}
19944
19945// This is a positive test. We used to expect error in this case but spec now allows it
19946TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19947 m_errorMonitor->ExpectSuccess();
19948 vk_testing::Fence testFence;
19949 VkFenceCreateInfo fenceInfo = {};
19950 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19951 fenceInfo.pNext = NULL;
19952
Tony Barbour1fa09702017-03-16 12:09:08 -060019953 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019954 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019955 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019956 VkResult result = vkResetFences(m_device->device(), 1, fences);
19957 ASSERT_VK_SUCCESS(result);
19958
19959 m_errorMonitor->VerifyNotFound();
19960}
19961
19962TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19963 m_errorMonitor->ExpectSuccess();
19964
Tony Barbour1fa09702017-03-16 12:09:08 -060019965 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019966 VkResult err;
19967
19968 // Record (empty!) command buffer that can be submitted multiple times
19969 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019970 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19971 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019972 m_commandBuffer->BeginCommandBuffer(&cbbi);
19973 m_commandBuffer->EndCommandBuffer();
19974
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019975 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019976 VkFence fence;
19977 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19978 ASSERT_VK_SUCCESS(err);
19979
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019980 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019981 VkSemaphore s1, s2;
19982 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19983 ASSERT_VK_SUCCESS(err);
19984 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19985 ASSERT_VK_SUCCESS(err);
19986
19987 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019988 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019989 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19990 ASSERT_VK_SUCCESS(err);
19991
19992 // Submit CB again, signaling s2.
19993 si.pSignalSemaphores = &s2;
19994 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19995 ASSERT_VK_SUCCESS(err);
19996
19997 // Wait for fence.
19998 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19999 ASSERT_VK_SUCCESS(err);
20000
20001 // CB is still in flight from second submission, but semaphore s1 is no
20002 // longer in flight. delete it.
20003 vkDestroySemaphore(m_device->device(), s1, nullptr);
20004
20005 m_errorMonitor->VerifyNotFound();
20006
20007 // Force device idle and clean up remaining objects
20008 vkDeviceWaitIdle(m_device->device());
20009 vkDestroySemaphore(m_device->device(), s2, nullptr);
20010 vkDestroyFence(m_device->device(), fence, nullptr);
20011}
20012
20013TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20014 m_errorMonitor->ExpectSuccess();
20015
Tony Barbour1fa09702017-03-16 12:09:08 -060020016 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020017 VkResult err;
20018
20019 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020020 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020021 VkFence f1;
20022 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20023 ASSERT_VK_SUCCESS(err);
20024
20025 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020026 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020027 VkFence f2;
20028 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20029 ASSERT_VK_SUCCESS(err);
20030
20031 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020032 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020033 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20034
20035 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020036 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020037 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20038
20039 // Should have both retired!
20040 vkDestroyFence(m_device->device(), f1, nullptr);
20041 vkDestroyFence(m_device->device(), f2, nullptr);
20042
20043 m_errorMonitor->VerifyNotFound();
20044}
20045
20046TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020047 TEST_DESCRIPTION(
20048 "Verify that creating an image view from an image with valid usage "
20049 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020050
Tony Barbour1fa09702017-03-16 12:09:08 -060020051 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020052
20053 m_errorMonitor->ExpectSuccess();
20054 // Verify that we can create a view with usage INPUT_ATTACHMENT
20055 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020056 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 -060020057 ASSERT_TRUE(image.initialized());
20058 VkImageView imageView;
20059 VkImageViewCreateInfo ivci = {};
20060 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20061 ivci.image = image.handle();
20062 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20063 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20064 ivci.subresourceRange.layerCount = 1;
20065 ivci.subresourceRange.baseMipLevel = 0;
20066 ivci.subresourceRange.levelCount = 1;
20067 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20068
20069 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20070 m_errorMonitor->VerifyNotFound();
20071 vkDestroyImageView(m_device->device(), imageView, NULL);
20072}
20073
20074// This is a positive test. No failures are expected.
20075TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020076 TEST_DESCRIPTION(
20077 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20078 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020079
Tony Barbour1fa09702017-03-16 12:09:08 -060020080 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020081
20082 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020083 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020084 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020085
20086 m_errorMonitor->ExpectSuccess();
20087
20088 VkImage image;
20089 VkImageCreateInfo image_create_info = {};
20090 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20091 image_create_info.pNext = NULL;
20092 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20093 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20094 image_create_info.extent.width = 64;
20095 image_create_info.extent.height = 64;
20096 image_create_info.extent.depth = 1;
20097 image_create_info.mipLevels = 1;
20098 image_create_info.arrayLayers = 1;
20099 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20100 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20101 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20102 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20103 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20104 ASSERT_VK_SUCCESS(err);
20105
20106 VkMemoryRequirements memory_reqs;
20107 VkDeviceMemory memory_one, memory_two;
20108 bool pass;
20109 VkMemoryAllocateInfo memory_info = {};
20110 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20111 memory_info.pNext = NULL;
20112 memory_info.allocationSize = 0;
20113 memory_info.memoryTypeIndex = 0;
20114 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20115 // Find an image big enough to allow sparse mapping of 2 memory regions
20116 // Increase the image size until it is at least twice the
20117 // size of the required alignment, to ensure we can bind both
20118 // allocated memory blocks to the image on aligned offsets.
20119 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20120 vkDestroyImage(m_device->device(), image, nullptr);
20121 image_create_info.extent.width *= 2;
20122 image_create_info.extent.height *= 2;
20123 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20124 ASSERT_VK_SUCCESS(err);
20125 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20126 }
20127 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20128 // at the end of the first
20129 memory_info.allocationSize = memory_reqs.alignment;
20130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20131 ASSERT_TRUE(pass);
20132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20133 ASSERT_VK_SUCCESS(err);
20134 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20135 ASSERT_VK_SUCCESS(err);
20136 VkSparseMemoryBind binds[2];
20137 binds[0].flags = 0;
20138 binds[0].memory = memory_one;
20139 binds[0].memoryOffset = 0;
20140 binds[0].resourceOffset = 0;
20141 binds[0].size = memory_info.allocationSize;
20142 binds[1].flags = 0;
20143 binds[1].memory = memory_two;
20144 binds[1].memoryOffset = 0;
20145 binds[1].resourceOffset = memory_info.allocationSize;
20146 binds[1].size = memory_info.allocationSize;
20147
20148 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20149 opaqueBindInfo.image = image;
20150 opaqueBindInfo.bindCount = 2;
20151 opaqueBindInfo.pBinds = binds;
20152
20153 VkFence fence = VK_NULL_HANDLE;
20154 VkBindSparseInfo bindSparseInfo = {};
20155 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20156 bindSparseInfo.imageOpaqueBindCount = 1;
20157 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20158
20159 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20160 vkQueueWaitIdle(m_device->m_queue);
20161 vkDestroyImage(m_device->device(), image, NULL);
20162 vkFreeMemory(m_device->device(), memory_one, NULL);
20163 vkFreeMemory(m_device->device(), memory_two, NULL);
20164 m_errorMonitor->VerifyNotFound();
20165}
20166
20167TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020168 TEST_DESCRIPTION(
20169 "Ensure that CmdBeginRenderPass with an attachment's "
20170 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20171 "the command buffer has prior knowledge of that "
20172 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020173
20174 m_errorMonitor->ExpectSuccess();
20175
Tony Barbour1fa09702017-03-16 12:09:08 -060020176 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020177
20178 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020179 VkAttachmentDescription attachment = {0,
20180 VK_FORMAT_R8G8B8A8_UNORM,
20181 VK_SAMPLE_COUNT_1_BIT,
20182 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20183 VK_ATTACHMENT_STORE_OP_STORE,
20184 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20185 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20186 VK_IMAGE_LAYOUT_UNDEFINED,
20187 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020188
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020189 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020190
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020191 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020192
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020193 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020194
20195 VkRenderPass rp;
20196 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20197 ASSERT_VK_SUCCESS(err);
20198
20199 // A compatible framebuffer.
20200 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020201 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 -060020202 ASSERT_TRUE(image.initialized());
20203
20204 VkImageViewCreateInfo ivci = {
20205 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20206 nullptr,
20207 0,
20208 image.handle(),
20209 VK_IMAGE_VIEW_TYPE_2D,
20210 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020211 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20212 VK_COMPONENT_SWIZZLE_IDENTITY},
20213 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020214 };
20215 VkImageView view;
20216 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20217 ASSERT_VK_SUCCESS(err);
20218
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020219 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020220 VkFramebuffer fb;
20221 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20222 ASSERT_VK_SUCCESS(err);
20223
20224 // Record a single command buffer which uses this renderpass twice. The
20225 // bug is triggered at the beginning of the second renderpass, when the
20226 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020227 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 -070020228 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020229 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20230 vkCmdEndRenderPass(m_commandBuffer->handle());
20231 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20232
20233 m_errorMonitor->VerifyNotFound();
20234
20235 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020236 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020237
20238 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20239 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20240 vkDestroyImageView(m_device->device(), view, nullptr);
20241}
20242
20243TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020244 TEST_DESCRIPTION(
20245 "This test should pass. Create a Framebuffer and "
20246 "command buffer, bind them together, then destroy "
20247 "command pool and framebuffer and verify there are no "
20248 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020249
20250 m_errorMonitor->ExpectSuccess();
20251
Tony Barbour1fa09702017-03-16 12:09:08 -060020252 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020253
20254 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020255 VkAttachmentDescription attachment = {0,
20256 VK_FORMAT_R8G8B8A8_UNORM,
20257 VK_SAMPLE_COUNT_1_BIT,
20258 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20259 VK_ATTACHMENT_STORE_OP_STORE,
20260 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20261 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20262 VK_IMAGE_LAYOUT_UNDEFINED,
20263 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020264
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020265 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020266
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020267 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020268
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020269 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020270
20271 VkRenderPass rp;
20272 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20273 ASSERT_VK_SUCCESS(err);
20274
20275 // A compatible framebuffer.
20276 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020277 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 -060020278 ASSERT_TRUE(image.initialized());
20279
20280 VkImageViewCreateInfo ivci = {
20281 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20282 nullptr,
20283 0,
20284 image.handle(),
20285 VK_IMAGE_VIEW_TYPE_2D,
20286 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020287 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20288 VK_COMPONENT_SWIZZLE_IDENTITY},
20289 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020290 };
20291 VkImageView view;
20292 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20293 ASSERT_VK_SUCCESS(err);
20294
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020295 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020296 VkFramebuffer fb;
20297 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20298 ASSERT_VK_SUCCESS(err);
20299
20300 // Explicitly create a command buffer to bind the FB to so that we can then
20301 // destroy the command pool in order to implicitly free command buffer
20302 VkCommandPool command_pool;
20303 VkCommandPoolCreateInfo pool_create_info{};
20304 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20305 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20306 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20307 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20308
20309 VkCommandBuffer command_buffer;
20310 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20311 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20312 command_buffer_allocate_info.commandPool = command_pool;
20313 command_buffer_allocate_info.commandBufferCount = 1;
20314 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20315 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20316
20317 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020318 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 -060020319 VkCommandBufferBeginInfo begin_info{};
20320 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20321 vkBeginCommandBuffer(command_buffer, &begin_info);
20322
20323 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20324 vkCmdEndRenderPass(command_buffer);
20325 vkEndCommandBuffer(command_buffer);
20326 vkDestroyImageView(m_device->device(), view, nullptr);
20327 // Destroy command pool to implicitly free command buffer
20328 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20329 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20330 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20331 m_errorMonitor->VerifyNotFound();
20332}
20333
20334TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020335 TEST_DESCRIPTION(
20336 "Ensure that CmdBeginRenderPass applies the layout "
20337 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020338
20339 m_errorMonitor->ExpectSuccess();
20340
Tony Barbour1fa09702017-03-16 12:09:08 -060020341 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020342
20343 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020344 VkAttachmentDescription attachment = {0,
20345 VK_FORMAT_R8G8B8A8_UNORM,
20346 VK_SAMPLE_COUNT_1_BIT,
20347 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20348 VK_ATTACHMENT_STORE_OP_STORE,
20349 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20350 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20351 VK_IMAGE_LAYOUT_UNDEFINED,
20352 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020353
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020354 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020355
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020356 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020357
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020358 VkSubpassDependency dep = {0,
20359 0,
20360 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20361 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20362 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20363 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20364 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020365
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020366 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020367
20368 VkResult err;
20369 VkRenderPass rp;
20370 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20371 ASSERT_VK_SUCCESS(err);
20372
20373 // A compatible framebuffer.
20374 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020375 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 -060020376 ASSERT_TRUE(image.initialized());
20377
20378 VkImageViewCreateInfo ivci = {
20379 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20380 nullptr,
20381 0,
20382 image.handle(),
20383 VK_IMAGE_VIEW_TYPE_2D,
20384 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020385 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20386 VK_COMPONENT_SWIZZLE_IDENTITY},
20387 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020388 };
20389 VkImageView view;
20390 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20391 ASSERT_VK_SUCCESS(err);
20392
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020393 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020394 VkFramebuffer fb;
20395 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20396 ASSERT_VK_SUCCESS(err);
20397
20398 // Record a single command buffer which issues a pipeline barrier w/
20399 // image memory barrier for the attachment. This detects the previously
20400 // missing tracking of the subpass layout by throwing a validation error
20401 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020402 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 -070020403 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020404 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20405
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020406 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20407 nullptr,
20408 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20409 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20410 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20411 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20412 VK_QUEUE_FAMILY_IGNORED,
20413 VK_QUEUE_FAMILY_IGNORED,
20414 image.handle(),
20415 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020416 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020417 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20418 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020419
20420 vkCmdEndRenderPass(m_commandBuffer->handle());
20421 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020422 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020423
20424 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20425 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20426 vkDestroyImageView(m_device->device(), view, nullptr);
20427}
20428
20429TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020430 TEST_DESCRIPTION(
20431 "Validate that when an imageView of a depth/stencil image "
20432 "is used as a depth/stencil framebuffer attachment, the "
20433 "aspectMask is ignored and both depth and stencil image "
20434 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020435
Tony Barbour1fa09702017-03-16 12:09:08 -060020436 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020437 VkFormatProperties format_properties;
20438 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20439 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20440 return;
20441 }
20442
20443 m_errorMonitor->ExpectSuccess();
20444
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020445 VkAttachmentDescription attachment = {0,
20446 VK_FORMAT_D32_SFLOAT_S8_UINT,
20447 VK_SAMPLE_COUNT_1_BIT,
20448 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20449 VK_ATTACHMENT_STORE_OP_STORE,
20450 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20451 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20452 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20453 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020454
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020455 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020456
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020457 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020458
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020459 VkSubpassDependency dep = {0,
20460 0,
20461 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20462 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20463 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20464 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20465 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020466
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020467 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020468
20469 VkResult err;
20470 VkRenderPass rp;
20471 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20472 ASSERT_VK_SUCCESS(err);
20473
20474 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020475 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20476 0x26, // usage
20477 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020478 ASSERT_TRUE(image.initialized());
20479 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20480
20481 VkImageViewCreateInfo ivci = {
20482 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20483 nullptr,
20484 0,
20485 image.handle(),
20486 VK_IMAGE_VIEW_TYPE_2D,
20487 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020488 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20489 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020490 };
20491 VkImageView view;
20492 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20493 ASSERT_VK_SUCCESS(err);
20494
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020495 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020496 VkFramebuffer fb;
20497 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20498 ASSERT_VK_SUCCESS(err);
20499
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020500 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 -070020501 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020502 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20503
20504 VkImageMemoryBarrier imb = {};
20505 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20506 imb.pNext = nullptr;
20507 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20508 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20509 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20510 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20511 imb.srcQueueFamilyIndex = 0;
20512 imb.dstQueueFamilyIndex = 0;
20513 imb.image = image.handle();
20514 imb.subresourceRange.aspectMask = 0x6;
20515 imb.subresourceRange.baseMipLevel = 0;
20516 imb.subresourceRange.levelCount = 0x1;
20517 imb.subresourceRange.baseArrayLayer = 0;
20518 imb.subresourceRange.layerCount = 0x1;
20519
20520 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020521 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20522 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020523
20524 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020525 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020526 QueueCommandBuffer(false);
20527 m_errorMonitor->VerifyNotFound();
20528
20529 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20530 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20531 vkDestroyImageView(m_device->device(), view, nullptr);
20532}
20533
20534TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020535 TEST_DESCRIPTION(
20536 "Ensure that layout transitions work correctly without "
20537 "errors, when an attachment reference is "
20538 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020539
20540 m_errorMonitor->ExpectSuccess();
20541
Tony Barbour1fa09702017-03-16 12:09:08 -060020542 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020543
20544 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020545 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020546
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020547 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020548
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020549 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020550
20551 VkRenderPass rp;
20552 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20553 ASSERT_VK_SUCCESS(err);
20554
20555 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020556 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020557 VkFramebuffer fb;
20558 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20559 ASSERT_VK_SUCCESS(err);
20560
20561 // Record a command buffer which just begins and ends the renderpass. The
20562 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020563 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 -070020564 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020565 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20566 vkCmdEndRenderPass(m_commandBuffer->handle());
20567 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020568 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020569
20570 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20571 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20572}
20573
20574// This is a positive test. No errors are expected.
20575TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020576 TEST_DESCRIPTION(
20577 "Create a stencil-only attachment with a LOAD_OP set to "
20578 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020579 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020580 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020581 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020582 if (!depth_format) {
20583 printf(" No Depth + Stencil format found. Skipped.\n");
20584 return;
20585 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020586 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020587 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020588 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20589 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020590 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20591 return;
20592 }
20593
Tony Barbourf887b162017-03-09 10:06:46 -070020594 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020595 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020596 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020597 VkAttachmentDescription att = {};
20598 VkAttachmentReference ref = {};
20599 att.format = depth_stencil_fmt;
20600 att.samples = VK_SAMPLE_COUNT_1_BIT;
20601 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20602 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20603 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20604 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20605 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20606 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20607
20608 VkClearValue clear;
20609 clear.depthStencil.depth = 1.0;
20610 clear.depthStencil.stencil = 0;
20611 ref.attachment = 0;
20612 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20613
20614 VkSubpassDescription subpass = {};
20615 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20616 subpass.flags = 0;
20617 subpass.inputAttachmentCount = 0;
20618 subpass.pInputAttachments = NULL;
20619 subpass.colorAttachmentCount = 0;
20620 subpass.pColorAttachments = NULL;
20621 subpass.pResolveAttachments = NULL;
20622 subpass.pDepthStencilAttachment = &ref;
20623 subpass.preserveAttachmentCount = 0;
20624 subpass.pPreserveAttachments = NULL;
20625
20626 VkRenderPass rp;
20627 VkRenderPassCreateInfo rp_info = {};
20628 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20629 rp_info.attachmentCount = 1;
20630 rp_info.pAttachments = &att;
20631 rp_info.subpassCount = 1;
20632 rp_info.pSubpasses = &subpass;
20633 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20634 ASSERT_VK_SUCCESS(result);
20635
20636 VkImageView *depthView = m_depthStencil->BindInfo();
20637 VkFramebufferCreateInfo fb_info = {};
20638 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20639 fb_info.pNext = NULL;
20640 fb_info.renderPass = rp;
20641 fb_info.attachmentCount = 1;
20642 fb_info.pAttachments = depthView;
20643 fb_info.width = 100;
20644 fb_info.height = 100;
20645 fb_info.layers = 1;
20646 VkFramebuffer fb;
20647 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20648 ASSERT_VK_SUCCESS(result);
20649
20650 VkRenderPassBeginInfo rpbinfo = {};
20651 rpbinfo.clearValueCount = 1;
20652 rpbinfo.pClearValues = &clear;
20653 rpbinfo.pNext = NULL;
20654 rpbinfo.renderPass = rp;
20655 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20656 rpbinfo.renderArea.extent.width = 100;
20657 rpbinfo.renderArea.extent.height = 100;
20658 rpbinfo.renderArea.offset.x = 0;
20659 rpbinfo.renderArea.offset.y = 0;
20660 rpbinfo.framebuffer = fb;
20661
20662 VkFence fence = {};
20663 VkFenceCreateInfo fence_ci = {};
20664 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20665 fence_ci.pNext = nullptr;
20666 fence_ci.flags = 0;
20667 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20668 ASSERT_VK_SUCCESS(result);
20669
20670 m_commandBuffer->BeginCommandBuffer();
20671 m_commandBuffer->BeginRenderPass(rpbinfo);
20672 m_commandBuffer->EndRenderPass();
20673 m_commandBuffer->EndCommandBuffer();
20674 m_commandBuffer->QueueCommandBuffer(fence);
20675
20676 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020677 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 -070020678 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020679 VkImageMemoryBarrier barrier = {};
20680 VkImageSubresourceRange range;
20681 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20682 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20683 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20684 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20685 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20686 barrier.image = m_depthStencil->handle();
20687 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20688 range.baseMipLevel = 0;
20689 range.levelCount = 1;
20690 range.baseArrayLayer = 0;
20691 range.layerCount = 1;
20692 barrier.subresourceRange = range;
20693 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20694 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20695 cmdbuf.BeginCommandBuffer();
20696 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 -070020697 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020698 barrier.srcAccessMask = 0;
20699 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20700 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20701 barrier.image = destImage.handle();
20702 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20703 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 -070020704 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020705 VkImageCopy cregion;
20706 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20707 cregion.srcSubresource.mipLevel = 0;
20708 cregion.srcSubresource.baseArrayLayer = 0;
20709 cregion.srcSubresource.layerCount = 1;
20710 cregion.srcOffset.x = 0;
20711 cregion.srcOffset.y = 0;
20712 cregion.srcOffset.z = 0;
20713 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20714 cregion.dstSubresource.mipLevel = 0;
20715 cregion.dstSubresource.baseArrayLayer = 0;
20716 cregion.dstSubresource.layerCount = 1;
20717 cregion.dstOffset.x = 0;
20718 cregion.dstOffset.y = 0;
20719 cregion.dstOffset.z = 0;
20720 cregion.extent.width = 100;
20721 cregion.extent.height = 100;
20722 cregion.extent.depth = 1;
20723 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020724 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020725 cmdbuf.EndCommandBuffer();
20726
20727 VkSubmitInfo submit_info;
20728 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20729 submit_info.pNext = NULL;
20730 submit_info.waitSemaphoreCount = 0;
20731 submit_info.pWaitSemaphores = NULL;
20732 submit_info.pWaitDstStageMask = NULL;
20733 submit_info.commandBufferCount = 1;
20734 submit_info.pCommandBuffers = &cmdbuf.handle();
20735 submit_info.signalSemaphoreCount = 0;
20736 submit_info.pSignalSemaphores = NULL;
20737
20738 m_errorMonitor->ExpectSuccess();
20739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20740 m_errorMonitor->VerifyNotFound();
20741
20742 vkQueueWaitIdle(m_device->m_queue);
20743 vkDestroyFence(m_device->device(), fence, nullptr);
20744 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20745 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20746}
20747
20748// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020749TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20750 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20751
20752 m_errorMonitor->ExpectSuccess();
20753
Tony Barbour1fa09702017-03-16 12:09:08 -060020754 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020755 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020756 if (!depth_format) {
20757 printf(" No Depth + Stencil format found. Skipped.\n");
20758 return;
20759 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20761
20762 VkImageMemoryBarrier img_barrier = {};
20763 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20764 img_barrier.pNext = NULL;
20765 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20766 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20767 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20768 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20769 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20770 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20771 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20772 img_barrier.subresourceRange.baseArrayLayer = 0;
20773 img_barrier.subresourceRange.baseMipLevel = 0;
20774 img_barrier.subresourceRange.layerCount = 1;
20775 img_barrier.subresourceRange.levelCount = 1;
20776
20777 {
20778 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020779 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 -070020780 ASSERT_TRUE(img_color.initialized());
20781
20782 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020783 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 -070020784 ASSERT_TRUE(img_ds1.initialized());
20785
20786 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020787 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 -070020788 ASSERT_TRUE(img_ds2.initialized());
20789
20790 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020791 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 -070020792 ASSERT_TRUE(img_xfer_src.initialized());
20793
20794 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020795 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 -070020796 ASSERT_TRUE(img_xfer_dst.initialized());
20797
20798 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020799 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 -070020800 ASSERT_TRUE(img_sampled.initialized());
20801
20802 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020803 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 -070020804 ASSERT_TRUE(img_input.initialized());
20805
20806 const struct {
20807 VkImageObj &image_obj;
20808 VkImageLayout old_layout;
20809 VkImageLayout new_layout;
20810 } buffer_layouts[] = {
20811 // clang-format off
20812 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20813 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20814 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20815 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20816 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20817 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20818 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20819 // clang-format on
20820 };
20821 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20822
20823 m_commandBuffer->BeginCommandBuffer();
20824 for (uint32_t i = 0; i < layout_count; ++i) {
20825 img_barrier.image = buffer_layouts[i].image_obj.handle();
20826 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20827 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20828 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20829 : VK_IMAGE_ASPECT_COLOR_BIT;
20830
20831 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20832 img_barrier.newLayout = buffer_layouts[i].new_layout;
20833 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20834 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20835
20836 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20837 img_barrier.newLayout = buffer_layouts[i].old_layout;
20838 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20839 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20840 }
20841 m_commandBuffer->EndCommandBuffer();
20842
20843 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20844 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20845 }
20846 m_errorMonitor->VerifyNotFound();
20847}
20848
20849// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020850TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20851 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20852
20853 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020854 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020855
20856 VkEvent event;
20857 VkEventCreateInfo event_create_info{};
20858 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20859 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20860
20861 VkCommandPool command_pool;
20862 VkCommandPoolCreateInfo pool_create_info{};
20863 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20864 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20865 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20866 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20867
20868 VkCommandBuffer command_buffer;
20869 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20870 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20871 command_buffer_allocate_info.commandPool = command_pool;
20872 command_buffer_allocate_info.commandBufferCount = 1;
20873 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20874 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20875
20876 VkQueue queue = VK_NULL_HANDLE;
20877 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20878
20879 {
20880 VkCommandBufferBeginInfo begin_info{};
20881 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20882 vkBeginCommandBuffer(command_buffer, &begin_info);
20883
20884 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 -070020885 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020886 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20887 vkEndCommandBuffer(command_buffer);
20888 }
20889 {
20890 VkSubmitInfo submit_info{};
20891 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20892 submit_info.commandBufferCount = 1;
20893 submit_info.pCommandBuffers = &command_buffer;
20894 submit_info.signalSemaphoreCount = 0;
20895 submit_info.pSignalSemaphores = nullptr;
20896 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20897 }
20898 { vkSetEvent(m_device->device(), event); }
20899
20900 vkQueueWaitIdle(queue);
20901
20902 vkDestroyEvent(m_device->device(), event, nullptr);
20903 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20904 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20905
20906 m_errorMonitor->VerifyNotFound();
20907}
20908// This is a positive test. No errors should be generated.
20909TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20910 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20911
Tony Barbour1fa09702017-03-16 12:09:08 -060020912 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020913 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020914
20915 m_errorMonitor->ExpectSuccess();
20916
20917 VkQueryPool query_pool;
20918 VkQueryPoolCreateInfo query_pool_create_info{};
20919 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20920 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20921 query_pool_create_info.queryCount = 1;
20922 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20923
20924 VkCommandPool command_pool;
20925 VkCommandPoolCreateInfo pool_create_info{};
20926 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20927 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20928 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20929 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20930
20931 VkCommandBuffer command_buffer;
20932 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20933 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20934 command_buffer_allocate_info.commandPool = command_pool;
20935 command_buffer_allocate_info.commandBufferCount = 1;
20936 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20937 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20938
20939 VkCommandBuffer secondary_command_buffer;
20940 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20941 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20942
20943 VkQueue queue = VK_NULL_HANDLE;
20944 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20945
20946 uint32_t qfi = 0;
20947 VkBufferCreateInfo buff_create_info = {};
20948 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20949 buff_create_info.size = 1024;
20950 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20951 buff_create_info.queueFamilyIndexCount = 1;
20952 buff_create_info.pQueueFamilyIndices = &qfi;
20953
20954 VkResult err;
20955 VkBuffer buffer;
20956 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20957 ASSERT_VK_SUCCESS(err);
20958 VkMemoryAllocateInfo mem_alloc = {};
20959 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20960 mem_alloc.pNext = NULL;
20961 mem_alloc.allocationSize = 1024;
20962 mem_alloc.memoryTypeIndex = 0;
20963
20964 VkMemoryRequirements memReqs;
20965 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20966 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20967 if (!pass) {
20968 vkDestroyBuffer(m_device->device(), buffer, NULL);
20969 return;
20970 }
20971
20972 VkDeviceMemory mem;
20973 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20974 ASSERT_VK_SUCCESS(err);
20975 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20976 ASSERT_VK_SUCCESS(err);
20977
20978 VkCommandBufferInheritanceInfo hinfo = {};
20979 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20980 hinfo.renderPass = VK_NULL_HANDLE;
20981 hinfo.subpass = 0;
20982 hinfo.framebuffer = VK_NULL_HANDLE;
20983 hinfo.occlusionQueryEnable = VK_FALSE;
20984 hinfo.queryFlags = 0;
20985 hinfo.pipelineStatistics = 0;
20986
20987 {
20988 VkCommandBufferBeginInfo begin_info{};
20989 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20990 begin_info.pInheritanceInfo = &hinfo;
20991 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20992
20993 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20994 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20995
20996 vkEndCommandBuffer(secondary_command_buffer);
20997
20998 begin_info.pInheritanceInfo = nullptr;
20999 vkBeginCommandBuffer(command_buffer, &begin_info);
21000
21001 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
21002 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
21003
21004 vkEndCommandBuffer(command_buffer);
21005 }
21006 {
21007 VkSubmitInfo submit_info{};
21008 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21009 submit_info.commandBufferCount = 1;
21010 submit_info.pCommandBuffers = &command_buffer;
21011 submit_info.signalSemaphoreCount = 0;
21012 submit_info.pSignalSemaphores = nullptr;
21013 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21014 }
21015
21016 vkQueueWaitIdle(queue);
21017
21018 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21019 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21020 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21021 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21022 vkDestroyBuffer(m_device->device(), buffer, NULL);
21023 vkFreeMemory(m_device->device(), mem, NULL);
21024
21025 m_errorMonitor->VerifyNotFound();
21026}
21027
21028// This is a positive test. No errors should be generated.
21029TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21030 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21031
Tony Barbour1fa09702017-03-16 12:09:08 -060021032 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021033 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021034
21035 m_errorMonitor->ExpectSuccess();
21036
21037 VkQueryPool query_pool;
21038 VkQueryPoolCreateInfo query_pool_create_info{};
21039 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21040 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21041 query_pool_create_info.queryCount = 1;
21042 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21043
21044 VkCommandPool command_pool;
21045 VkCommandPoolCreateInfo pool_create_info{};
21046 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21047 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21048 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21049 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21050
21051 VkCommandBuffer command_buffer[2];
21052 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21053 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21054 command_buffer_allocate_info.commandPool = command_pool;
21055 command_buffer_allocate_info.commandBufferCount = 2;
21056 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21057 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21058
21059 VkQueue queue = VK_NULL_HANDLE;
21060 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21061
21062 uint32_t qfi = 0;
21063 VkBufferCreateInfo buff_create_info = {};
21064 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21065 buff_create_info.size = 1024;
21066 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21067 buff_create_info.queueFamilyIndexCount = 1;
21068 buff_create_info.pQueueFamilyIndices = &qfi;
21069
21070 VkResult err;
21071 VkBuffer buffer;
21072 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21073 ASSERT_VK_SUCCESS(err);
21074 VkMemoryAllocateInfo mem_alloc = {};
21075 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21076 mem_alloc.pNext = NULL;
21077 mem_alloc.allocationSize = 1024;
21078 mem_alloc.memoryTypeIndex = 0;
21079
21080 VkMemoryRequirements memReqs;
21081 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21082 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21083 if (!pass) {
21084 vkDestroyBuffer(m_device->device(), buffer, NULL);
21085 return;
21086 }
21087
21088 VkDeviceMemory mem;
21089 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21090 ASSERT_VK_SUCCESS(err);
21091 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21092 ASSERT_VK_SUCCESS(err);
21093
21094 {
21095 VkCommandBufferBeginInfo begin_info{};
21096 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21097 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21098
21099 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21100 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21101
21102 vkEndCommandBuffer(command_buffer[0]);
21103
21104 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21105
21106 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21107
21108 vkEndCommandBuffer(command_buffer[1]);
21109 }
21110 {
21111 VkSubmitInfo submit_info{};
21112 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21113 submit_info.commandBufferCount = 2;
21114 submit_info.pCommandBuffers = command_buffer;
21115 submit_info.signalSemaphoreCount = 0;
21116 submit_info.pSignalSemaphores = nullptr;
21117 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21118 }
21119
21120 vkQueueWaitIdle(queue);
21121
21122 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21123 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21124 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21125 vkDestroyBuffer(m_device->device(), buffer, NULL);
21126 vkFreeMemory(m_device->device(), mem, NULL);
21127
21128 m_errorMonitor->VerifyNotFound();
21129}
21130
Tony Barbourc46924f2016-11-04 11:49:52 -060021131TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021132 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21133
Tony Barbour1fa09702017-03-16 12:09:08 -060021134 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021135 VkEvent event;
21136 VkEventCreateInfo event_create_info{};
21137 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21138 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21139
21140 VkCommandPool command_pool;
21141 VkCommandPoolCreateInfo pool_create_info{};
21142 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21143 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21144 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21145 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21146
21147 VkCommandBuffer command_buffer;
21148 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21149 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21150 command_buffer_allocate_info.commandPool = command_pool;
21151 command_buffer_allocate_info.commandBufferCount = 1;
21152 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21153 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21154
21155 VkQueue queue = VK_NULL_HANDLE;
21156 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21157
21158 {
21159 VkCommandBufferBeginInfo begin_info{};
21160 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21161 vkBeginCommandBuffer(command_buffer, &begin_info);
21162
21163 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021164 vkEndCommandBuffer(command_buffer);
21165 }
21166 {
21167 VkSubmitInfo submit_info{};
21168 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21169 submit_info.commandBufferCount = 1;
21170 submit_info.pCommandBuffers = &command_buffer;
21171 submit_info.signalSemaphoreCount = 0;
21172 submit_info.pSignalSemaphores = nullptr;
21173 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21174 }
21175 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21177 "that is already in use by a "
21178 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021179 vkSetEvent(m_device->device(), event);
21180 m_errorMonitor->VerifyFound();
21181 }
21182
21183 vkQueueWaitIdle(queue);
21184
21185 vkDestroyEvent(m_device->device(), event, nullptr);
21186 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21187 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21188}
21189
21190// This is a positive test. No errors should be generated.
21191TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021192 TEST_DESCRIPTION(
21193 "Two command buffers with two separate fences are each "
21194 "run through a Submit & WaitForFences cycle 3 times. This "
21195 "previously revealed a bug so running this positive test "
21196 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021197 m_errorMonitor->ExpectSuccess();
21198
Tony Barbour1fa09702017-03-16 12:09:08 -060021199 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021200 VkQueue queue = VK_NULL_HANDLE;
21201 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21202
21203 static const uint32_t NUM_OBJECTS = 2;
21204 static const uint32_t NUM_FRAMES = 3;
21205 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21206 VkFence fences[NUM_OBJECTS] = {};
21207
21208 VkCommandPool cmd_pool;
21209 VkCommandPoolCreateInfo cmd_pool_ci = {};
21210 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21211 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
21212 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21213 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
21214 ASSERT_VK_SUCCESS(err);
21215
21216 VkCommandBufferAllocateInfo cmd_buf_info = {};
21217 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21218 cmd_buf_info.commandPool = cmd_pool;
21219 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21220 cmd_buf_info.commandBufferCount = 1;
21221
21222 VkFenceCreateInfo fence_ci = {};
21223 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21224 fence_ci.pNext = nullptr;
21225 fence_ci.flags = 0;
21226
21227 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21228 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21229 ASSERT_VK_SUCCESS(err);
21230 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21231 ASSERT_VK_SUCCESS(err);
21232 }
21233
21234 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21235 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21236 // Create empty cmd buffer
21237 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21238 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21239
21240 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21241 ASSERT_VK_SUCCESS(err);
21242 err = vkEndCommandBuffer(cmd_buffers[obj]);
21243 ASSERT_VK_SUCCESS(err);
21244
21245 VkSubmitInfo submit_info = {};
21246 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21247 submit_info.commandBufferCount = 1;
21248 submit_info.pCommandBuffers = &cmd_buffers[obj];
21249 // Submit cmd buffer and wait for fence
21250 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21251 ASSERT_VK_SUCCESS(err);
21252 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21253 ASSERT_VK_SUCCESS(err);
21254 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21255 ASSERT_VK_SUCCESS(err);
21256 }
21257 }
21258 m_errorMonitor->VerifyNotFound();
21259 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21260 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21261 vkDestroyFence(m_device->device(), fences[i], nullptr);
21262 }
21263}
21264// This is a positive test. No errors should be generated.
21265TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021266 TEST_DESCRIPTION(
21267 "Two command buffers, each in a separate QueueSubmit call "
21268 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021269
Tony Barbour1fa09702017-03-16 12:09:08 -060021270 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021271 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021272
21273 m_errorMonitor->ExpectSuccess();
21274
21275 VkSemaphore semaphore;
21276 VkSemaphoreCreateInfo semaphore_create_info{};
21277 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21278 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21279
21280 VkCommandPool command_pool;
21281 VkCommandPoolCreateInfo pool_create_info{};
21282 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21283 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21284 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21285 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21286
21287 VkCommandBuffer command_buffer[2];
21288 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21289 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21290 command_buffer_allocate_info.commandPool = command_pool;
21291 command_buffer_allocate_info.commandBufferCount = 2;
21292 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21293 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21294
21295 VkQueue queue = VK_NULL_HANDLE;
21296 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21297
21298 {
21299 VkCommandBufferBeginInfo begin_info{};
21300 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21301 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21302
21303 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 -070021304 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021305
21306 VkViewport viewport{};
21307 viewport.maxDepth = 1.0f;
21308 viewport.minDepth = 0.0f;
21309 viewport.width = 512;
21310 viewport.height = 512;
21311 viewport.x = 0;
21312 viewport.y = 0;
21313 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21314 vkEndCommandBuffer(command_buffer[0]);
21315 }
21316 {
21317 VkCommandBufferBeginInfo begin_info{};
21318 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21319 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21320
21321 VkViewport viewport{};
21322 viewport.maxDepth = 1.0f;
21323 viewport.minDepth = 0.0f;
21324 viewport.width = 512;
21325 viewport.height = 512;
21326 viewport.x = 0;
21327 viewport.y = 0;
21328 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21329 vkEndCommandBuffer(command_buffer[1]);
21330 }
21331 {
21332 VkSubmitInfo submit_info{};
21333 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21334 submit_info.commandBufferCount = 1;
21335 submit_info.pCommandBuffers = &command_buffer[0];
21336 submit_info.signalSemaphoreCount = 1;
21337 submit_info.pSignalSemaphores = &semaphore;
21338 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21339 }
21340 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021341 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021342 VkSubmitInfo submit_info{};
21343 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21344 submit_info.commandBufferCount = 1;
21345 submit_info.pCommandBuffers = &command_buffer[1];
21346 submit_info.waitSemaphoreCount = 1;
21347 submit_info.pWaitSemaphores = &semaphore;
21348 submit_info.pWaitDstStageMask = flags;
21349 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21350 }
21351
21352 vkQueueWaitIdle(m_device->m_queue);
21353
21354 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21355 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21356 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21357
21358 m_errorMonitor->VerifyNotFound();
21359}
21360
21361// This is a positive test. No errors should be generated.
21362TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021363 TEST_DESCRIPTION(
21364 "Two command buffers, each in a separate QueueSubmit call "
21365 "submitted on separate queues, the second having a fence"
21366 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021367
Tony Barbour1fa09702017-03-16 12:09:08 -060021368 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021369 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021370
21371 m_errorMonitor->ExpectSuccess();
21372
21373 VkFence fence;
21374 VkFenceCreateInfo fence_create_info{};
21375 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21376 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21377
21378 VkSemaphore semaphore;
21379 VkSemaphoreCreateInfo semaphore_create_info{};
21380 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21381 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21382
21383 VkCommandPool command_pool;
21384 VkCommandPoolCreateInfo pool_create_info{};
21385 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21386 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21387 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21388 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21389
21390 VkCommandBuffer command_buffer[2];
21391 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21392 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21393 command_buffer_allocate_info.commandPool = command_pool;
21394 command_buffer_allocate_info.commandBufferCount = 2;
21395 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21396 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21397
21398 VkQueue queue = VK_NULL_HANDLE;
21399 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21400
21401 {
21402 VkCommandBufferBeginInfo begin_info{};
21403 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21404 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21405
21406 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 -070021407 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021408
21409 VkViewport viewport{};
21410 viewport.maxDepth = 1.0f;
21411 viewport.minDepth = 0.0f;
21412 viewport.width = 512;
21413 viewport.height = 512;
21414 viewport.x = 0;
21415 viewport.y = 0;
21416 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21417 vkEndCommandBuffer(command_buffer[0]);
21418 }
21419 {
21420 VkCommandBufferBeginInfo begin_info{};
21421 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21422 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21423
21424 VkViewport viewport{};
21425 viewport.maxDepth = 1.0f;
21426 viewport.minDepth = 0.0f;
21427 viewport.width = 512;
21428 viewport.height = 512;
21429 viewport.x = 0;
21430 viewport.y = 0;
21431 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21432 vkEndCommandBuffer(command_buffer[1]);
21433 }
21434 {
21435 VkSubmitInfo submit_info{};
21436 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21437 submit_info.commandBufferCount = 1;
21438 submit_info.pCommandBuffers = &command_buffer[0];
21439 submit_info.signalSemaphoreCount = 1;
21440 submit_info.pSignalSemaphores = &semaphore;
21441 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21442 }
21443 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021444 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021445 VkSubmitInfo submit_info{};
21446 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21447 submit_info.commandBufferCount = 1;
21448 submit_info.pCommandBuffers = &command_buffer[1];
21449 submit_info.waitSemaphoreCount = 1;
21450 submit_info.pWaitSemaphores = &semaphore;
21451 submit_info.pWaitDstStageMask = flags;
21452 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21453 }
21454
21455 vkQueueWaitIdle(m_device->m_queue);
21456
21457 vkDestroyFence(m_device->device(), fence, nullptr);
21458 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21459 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21460 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21461
21462 m_errorMonitor->VerifyNotFound();
21463}
21464
21465// This is a positive test. No errors should be generated.
21466TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021467 TEST_DESCRIPTION(
21468 "Two command buffers, each in a separate QueueSubmit call "
21469 "submitted on separate queues, the second having a fence"
21470 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021471
Tony Barbour1fa09702017-03-16 12:09:08 -060021472 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021473 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021474
21475 m_errorMonitor->ExpectSuccess();
21476
21477 VkFence fence;
21478 VkFenceCreateInfo fence_create_info{};
21479 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21480 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21481
21482 VkSemaphore semaphore;
21483 VkSemaphoreCreateInfo semaphore_create_info{};
21484 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21485 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21486
21487 VkCommandPool command_pool;
21488 VkCommandPoolCreateInfo pool_create_info{};
21489 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21490 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21491 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21492 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21493
21494 VkCommandBuffer command_buffer[2];
21495 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21496 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21497 command_buffer_allocate_info.commandPool = command_pool;
21498 command_buffer_allocate_info.commandBufferCount = 2;
21499 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21500 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21501
21502 VkQueue queue = VK_NULL_HANDLE;
21503 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21504
21505 {
21506 VkCommandBufferBeginInfo begin_info{};
21507 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21508 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21509
21510 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 -070021511 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021512
21513 VkViewport viewport{};
21514 viewport.maxDepth = 1.0f;
21515 viewport.minDepth = 0.0f;
21516 viewport.width = 512;
21517 viewport.height = 512;
21518 viewport.x = 0;
21519 viewport.y = 0;
21520 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21521 vkEndCommandBuffer(command_buffer[0]);
21522 }
21523 {
21524 VkCommandBufferBeginInfo begin_info{};
21525 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21526 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21527
21528 VkViewport viewport{};
21529 viewport.maxDepth = 1.0f;
21530 viewport.minDepth = 0.0f;
21531 viewport.width = 512;
21532 viewport.height = 512;
21533 viewport.x = 0;
21534 viewport.y = 0;
21535 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21536 vkEndCommandBuffer(command_buffer[1]);
21537 }
21538 {
21539 VkSubmitInfo submit_info{};
21540 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21541 submit_info.commandBufferCount = 1;
21542 submit_info.pCommandBuffers = &command_buffer[0];
21543 submit_info.signalSemaphoreCount = 1;
21544 submit_info.pSignalSemaphores = &semaphore;
21545 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21546 }
21547 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021548 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021549 VkSubmitInfo submit_info{};
21550 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21551 submit_info.commandBufferCount = 1;
21552 submit_info.pCommandBuffers = &command_buffer[1];
21553 submit_info.waitSemaphoreCount = 1;
21554 submit_info.pWaitSemaphores = &semaphore;
21555 submit_info.pWaitDstStageMask = flags;
21556 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21557 }
21558
21559 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21560 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21561
21562 vkDestroyFence(m_device->device(), fence, nullptr);
21563 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21564 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21565 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21566
21567 m_errorMonitor->VerifyNotFound();
21568}
21569
21570TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021571 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021572 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021573 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021574 return;
21575 }
21576
21577 VkResult err;
21578
21579 m_errorMonitor->ExpectSuccess();
21580
21581 VkQueue q0 = m_device->m_queue;
21582 VkQueue q1 = nullptr;
21583 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21584 ASSERT_NE(q1, nullptr);
21585
21586 // An (empty) command buffer. We must have work in the first submission --
21587 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021588 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021589 VkCommandPool pool;
21590 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21591 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021592 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21593 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021594 VkCommandBuffer cb;
21595 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21596 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021597 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021598 err = vkBeginCommandBuffer(cb, &cbbi);
21599 ASSERT_VK_SUCCESS(err);
21600 err = vkEndCommandBuffer(cb);
21601 ASSERT_VK_SUCCESS(err);
21602
21603 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021604 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021605 VkSemaphore s;
21606 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21607 ASSERT_VK_SUCCESS(err);
21608
21609 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021610 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021611
21612 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21613 ASSERT_VK_SUCCESS(err);
21614
21615 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021616 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021617 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021618
21619 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21620 ASSERT_VK_SUCCESS(err);
21621
21622 // Wait for q0 idle
21623 err = vkQueueWaitIdle(q0);
21624 ASSERT_VK_SUCCESS(err);
21625
21626 // Command buffer should have been completed (it was on q0); reset the pool.
21627 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21628
21629 m_errorMonitor->VerifyNotFound();
21630
21631 // Force device completely idle and clean up resources
21632 vkDeviceWaitIdle(m_device->device());
21633 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21634 vkDestroySemaphore(m_device->device(), s, nullptr);
21635}
21636
21637// This is a positive test. No errors should be generated.
21638TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021639 TEST_DESCRIPTION(
21640 "Two command buffers, each in a separate QueueSubmit call "
21641 "submitted on separate queues, the second having a fence, "
21642 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021643
Tony Barbour1fa09702017-03-16 12:09:08 -060021644 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021645 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021646
21647 m_errorMonitor->ExpectSuccess();
21648
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021649 VkFence fence;
21650 VkFenceCreateInfo fence_create_info{};
21651 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21652 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21653
21654 VkSemaphore semaphore;
21655 VkSemaphoreCreateInfo semaphore_create_info{};
21656 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21657 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21658
21659 VkCommandPool command_pool;
21660 VkCommandPoolCreateInfo pool_create_info{};
21661 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21662 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21663 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21664 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21665
21666 VkCommandBuffer command_buffer[2];
21667 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21668 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21669 command_buffer_allocate_info.commandPool = command_pool;
21670 command_buffer_allocate_info.commandBufferCount = 2;
21671 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21672 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21673
21674 VkQueue queue = VK_NULL_HANDLE;
21675 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21676
21677 {
21678 VkCommandBufferBeginInfo begin_info{};
21679 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21680 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21681
21682 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 -070021683 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021684
21685 VkViewport viewport{};
21686 viewport.maxDepth = 1.0f;
21687 viewport.minDepth = 0.0f;
21688 viewport.width = 512;
21689 viewport.height = 512;
21690 viewport.x = 0;
21691 viewport.y = 0;
21692 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21693 vkEndCommandBuffer(command_buffer[0]);
21694 }
21695 {
21696 VkCommandBufferBeginInfo begin_info{};
21697 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21698 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21699
21700 VkViewport viewport{};
21701 viewport.maxDepth = 1.0f;
21702 viewport.minDepth = 0.0f;
21703 viewport.width = 512;
21704 viewport.height = 512;
21705 viewport.x = 0;
21706 viewport.y = 0;
21707 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21708 vkEndCommandBuffer(command_buffer[1]);
21709 }
21710 {
21711 VkSubmitInfo submit_info{};
21712 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21713 submit_info.commandBufferCount = 1;
21714 submit_info.pCommandBuffers = &command_buffer[0];
21715 submit_info.signalSemaphoreCount = 1;
21716 submit_info.pSignalSemaphores = &semaphore;
21717 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21718 }
21719 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021720 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021721 VkSubmitInfo submit_info{};
21722 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21723 submit_info.commandBufferCount = 1;
21724 submit_info.pCommandBuffers = &command_buffer[1];
21725 submit_info.waitSemaphoreCount = 1;
21726 submit_info.pWaitSemaphores = &semaphore;
21727 submit_info.pWaitDstStageMask = flags;
21728 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21729 }
21730
21731 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21732
21733 vkDestroyFence(m_device->device(), fence, nullptr);
21734 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21735 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21736 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21737
21738 m_errorMonitor->VerifyNotFound();
21739}
21740
21741// This is a positive test. No errors should be generated.
21742TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021743 TEST_DESCRIPTION(
21744 "Two command buffers, each in a separate QueueSubmit call "
21745 "on the same queue, sharing a signal/wait semaphore, the "
21746 "second having a fence, "
21747 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021748
21749 m_errorMonitor->ExpectSuccess();
21750
Tony Barbour1fa09702017-03-16 12:09:08 -060021751 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021752 VkFence fence;
21753 VkFenceCreateInfo fence_create_info{};
21754 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21755 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21756
21757 VkSemaphore semaphore;
21758 VkSemaphoreCreateInfo semaphore_create_info{};
21759 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21760 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21761
21762 VkCommandPool command_pool;
21763 VkCommandPoolCreateInfo pool_create_info{};
21764 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21765 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21766 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21767 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21768
21769 VkCommandBuffer command_buffer[2];
21770 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21771 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21772 command_buffer_allocate_info.commandPool = command_pool;
21773 command_buffer_allocate_info.commandBufferCount = 2;
21774 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21775 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21776
21777 {
21778 VkCommandBufferBeginInfo begin_info{};
21779 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21780 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21781
21782 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 -070021783 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021784
21785 VkViewport viewport{};
21786 viewport.maxDepth = 1.0f;
21787 viewport.minDepth = 0.0f;
21788 viewport.width = 512;
21789 viewport.height = 512;
21790 viewport.x = 0;
21791 viewport.y = 0;
21792 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21793 vkEndCommandBuffer(command_buffer[0]);
21794 }
21795 {
21796 VkCommandBufferBeginInfo begin_info{};
21797 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21798 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21799
21800 VkViewport viewport{};
21801 viewport.maxDepth = 1.0f;
21802 viewport.minDepth = 0.0f;
21803 viewport.width = 512;
21804 viewport.height = 512;
21805 viewport.x = 0;
21806 viewport.y = 0;
21807 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21808 vkEndCommandBuffer(command_buffer[1]);
21809 }
21810 {
21811 VkSubmitInfo submit_info{};
21812 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21813 submit_info.commandBufferCount = 1;
21814 submit_info.pCommandBuffers = &command_buffer[0];
21815 submit_info.signalSemaphoreCount = 1;
21816 submit_info.pSignalSemaphores = &semaphore;
21817 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21818 }
21819 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021820 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021821 VkSubmitInfo submit_info{};
21822 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21823 submit_info.commandBufferCount = 1;
21824 submit_info.pCommandBuffers = &command_buffer[1];
21825 submit_info.waitSemaphoreCount = 1;
21826 submit_info.pWaitSemaphores = &semaphore;
21827 submit_info.pWaitDstStageMask = flags;
21828 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21829 }
21830
21831 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21832
21833 vkDestroyFence(m_device->device(), fence, nullptr);
21834 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21835 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21836 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21837
21838 m_errorMonitor->VerifyNotFound();
21839}
21840
21841// This is a positive test. No errors should be generated.
21842TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021843 TEST_DESCRIPTION(
21844 "Two command buffers, each in a separate QueueSubmit call "
21845 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21846 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021847
21848 m_errorMonitor->ExpectSuccess();
21849
Tony Barbour1fa09702017-03-16 12:09:08 -060021850 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021851 VkFence fence;
21852 VkFenceCreateInfo fence_create_info{};
21853 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21854 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21855
21856 VkCommandPool command_pool;
21857 VkCommandPoolCreateInfo pool_create_info{};
21858 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21859 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21860 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21861 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21862
21863 VkCommandBuffer command_buffer[2];
21864 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21865 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21866 command_buffer_allocate_info.commandPool = command_pool;
21867 command_buffer_allocate_info.commandBufferCount = 2;
21868 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21869 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21870
21871 {
21872 VkCommandBufferBeginInfo begin_info{};
21873 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21874 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21875
21876 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 -070021877 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021878
21879 VkViewport viewport{};
21880 viewport.maxDepth = 1.0f;
21881 viewport.minDepth = 0.0f;
21882 viewport.width = 512;
21883 viewport.height = 512;
21884 viewport.x = 0;
21885 viewport.y = 0;
21886 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21887 vkEndCommandBuffer(command_buffer[0]);
21888 }
21889 {
21890 VkCommandBufferBeginInfo begin_info{};
21891 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21892 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21893
21894 VkViewport viewport{};
21895 viewport.maxDepth = 1.0f;
21896 viewport.minDepth = 0.0f;
21897 viewport.width = 512;
21898 viewport.height = 512;
21899 viewport.x = 0;
21900 viewport.y = 0;
21901 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21902 vkEndCommandBuffer(command_buffer[1]);
21903 }
21904 {
21905 VkSubmitInfo submit_info{};
21906 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21907 submit_info.commandBufferCount = 1;
21908 submit_info.pCommandBuffers = &command_buffer[0];
21909 submit_info.signalSemaphoreCount = 0;
21910 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21911 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21912 }
21913 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021914 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021915 VkSubmitInfo submit_info{};
21916 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21917 submit_info.commandBufferCount = 1;
21918 submit_info.pCommandBuffers = &command_buffer[1];
21919 submit_info.waitSemaphoreCount = 0;
21920 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21921 submit_info.pWaitDstStageMask = flags;
21922 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21923 }
21924
21925 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21926
21927 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21928 ASSERT_VK_SUCCESS(err);
21929
21930 vkDestroyFence(m_device->device(), fence, nullptr);
21931 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21932 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21933
21934 m_errorMonitor->VerifyNotFound();
21935}
21936
21937// This is a positive test. No errors should be generated.
21938TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021939 TEST_DESCRIPTION(
21940 "Two command buffers, each in a separate QueueSubmit call "
21941 "on the same queue, the second having a fence, followed "
21942 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021943
21944 m_errorMonitor->ExpectSuccess();
21945
Tony Barbour1fa09702017-03-16 12:09:08 -060021946 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021947 VkFence fence;
21948 VkFenceCreateInfo fence_create_info{};
21949 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21950 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21951
21952 VkCommandPool command_pool;
21953 VkCommandPoolCreateInfo pool_create_info{};
21954 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21955 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21956 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21957 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21958
21959 VkCommandBuffer command_buffer[2];
21960 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21961 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21962 command_buffer_allocate_info.commandPool = command_pool;
21963 command_buffer_allocate_info.commandBufferCount = 2;
21964 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21965 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21966
21967 {
21968 VkCommandBufferBeginInfo begin_info{};
21969 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21970 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21971
21972 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 -070021973 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021974
21975 VkViewport viewport{};
21976 viewport.maxDepth = 1.0f;
21977 viewport.minDepth = 0.0f;
21978 viewport.width = 512;
21979 viewport.height = 512;
21980 viewport.x = 0;
21981 viewport.y = 0;
21982 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21983 vkEndCommandBuffer(command_buffer[0]);
21984 }
21985 {
21986 VkCommandBufferBeginInfo begin_info{};
21987 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21988 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21989
21990 VkViewport viewport{};
21991 viewport.maxDepth = 1.0f;
21992 viewport.minDepth = 0.0f;
21993 viewport.width = 512;
21994 viewport.height = 512;
21995 viewport.x = 0;
21996 viewport.y = 0;
21997 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21998 vkEndCommandBuffer(command_buffer[1]);
21999 }
22000 {
22001 VkSubmitInfo submit_info{};
22002 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22003 submit_info.commandBufferCount = 1;
22004 submit_info.pCommandBuffers = &command_buffer[0];
22005 submit_info.signalSemaphoreCount = 0;
22006 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22007 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22008 }
22009 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022010 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022011 VkSubmitInfo submit_info{};
22012 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22013 submit_info.commandBufferCount = 1;
22014 submit_info.pCommandBuffers = &command_buffer[1];
22015 submit_info.waitSemaphoreCount = 0;
22016 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22017 submit_info.pWaitDstStageMask = flags;
22018 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22019 }
22020
22021 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22022
22023 vkDestroyFence(m_device->device(), fence, nullptr);
22024 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22025 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22026
22027 m_errorMonitor->VerifyNotFound();
22028}
22029
22030// This is a positive test. No errors should be generated.
22031TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022032 TEST_DESCRIPTION(
22033 "Two command buffers each in a separate SubmitInfo sent in a single "
22034 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022035 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022036
22037 m_errorMonitor->ExpectSuccess();
22038
22039 VkFence fence;
22040 VkFenceCreateInfo fence_create_info{};
22041 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22042 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22043
22044 VkSemaphore semaphore;
22045 VkSemaphoreCreateInfo semaphore_create_info{};
22046 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22047 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22048
22049 VkCommandPool command_pool;
22050 VkCommandPoolCreateInfo pool_create_info{};
22051 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22052 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22053 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22054 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22055
22056 VkCommandBuffer command_buffer[2];
22057 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22058 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22059 command_buffer_allocate_info.commandPool = command_pool;
22060 command_buffer_allocate_info.commandBufferCount = 2;
22061 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22062 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22063
22064 {
22065 VkCommandBufferBeginInfo begin_info{};
22066 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22067 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22068
22069 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 -070022070 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022071
22072 VkViewport viewport{};
22073 viewport.maxDepth = 1.0f;
22074 viewport.minDepth = 0.0f;
22075 viewport.width = 512;
22076 viewport.height = 512;
22077 viewport.x = 0;
22078 viewport.y = 0;
22079 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22080 vkEndCommandBuffer(command_buffer[0]);
22081 }
22082 {
22083 VkCommandBufferBeginInfo begin_info{};
22084 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22085 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22086
22087 VkViewport viewport{};
22088 viewport.maxDepth = 1.0f;
22089 viewport.minDepth = 0.0f;
22090 viewport.width = 512;
22091 viewport.height = 512;
22092 viewport.x = 0;
22093 viewport.y = 0;
22094 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22095 vkEndCommandBuffer(command_buffer[1]);
22096 }
22097 {
22098 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022099 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022100
22101 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22102 submit_info[0].pNext = NULL;
22103 submit_info[0].commandBufferCount = 1;
22104 submit_info[0].pCommandBuffers = &command_buffer[0];
22105 submit_info[0].signalSemaphoreCount = 1;
22106 submit_info[0].pSignalSemaphores = &semaphore;
22107 submit_info[0].waitSemaphoreCount = 0;
22108 submit_info[0].pWaitSemaphores = NULL;
22109 submit_info[0].pWaitDstStageMask = 0;
22110
22111 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22112 submit_info[1].pNext = NULL;
22113 submit_info[1].commandBufferCount = 1;
22114 submit_info[1].pCommandBuffers = &command_buffer[1];
22115 submit_info[1].waitSemaphoreCount = 1;
22116 submit_info[1].pWaitSemaphores = &semaphore;
22117 submit_info[1].pWaitDstStageMask = flags;
22118 submit_info[1].signalSemaphoreCount = 0;
22119 submit_info[1].pSignalSemaphores = NULL;
22120 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22121 }
22122
22123 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22124
22125 vkDestroyFence(m_device->device(), fence, nullptr);
22126 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22127 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22128 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22129
22130 m_errorMonitor->VerifyNotFound();
22131}
22132
22133TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22134 m_errorMonitor->ExpectSuccess();
22135
Tony Barbour1fa09702017-03-16 12:09:08 -060022136 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22138
Tony Barbour552f6c02016-12-21 14:34:07 -070022139 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022140
22141 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22142 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22143 m_errorMonitor->VerifyNotFound();
22144 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22145 m_errorMonitor->VerifyNotFound();
22146 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22147 m_errorMonitor->VerifyNotFound();
22148
22149 m_commandBuffer->EndCommandBuffer();
22150 m_errorMonitor->VerifyNotFound();
22151}
22152
22153TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022154 TEST_DESCRIPTION(
22155 "Positive test where we create a renderpass with an "
22156 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22157 "has a valid layout, and a second subpass then uses a "
22158 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022159 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022160 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022161 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022162 if (!depth_format) {
22163 printf(" No Depth + Stencil format found. Skipped.\n");
22164 return;
22165 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022166
22167 VkAttachmentReference attach[2] = {};
22168 attach[0].attachment = 0;
22169 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22170 attach[1].attachment = 0;
22171 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22172 VkSubpassDescription subpasses[2] = {};
22173 // First subpass clears DS attach on load
22174 subpasses[0].pDepthStencilAttachment = &attach[0];
22175 // 2nd subpass reads in DS as input attachment
22176 subpasses[1].inputAttachmentCount = 1;
22177 subpasses[1].pInputAttachments = &attach[1];
22178 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022179 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022180 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22181 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22182 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22183 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22184 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22185 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22186 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22187 VkRenderPassCreateInfo rpci = {};
22188 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22189 rpci.attachmentCount = 1;
22190 rpci.pAttachments = &attach_desc;
22191 rpci.subpassCount = 2;
22192 rpci.pSubpasses = subpasses;
22193
22194 // Now create RenderPass and verify no errors
22195 VkRenderPass rp;
22196 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22197 m_errorMonitor->VerifyNotFound();
22198
22199 vkDestroyRenderPass(m_device->device(), rp, NULL);
22200}
22201
Tobin Ehlis01103de2017-02-16 13:22:47 -070022202TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22203 TEST_DESCRIPTION(
22204 "Create a render pass with depth-stencil attachment where layout transition "
22205 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22206 "transition has correctly occurred at queue submit time with no validation errors.");
22207
Tony Barbour1fa09702017-03-16 12:09:08 -060022208 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022209 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022210 if (!depth_format) {
22211 printf(" No Depth + Stencil format found. Skipped.\n");
22212 return;
22213 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070022214 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070022215 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022216 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22217 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022218 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022219 return;
22220 }
22221
22222 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022223 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22224
22225 // A renderpass with one depth/stencil attachment.
22226 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022227 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022228 VK_SAMPLE_COUNT_1_BIT,
22229 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22230 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22231 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22232 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22233 VK_IMAGE_LAYOUT_UNDEFINED,
22234 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22235
22236 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22237
22238 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22239
22240 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22241
22242 VkRenderPass rp;
22243 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22244 ASSERT_VK_SUCCESS(err);
22245 // A compatible ds image.
22246 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022247 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 -070022248 ASSERT_TRUE(image.initialized());
22249
22250 VkImageViewCreateInfo ivci = {
22251 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22252 nullptr,
22253 0,
22254 image.handle(),
22255 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022256 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022257 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22258 VK_COMPONENT_SWIZZLE_IDENTITY},
22259 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22260 };
22261 VkImageView view;
22262 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22263 ASSERT_VK_SUCCESS(err);
22264
22265 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22266 VkFramebuffer fb;
22267 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22268 ASSERT_VK_SUCCESS(err);
22269
22270 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22271 m_commandBuffer->BeginCommandBuffer();
22272 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22273 vkCmdEndRenderPass(m_commandBuffer->handle());
22274 m_commandBuffer->EndCommandBuffer();
22275 QueueCommandBuffer(false);
22276 m_errorMonitor->VerifyNotFound();
22277
22278 // Cleanup
22279 vkDestroyImageView(m_device->device(), view, NULL);
22280 vkDestroyRenderPass(m_device->device(), rp, NULL);
22281 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22282}
22283
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022284TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022285 TEST_DESCRIPTION(
22286 "Test that pipeline validation accepts matrices passed "
22287 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022288 m_errorMonitor->ExpectSuccess();
22289
Tony Barbour1fa09702017-03-16 12:09:08 -060022290 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022291 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22292
22293 VkVertexInputBindingDescription input_binding;
22294 memset(&input_binding, 0, sizeof(input_binding));
22295
22296 VkVertexInputAttributeDescription input_attribs[2];
22297 memset(input_attribs, 0, sizeof(input_attribs));
22298
22299 for (int i = 0; i < 2; i++) {
22300 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22301 input_attribs[i].location = i;
22302 }
22303
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022304 char const *vsSource =
22305 "#version 450\n"
22306 "\n"
22307 "layout(location=0) in mat2x4 x;\n"
22308 "out gl_PerVertex {\n"
22309 " vec4 gl_Position;\n"
22310 "};\n"
22311 "void main(){\n"
22312 " gl_Position = x[0] + x[1];\n"
22313 "}\n";
22314 char const *fsSource =
22315 "#version 450\n"
22316 "\n"
22317 "layout(location=0) out vec4 color;\n"
22318 "void main(){\n"
22319 " color = vec4(1);\n"
22320 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022321
22322 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22323 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22324
22325 VkPipelineObj pipe(m_device);
22326 pipe.AddColorAttachment();
22327 pipe.AddShader(&vs);
22328 pipe.AddShader(&fs);
22329
22330 pipe.AddVertexInputBindings(&input_binding, 1);
22331 pipe.AddVertexInputAttribs(input_attribs, 2);
22332
22333 VkDescriptorSetObj descriptorSet(m_device);
22334 descriptorSet.AppendDummy();
22335 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22336
22337 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22338
22339 /* expect success */
22340 m_errorMonitor->VerifyNotFound();
22341}
22342
22343TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22344 m_errorMonitor->ExpectSuccess();
22345
Tony Barbour1fa09702017-03-16 12:09:08 -060022346 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22348
22349 VkVertexInputBindingDescription input_binding;
22350 memset(&input_binding, 0, sizeof(input_binding));
22351
22352 VkVertexInputAttributeDescription input_attribs[2];
22353 memset(input_attribs, 0, sizeof(input_attribs));
22354
22355 for (int i = 0; i < 2; i++) {
22356 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22357 input_attribs[i].location = i;
22358 }
22359
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022360 char const *vsSource =
22361 "#version 450\n"
22362 "\n"
22363 "layout(location=0) in vec4 x[2];\n"
22364 "out gl_PerVertex {\n"
22365 " vec4 gl_Position;\n"
22366 "};\n"
22367 "void main(){\n"
22368 " gl_Position = x[0] + x[1];\n"
22369 "}\n";
22370 char const *fsSource =
22371 "#version 450\n"
22372 "\n"
22373 "layout(location=0) out vec4 color;\n"
22374 "void main(){\n"
22375 " color = vec4(1);\n"
22376 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022377
22378 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22379 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22380
22381 VkPipelineObj pipe(m_device);
22382 pipe.AddColorAttachment();
22383 pipe.AddShader(&vs);
22384 pipe.AddShader(&fs);
22385
22386 pipe.AddVertexInputBindings(&input_binding, 1);
22387 pipe.AddVertexInputAttribs(input_attribs, 2);
22388
22389 VkDescriptorSetObj descriptorSet(m_device);
22390 descriptorSet.AppendDummy();
22391 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22392
22393 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22394
22395 m_errorMonitor->VerifyNotFound();
22396}
22397
22398TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022399 TEST_DESCRIPTION(
22400 "Test that pipeline validation accepts consuming a vertex attribute "
22401 "through multiple vertex shader inputs, each consuming a different "
22402 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022403 m_errorMonitor->ExpectSuccess();
22404
Tony Barbour1fa09702017-03-16 12:09:08 -060022405 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22407
22408 VkVertexInputBindingDescription input_binding;
22409 memset(&input_binding, 0, sizeof(input_binding));
22410
22411 VkVertexInputAttributeDescription input_attribs[3];
22412 memset(input_attribs, 0, sizeof(input_attribs));
22413
22414 for (int i = 0; i < 3; i++) {
22415 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22416 input_attribs[i].location = i;
22417 }
22418
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022419 char const *vsSource =
22420 "#version 450\n"
22421 "\n"
22422 "layout(location=0) in vec4 x;\n"
22423 "layout(location=1) in vec3 y1;\n"
22424 "layout(location=1, component=3) in float y2;\n"
22425 "layout(location=2) in vec4 z;\n"
22426 "out gl_PerVertex {\n"
22427 " vec4 gl_Position;\n"
22428 "};\n"
22429 "void main(){\n"
22430 " gl_Position = x + vec4(y1, y2) + z;\n"
22431 "}\n";
22432 char const *fsSource =
22433 "#version 450\n"
22434 "\n"
22435 "layout(location=0) out vec4 color;\n"
22436 "void main(){\n"
22437 " color = vec4(1);\n"
22438 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022439
22440 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22441 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22442
22443 VkPipelineObj pipe(m_device);
22444 pipe.AddColorAttachment();
22445 pipe.AddShader(&vs);
22446 pipe.AddShader(&fs);
22447
22448 pipe.AddVertexInputBindings(&input_binding, 1);
22449 pipe.AddVertexInputAttribs(input_attribs, 3);
22450
22451 VkDescriptorSetObj descriptorSet(m_device);
22452 descriptorSet.AppendDummy();
22453 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22454
22455 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22456
22457 m_errorMonitor->VerifyNotFound();
22458}
22459
22460TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22461 m_errorMonitor->ExpectSuccess();
22462
Tony Barbour1fa09702017-03-16 12:09:08 -060022463 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22465
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022466 char const *vsSource =
22467 "#version 450\n"
22468 "out gl_PerVertex {\n"
22469 " vec4 gl_Position;\n"
22470 "};\n"
22471 "void main(){\n"
22472 " gl_Position = vec4(0);\n"
22473 "}\n";
22474 char const *fsSource =
22475 "#version 450\n"
22476 "\n"
22477 "layout(location=0) out vec4 color;\n"
22478 "void main(){\n"
22479 " color = vec4(1);\n"
22480 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022481
22482 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22484
22485 VkPipelineObj pipe(m_device);
22486 pipe.AddColorAttachment();
22487 pipe.AddShader(&vs);
22488 pipe.AddShader(&fs);
22489
22490 VkDescriptorSetObj descriptorSet(m_device);
22491 descriptorSet.AppendDummy();
22492 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22493
22494 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22495
22496 m_errorMonitor->VerifyNotFound();
22497}
22498
22499TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022500 TEST_DESCRIPTION(
22501 "Test that pipeline validation accepts the relaxed type matching rules "
22502 "set out in 14.1.3: fundamental type must match, and producer side must "
22503 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022504 m_errorMonitor->ExpectSuccess();
22505
22506 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22507
Tony Barbour1fa09702017-03-16 12:09:08 -060022508 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22510
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022511 char const *vsSource =
22512 "#version 450\n"
22513 "out gl_PerVertex {\n"
22514 " vec4 gl_Position;\n"
22515 "};\n"
22516 "layout(location=0) out vec3 x;\n"
22517 "layout(location=1) out ivec3 y;\n"
22518 "layout(location=2) out vec3 z;\n"
22519 "void main(){\n"
22520 " gl_Position = vec4(0);\n"
22521 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22522 "}\n";
22523 char const *fsSource =
22524 "#version 450\n"
22525 "\n"
22526 "layout(location=0) out vec4 color;\n"
22527 "layout(location=0) in float x;\n"
22528 "layout(location=1) flat in int y;\n"
22529 "layout(location=2) in vec2 z;\n"
22530 "void main(){\n"
22531 " color = vec4(1 + x + y + z.x);\n"
22532 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022533
22534 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22535 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22536
22537 VkPipelineObj pipe(m_device);
22538 pipe.AddColorAttachment();
22539 pipe.AddShader(&vs);
22540 pipe.AddShader(&fs);
22541
22542 VkDescriptorSetObj descriptorSet(m_device);
22543 descriptorSet.AppendDummy();
22544 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22545
22546 VkResult err = VK_SUCCESS;
22547 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22548 ASSERT_VK_SUCCESS(err);
22549
22550 m_errorMonitor->VerifyNotFound();
22551}
22552
22553TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022554 TEST_DESCRIPTION(
22555 "Test that pipeline validation accepts per-vertex variables "
22556 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022557 m_errorMonitor->ExpectSuccess();
22558
Tony Barbour1fa09702017-03-16 12:09:08 -060022559 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22561
22562 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022563 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022564 return;
22565 }
22566
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022567 char const *vsSource =
22568 "#version 450\n"
22569 "void main(){}\n";
22570 char const *tcsSource =
22571 "#version 450\n"
22572 "layout(location=0) out int x[];\n"
22573 "layout(vertices=3) out;\n"
22574 "void main(){\n"
22575 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22576 " gl_TessLevelInner[0] = 1;\n"
22577 " x[gl_InvocationID] = gl_InvocationID;\n"
22578 "}\n";
22579 char const *tesSource =
22580 "#version 450\n"
22581 "layout(triangles, equal_spacing, cw) in;\n"
22582 "layout(location=0) in int x[];\n"
22583 "out gl_PerVertex { vec4 gl_Position; };\n"
22584 "void main(){\n"
22585 " gl_Position.xyz = gl_TessCoord;\n"
22586 " gl_Position.w = x[0] + x[1] + x[2];\n"
22587 "}\n";
22588 char const *fsSource =
22589 "#version 450\n"
22590 "layout(location=0) out vec4 color;\n"
22591 "void main(){\n"
22592 " color = vec4(1);\n"
22593 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022594
22595 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22596 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22597 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22598 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22599
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022600 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22601 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022602
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022603 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022604
22605 VkPipelineObj pipe(m_device);
22606 pipe.SetInputAssembly(&iasci);
22607 pipe.SetTessellation(&tsci);
22608 pipe.AddColorAttachment();
22609 pipe.AddShader(&vs);
22610 pipe.AddShader(&tcs);
22611 pipe.AddShader(&tes);
22612 pipe.AddShader(&fs);
22613
22614 VkDescriptorSetObj descriptorSet(m_device);
22615 descriptorSet.AppendDummy();
22616 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22617
22618 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22619
22620 m_errorMonitor->VerifyNotFound();
22621}
22622
22623TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022624 TEST_DESCRIPTION(
22625 "Test that pipeline validation accepts a user-defined "
22626 "interface block passed into the geometry shader. This "
22627 "is interesting because the 'extra' array level is not "
22628 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022629 m_errorMonitor->ExpectSuccess();
22630
Tony Barbour1fa09702017-03-16 12:09:08 -060022631 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022632 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22633
22634 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022635 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022636 return;
22637 }
22638
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022639 char const *vsSource =
22640 "#version 450\n"
22641 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22642 "void main(){\n"
22643 " vs_out.x = vec4(1);\n"
22644 "}\n";
22645 char const *gsSource =
22646 "#version 450\n"
22647 "layout(triangles) in;\n"
22648 "layout(triangle_strip, max_vertices=3) out;\n"
22649 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22650 "out gl_PerVertex { vec4 gl_Position; };\n"
22651 "void main() {\n"
22652 " gl_Position = gs_in[0].x;\n"
22653 " EmitVertex();\n"
22654 "}\n";
22655 char const *fsSource =
22656 "#version 450\n"
22657 "layout(location=0) out vec4 color;\n"
22658 "void main(){\n"
22659 " color = vec4(1);\n"
22660 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022661
22662 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22663 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22664 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22665
22666 VkPipelineObj pipe(m_device);
22667 pipe.AddColorAttachment();
22668 pipe.AddShader(&vs);
22669 pipe.AddShader(&gs);
22670 pipe.AddShader(&fs);
22671
22672 VkDescriptorSetObj descriptorSet(m_device);
22673 descriptorSet.AppendDummy();
22674 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22675
22676 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22677
22678 m_errorMonitor->VerifyNotFound();
22679}
22680
22681TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022682 TEST_DESCRIPTION(
22683 "Test that pipeline validation accepts basic use of 64bit vertex "
22684 "attributes. This is interesting because they consume multiple "
22685 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022686 m_errorMonitor->ExpectSuccess();
22687
Tony Barbour1fa09702017-03-16 12:09:08 -060022688 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022689 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22690
22691 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022692 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022693 return;
22694 }
22695
22696 VkVertexInputBindingDescription input_bindings[1];
22697 memset(input_bindings, 0, sizeof(input_bindings));
22698
22699 VkVertexInputAttributeDescription input_attribs[4];
22700 memset(input_attribs, 0, sizeof(input_attribs));
22701 input_attribs[0].location = 0;
22702 input_attribs[0].offset = 0;
22703 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22704 input_attribs[1].location = 2;
22705 input_attribs[1].offset = 32;
22706 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22707 input_attribs[2].location = 4;
22708 input_attribs[2].offset = 64;
22709 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22710 input_attribs[3].location = 6;
22711 input_attribs[3].offset = 96;
22712 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22713
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022714 char const *vsSource =
22715 "#version 450\n"
22716 "\n"
22717 "layout(location=0) in dmat4 x;\n"
22718 "out gl_PerVertex {\n"
22719 " vec4 gl_Position;\n"
22720 "};\n"
22721 "void main(){\n"
22722 " gl_Position = vec4(x[0][0]);\n"
22723 "}\n";
22724 char const *fsSource =
22725 "#version 450\n"
22726 "\n"
22727 "layout(location=0) out vec4 color;\n"
22728 "void main(){\n"
22729 " color = vec4(1);\n"
22730 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022731
22732 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22733 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22734
22735 VkPipelineObj pipe(m_device);
22736 pipe.AddColorAttachment();
22737 pipe.AddShader(&vs);
22738 pipe.AddShader(&fs);
22739
22740 pipe.AddVertexInputBindings(input_bindings, 1);
22741 pipe.AddVertexInputAttribs(input_attribs, 4);
22742
22743 VkDescriptorSetObj descriptorSet(m_device);
22744 descriptorSet.AppendDummy();
22745 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22746
22747 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22748
22749 m_errorMonitor->VerifyNotFound();
22750}
22751
22752TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22753 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22754 m_errorMonitor->ExpectSuccess();
22755
Tony Barbour1fa09702017-03-16 12:09:08 -060022756 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022757
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022758 char const *vsSource =
22759 "#version 450\n"
22760 "\n"
22761 "out gl_PerVertex {\n"
22762 " vec4 gl_Position;\n"
22763 "};\n"
22764 "void main(){\n"
22765 " gl_Position = vec4(1);\n"
22766 "}\n";
22767 char const *fsSource =
22768 "#version 450\n"
22769 "\n"
22770 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22771 "layout(location=0) out vec4 color;\n"
22772 "void main() {\n"
22773 " color = subpassLoad(x);\n"
22774 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022775
22776 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22777 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22778
22779 VkPipelineObj pipe(m_device);
22780 pipe.AddShader(&vs);
22781 pipe.AddShader(&fs);
22782 pipe.AddColorAttachment();
22783 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22784
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022785 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22786 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022787 VkDescriptorSetLayout dsl;
22788 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22789 ASSERT_VK_SUCCESS(err);
22790
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022791 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022792 VkPipelineLayout pl;
22793 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22794 ASSERT_VK_SUCCESS(err);
22795
22796 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022797 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22798 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22799 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22800 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22801 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 -060022802 };
22803 VkAttachmentReference color = {
22804 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22805 };
22806 VkAttachmentReference input = {
22807 1, VK_IMAGE_LAYOUT_GENERAL,
22808 };
22809
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022810 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022811
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022812 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022813 VkRenderPass rp;
22814 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22815 ASSERT_VK_SUCCESS(err);
22816
22817 // should be OK. would go wrong here if it's going to...
22818 pipe.CreateVKPipeline(pl, rp);
22819
22820 m_errorMonitor->VerifyNotFound();
22821
22822 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22823 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22824 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22825}
22826
22827TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022828 TEST_DESCRIPTION(
22829 "Test that pipeline validation accepts a compute pipeline which declares a "
22830 "descriptor-backed resource which is not provided, but the shader does not "
22831 "statically use it. This is interesting because it requires compute pipelines "
22832 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022833 m_errorMonitor->ExpectSuccess();
22834
Tony Barbour1fa09702017-03-16 12:09:08 -060022835 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022836
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022837 char const *csSource =
22838 "#version 450\n"
22839 "\n"
22840 "layout(local_size_x=1) in;\n"
22841 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22842 "void main(){\n"
22843 " // x is not used.\n"
22844 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022845
22846 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22847
22848 VkDescriptorSetObj descriptorSet(m_device);
22849 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22850
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022851 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22852 nullptr,
22853 0,
22854 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22855 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22856 descriptorSet.GetPipelineLayout(),
22857 VK_NULL_HANDLE,
22858 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022859
22860 VkPipeline pipe;
22861 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22862
22863 m_errorMonitor->VerifyNotFound();
22864
22865 if (err == VK_SUCCESS) {
22866 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22867 }
22868}
22869
22870TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022871 TEST_DESCRIPTION(
22872 "Test that pipeline validation accepts a shader consuming only the "
22873 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022874 m_errorMonitor->ExpectSuccess();
22875
Tony Barbour1fa09702017-03-16 12:09:08 -060022876 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022877
22878 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022879 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22880 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22881 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022882 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022883 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022884 VkDescriptorSetLayout dsl;
22885 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22886 ASSERT_VK_SUCCESS(err);
22887
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022888 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022889 VkPipelineLayout pl;
22890 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22891 ASSERT_VK_SUCCESS(err);
22892
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022893 char const *csSource =
22894 "#version 450\n"
22895 "\n"
22896 "layout(local_size_x=1) in;\n"
22897 "layout(set=0, binding=0) uniform sampler s;\n"
22898 "layout(set=0, binding=1) uniform texture2D t;\n"
22899 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22900 "void main() {\n"
22901 " x = texture(sampler2D(t, s), vec2(0));\n"
22902 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022903 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22904
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022905 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22906 nullptr,
22907 0,
22908 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22909 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22910 pl,
22911 VK_NULL_HANDLE,
22912 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022913
22914 VkPipeline pipe;
22915 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22916
22917 m_errorMonitor->VerifyNotFound();
22918
22919 if (err == VK_SUCCESS) {
22920 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22921 }
22922
22923 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22924 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22925}
22926
22927TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022928 TEST_DESCRIPTION(
22929 "Test that pipeline validation accepts a shader consuming only the "
22930 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022931 m_errorMonitor->ExpectSuccess();
22932
Tony Barbour1fa09702017-03-16 12:09:08 -060022933 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022934
22935 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022936 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22937 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22938 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022939 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022940 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022941 VkDescriptorSetLayout dsl;
22942 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22943 ASSERT_VK_SUCCESS(err);
22944
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022945 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022946 VkPipelineLayout pl;
22947 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22948 ASSERT_VK_SUCCESS(err);
22949
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022950 char const *csSource =
22951 "#version 450\n"
22952 "\n"
22953 "layout(local_size_x=1) in;\n"
22954 "layout(set=0, binding=0) uniform texture2D t;\n"
22955 "layout(set=0, binding=1) uniform sampler s;\n"
22956 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22957 "void main() {\n"
22958 " x = texture(sampler2D(t, s), vec2(0));\n"
22959 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022960 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22961
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022962 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22963 nullptr,
22964 0,
22965 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22966 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22967 pl,
22968 VK_NULL_HANDLE,
22969 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022970
22971 VkPipeline pipe;
22972 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22973
22974 m_errorMonitor->VerifyNotFound();
22975
22976 if (err == VK_SUCCESS) {
22977 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22978 }
22979
22980 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22981 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22982}
22983
22984TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022985 TEST_DESCRIPTION(
22986 "Test that pipeline validation accepts a shader consuming "
22987 "both the sampler and the image of a combined image+sampler "
22988 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022989 m_errorMonitor->ExpectSuccess();
22990
Tony Barbour1fa09702017-03-16 12:09:08 -060022991 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022992
22993 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022994 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22995 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022996 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022997 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022998 VkDescriptorSetLayout dsl;
22999 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23000 ASSERT_VK_SUCCESS(err);
23001
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023002 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023003 VkPipelineLayout pl;
23004 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23005 ASSERT_VK_SUCCESS(err);
23006
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023007 char const *csSource =
23008 "#version 450\n"
23009 "\n"
23010 "layout(local_size_x=1) in;\n"
23011 "layout(set=0, binding=0) uniform texture2D t;\n"
23012 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23013 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23014 "void main() {\n"
23015 " x = texture(sampler2D(t, s), vec2(0));\n"
23016 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023017 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23018
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023019 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23020 nullptr,
23021 0,
23022 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23023 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23024 pl,
23025 VK_NULL_HANDLE,
23026 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023027
23028 VkPipeline pipe;
23029 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23030
23031 m_errorMonitor->VerifyNotFound();
23032
23033 if (err == VK_SUCCESS) {
23034 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23035 }
23036
23037 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23038 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23039}
23040
Tony Barbour3ed87a02017-03-15 16:19:02 -060023041TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023042 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23043
Tony Barbour3ed87a02017-03-15 16:19:02 -060023044 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023045 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023046
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023047 // Ensure that extension is available and enabled.
23048 uint32_t extension_count = 0;
23049 bool supports_maintenance1_extension = false;
23050 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23051 ASSERT_VK_SUCCESS(err);
23052 if (extension_count > 0) {
23053 std::vector<VkExtensionProperties> available_extensions(extension_count);
23054
23055 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23056 ASSERT_VK_SUCCESS(err);
23057 for (const auto &extension_props : available_extensions) {
23058 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23059 supports_maintenance1_extension = true;
23060 }
23061 }
23062 }
23063
23064 // Proceed if extension is supported by hardware
23065 if (!supports_maintenance1_extension) {
23066 printf(" Maintenance1 Extension not supported, skipping tests\n");
23067 return;
23068 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023069
23070 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023071 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023072 VkCommandBuffer cmd_buf;
23073 VkCommandBufferAllocateInfo alloc_info;
23074 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23075 alloc_info.pNext = NULL;
23076 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023077 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023078 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23079 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23080
23081 VkCommandBufferBeginInfo cb_binfo;
23082 cb_binfo.pNext = NULL;
23083 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23084 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23085 cb_binfo.flags = 0;
23086 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23087 // Set Negative height, should give error if Maintenance 1 is not enabled
23088 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23089 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23090 vkEndCommandBuffer(cmd_buf);
23091
23092 m_errorMonitor->VerifyNotFound();
23093}
23094
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023095TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23096 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23097
23098 ASSERT_NO_FATAL_FAILURE(Init());
23099
23100 uint32_t extension_count = 0;
23101 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23102 ASSERT_VK_SUCCESS(err);
23103
23104 if (extension_count > 0) {
23105 std::vector<VkExtensionProperties> available_extensions(extension_count);
23106 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23107 ASSERT_VK_SUCCESS(err);
23108
23109 for (const auto &extension_props : available_extensions) {
23110 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23111 // Create two pNext structures which by themselves would be valid
23112 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23113 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23114 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23115 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23116 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23117
23118 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23119 dedicated_buffer_create_info_2.pNext = nullptr;
23120 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23121
23122 uint32_t queue_family_index = 0;
23123 VkBufferCreateInfo buffer_create_info = {};
23124 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23125 buffer_create_info.pNext = &dedicated_buffer_create_info;
23126 buffer_create_info.size = 1024;
23127 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23128 buffer_create_info.queueFamilyIndexCount = 1;
23129 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23130
23131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23132 VkBuffer buffer;
23133 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23134 m_errorMonitor->VerifyFound();
23135 }
23136 }
23137 }
23138}
23139
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023140TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23141 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23142
Tony Barbour1fa09702017-03-16 12:09:08 -060023143 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023144
23145 // Positive test to check parameter_validation and unique_objects support
23146 // for NV_dedicated_allocation
23147 uint32_t extension_count = 0;
23148 bool supports_nv_dedicated_allocation = false;
23149 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23150 ASSERT_VK_SUCCESS(err);
23151
23152 if (extension_count > 0) {
23153 std::vector<VkExtensionProperties> available_extensions(extension_count);
23154
23155 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23156 ASSERT_VK_SUCCESS(err);
23157
23158 for (const auto &extension_props : available_extensions) {
23159 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23160 supports_nv_dedicated_allocation = true;
23161 }
23162 }
23163 }
23164
23165 if (supports_nv_dedicated_allocation) {
23166 m_errorMonitor->ExpectSuccess();
23167
23168 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23169 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23170 dedicated_buffer_create_info.pNext = nullptr;
23171 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23172
23173 uint32_t queue_family_index = 0;
23174 VkBufferCreateInfo buffer_create_info = {};
23175 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23176 buffer_create_info.pNext = &dedicated_buffer_create_info;
23177 buffer_create_info.size = 1024;
23178 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23179 buffer_create_info.queueFamilyIndexCount = 1;
23180 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23181
23182 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023183 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023184 ASSERT_VK_SUCCESS(err);
23185
23186 VkMemoryRequirements memory_reqs;
23187 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23188
23189 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23190 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23191 dedicated_memory_info.pNext = nullptr;
23192 dedicated_memory_info.buffer = buffer;
23193 dedicated_memory_info.image = VK_NULL_HANDLE;
23194
23195 VkMemoryAllocateInfo memory_info = {};
23196 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23197 memory_info.pNext = &dedicated_memory_info;
23198 memory_info.allocationSize = memory_reqs.size;
23199
23200 bool pass;
23201 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23202 ASSERT_TRUE(pass);
23203
23204 VkDeviceMemory buffer_memory;
23205 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23206 ASSERT_VK_SUCCESS(err);
23207
23208 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
23209 ASSERT_VK_SUCCESS(err);
23210
23211 vkDestroyBuffer(m_device->device(), buffer, NULL);
23212 vkFreeMemory(m_device->device(), buffer_memory, NULL);
23213
23214 m_errorMonitor->VerifyNotFound();
23215 }
23216}
23217
23218TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23219 VkResult err;
23220
23221 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23222
Tony Barbour1fa09702017-03-16 12:09:08 -060023223 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23225
23226 std::vector<const char *> device_extension_names;
23227 auto features = m_device->phy().features();
23228 // Artificially disable support for non-solid fill modes
23229 features.fillModeNonSolid = false;
23230 // The sacrificial device object
23231 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23232
23233 VkRenderpassObj render_pass(&test_device);
23234
23235 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23236 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23237 pipeline_layout_ci.setLayoutCount = 0;
23238 pipeline_layout_ci.pSetLayouts = NULL;
23239
23240 VkPipelineLayout pipeline_layout;
23241 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23242 ASSERT_VK_SUCCESS(err);
23243
23244 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23245 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23246 rs_ci.pNext = nullptr;
23247 rs_ci.lineWidth = 1.0f;
23248 rs_ci.rasterizerDiscardEnable = true;
23249
23250 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23251 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23252
23253 // Set polygonMode=FILL. No error is expected
23254 m_errorMonitor->ExpectSuccess();
23255 {
23256 VkPipelineObj pipe(&test_device);
23257 pipe.AddShader(&vs);
23258 pipe.AddShader(&fs);
23259 pipe.AddColorAttachment();
23260 // Set polygonMode to a good value
23261 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23262 pipe.SetRasterization(&rs_ci);
23263 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23264 }
23265 m_errorMonitor->VerifyNotFound();
23266
23267 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23268}
23269
Chris Forbes94196952017-04-06 16:30:59 -070023270TEST_F(VkPositiveLayerTest, LongSemaphoreChain)
23271{
23272 m_errorMonitor->ExpectSuccess();
23273
23274 ASSERT_NO_FATAL_FAILURE(Init());
23275 VkResult err;
23276
23277 std::vector<VkSemaphore> semaphores;
23278
23279 const int chainLength = 32768;
23280 VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
23281
23282 for (int i = 0; i < chainLength; i++) {
23283 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
23284 VkSemaphore semaphore;
23285 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &semaphore);
23286 ASSERT_VK_SUCCESS(err);
23287
23288 semaphores.push_back(semaphore);
23289
Chris Forbesfc50aaa2017-05-01 10:20:17 -070023290 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO,
23291 nullptr,
23292 semaphores.size() > 1 ? 1u : 0u,
23293 semaphores.size() > 1 ? &semaphores[semaphores.size() - 2] : nullptr,
23294 &flags,
23295 0,
23296 nullptr,
23297 1,
23298 &semaphores[semaphores.size() - 1]};
Chris Forbes94196952017-04-06 16:30:59 -070023299 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
23300 ASSERT_VK_SUCCESS(err);
23301 }
23302
23303 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23304 VkFence fence;
23305 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23306 ASSERT_VK_SUCCESS(err);
23307 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &semaphores.back(), &flags, 0, nullptr, 0, nullptr };
23308 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23309 ASSERT_VK_SUCCESS(err);
23310
23311 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23312
23313 for (auto semaphore : semaphores)
23314 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
23315
23316 vkDestroyFence(m_device->device(), fence, nullptr);
23317
23318 m_errorMonitor->VerifyNotFound();
23319}
23320
Mike Stroyanca855662017-05-02 11:06:27 -060023321extern "C" void *ReleaseNullFence(void *arg) {
23322 struct thread_data_struct *data = (struct thread_data_struct *)arg;
23323
23324 for (int i = 0; i < 40000; i++) {
23325 vkDestroyFence(data->device, VK_NULL_HANDLE, NULL);
23326 if (data->bailout) {
23327 break;
23328 }
23329 }
23330 return NULL;
23331}
23332
23333TEST_F(VkPositiveLayerTest, ThreadNullFenceCollision) {
23334 test_platform_thread thread;
23335
23336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
23337
23338 ASSERT_NO_FATAL_FAILURE(Init());
23339
23340 struct thread_data_struct data;
23341 data.device = m_device->device();
23342 data.bailout = false;
23343 m_errorMonitor->SetBailout(&data.bailout);
23344
23345 // Call vkDestroyFence of VK_NULL_HANDLE repeatedly using multiple threads.
23346 // There should be no validation error from collision of that non-object.
23347 test_platform_thread_create(&thread, ReleaseNullFence, (void *)&data);
23348 for (int i = 0; i < 40000; i++) {
23349 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
23350 }
23351 test_platform_thread_join(thread, NULL);
23352
23353 m_errorMonitor->SetBailout(NULL);
23354
23355 m_errorMonitor->VerifyNotFound();
23356}
23357
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023358#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023359TEST_F(VkPositiveLayerTest, LongFenceChain)
23360{
23361 m_errorMonitor->ExpectSuccess();
23362
Tony Barbour1fa09702017-03-16 12:09:08 -060023363 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023364 VkResult err;
23365
23366 std::vector<VkFence> fences;
23367
23368 const int chainLength = 32768;
23369
23370 for (int i = 0; i < chainLength; i++) {
23371 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23372 VkFence fence;
23373 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23374 ASSERT_VK_SUCCESS(err);
23375
23376 fences.push_back(fence);
23377
23378 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23379 0, nullptr, 0, nullptr };
23380 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23381 ASSERT_VK_SUCCESS(err);
23382
23383 }
23384
23385 // BOOM, stack overflow.
23386 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23387
23388 for (auto fence : fences)
23389 vkDestroyFence(m_device->device(), fence, nullptr);
23390
23391 m_errorMonitor->VerifyNotFound();
23392}
23393#endif
23394
Cody Northrop1242dfd2016-07-13 17:24:59 -060023395#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023396const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023397static bool initialized = false;
23398static bool active = false;
23399
23400// Convert Intents to argv
23401// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023402std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023403 std::vector<std::string> args;
23404 JavaVM &vm = *app.activity->vm;
23405 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023406 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023407
23408 JNIEnv &env = *p_env;
23409 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023410 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023411 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023412 jmethodID get_string_extra_method =
23413 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023414 jvalue get_string_extra_args;
23415 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023416 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023417
23418 std::string args_str;
23419 if (extra_str) {
23420 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23421 args_str = extra_utf;
23422 env.ReleaseStringUTFChars(extra_str, extra_utf);
23423 env.DeleteLocalRef(extra_str);
23424 }
23425
23426 env.DeleteLocalRef(get_string_extra_args.l);
23427 env.DeleteLocalRef(intent);
23428 vm.DetachCurrentThread();
23429
23430 // split args_str
23431 std::stringstream ss(args_str);
23432 std::string arg;
23433 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023434 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023435 }
23436
23437 return args;
23438}
23439
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023440void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
23441 const char *const type_param = test_info.type_param();
23442 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060023443
23444 if (type_param != NULL || value_param != NULL) {
23445 error_message.append(", where ");
23446 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023447 error_message.append("TypeParam = ").append(type_param);
23448 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060023449 }
23450 if (value_param != NULL) {
23451 error_message.append("GetParam() = ").append(value_param);
23452 }
23453 }
23454}
23455
23456// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23457class LogcatPrinter : public ::testing::EmptyTestEventListener {
23458 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023459 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023460 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23461 }
23462
23463 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023464 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060023465 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023466 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060023467
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023468 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
23469 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060023470 }
23471
23472 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023473 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023474 std::string result;
23475 if (info.result()->Passed()) {
23476 result.append("[ OK ]");
23477 } else {
23478 result.append("[ FAILED ]");
23479 }
23480 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023481 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060023482
23483 if (::testing::GTEST_FLAG(print_time)) {
23484 std::ostringstream os;
23485 os << info.result()->elapsed_time();
23486 result.append(" (").append(os.str()).append(" ms)");
23487 }
23488
23489 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23490 };
23491};
23492
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023493static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023494
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023495static void processCommand(struct android_app *app, int32_t cmd) {
23496 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023497 case APP_CMD_INIT_WINDOW: {
23498 if (app->window) {
23499 initialized = true;
23500 }
23501 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023502 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023503 case APP_CMD_GAINED_FOCUS: {
23504 active = true;
23505 break;
23506 }
23507 case APP_CMD_LOST_FOCUS: {
23508 active = false;
23509 break;
23510 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023511 }
23512}
23513
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023514void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023515 app_dummy();
23516
Cody Northrop1242dfd2016-07-13 17:24:59 -060023517 int vulkanSupport = InitVulkan();
23518 if (vulkanSupport == 0) {
23519 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23520 return;
23521 }
23522
23523 app->onAppCmd = processCommand;
23524 app->onInputEvent = processInput;
23525
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023526 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023527 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023528 struct android_poll_source *source;
23529 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023530 if (source) {
23531 source->process(app, source);
23532 }
23533
23534 if (app->destroyRequested != 0) {
23535 VkTestFramework::Finish();
23536 return;
23537 }
23538 }
23539
23540 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023541 // Use the following key to send arguments to gtest, i.e.
23542 // --es args "--gtest_filter=-VkLayerTest.foo"
23543 const char key[] = "args";
23544 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023545
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023546 std::string filter = "";
23547 if (args.size() > 0) {
23548 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23549 filter += args[0];
23550 } else {
23551 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23552 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023553
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023554 int argc = 2;
23555 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23556 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023557
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023558 // Route output to files until we can override the gtest output
23559 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23560 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023562 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023563
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023564 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060023565 listeners.Append(new LogcatPrinter);
23566
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023567 VkTestFramework::InitArgs(&argc, argv);
23568 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023569
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023570 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023571
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023572 if (result != 0) {
23573 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23574 } else {
23575 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23576 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023577
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023578 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023579
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023580 fclose(stdout);
23581 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023582
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023583 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023584 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023585 }
23586 }
23587}
23588#endif
23589
Tony Barbour300a6082015-04-07 13:44:53 -060023590int main(int argc, char **argv) {
23591 int result;
23592
Cody Northrop8e54a402016-03-08 22:25:52 -070023593#ifdef ANDROID
23594 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023595 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023596#endif
23597
Tony Barbour300a6082015-04-07 13:44:53 -060023598 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023599 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023600
23601 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23602
23603 result = RUN_ALL_TESTS();
23604
Tony Barbour6918cd52015-04-09 12:58:51 -060023605 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023606 return result;
23607}