blob: 417ed0cd77b3f4d1b098d217fdf0c8f226d95d08 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600341#ifdef _DEBUG
342 char embedded_code_string[2048];
343 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
344 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
345#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600346 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600347#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600348 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600349 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600350}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700353 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
355 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700356 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600357 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
358 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 }
Tony Barbour300a6082015-04-07 13:44:53 -0600360
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
362 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700363 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600364 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700365 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600366 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700367 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
369 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
370 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700371 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
372 }
373 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
374 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
375 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600376 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
378 InitState(features, flags);
379 }
380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700381 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700382 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600384 std::vector<const char *> instance_layer_names;
385 std::vector<const char *> instance_extension_names;
386 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600387
388 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700389 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600390 /*
391 * Since CreateDbgMsgCallback is an instance level extension call
392 * any extension / layer that utilizes that feature also needs
393 * to be enabled at create instance time.
394 */
Karl Schultz6addd812016-02-02 17:17:23 -0700395 // Use Threading layer first to protect others from
396 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700397 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800399 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700400 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600401 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700402 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600403
Ian Elliott2c1daf52016-05-12 09:41:46 -0600404 if (m_enableWSI) {
405 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
406 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
407#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
408#if defined(VK_USE_PLATFORM_ANDROID_KHR)
409 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_MIR_KHR)
412 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
415 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600417#if defined(VK_USE_PLATFORM_WIN32_KHR)
418 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_WIN32_KHR
420#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600421#if defined(VK_USE_PLATFORM_XCB_KHR)
422 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
423#elif defined(VK_USE_PLATFORM_XLIB_KHR)
424 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700425#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600426 }
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800430 this->app_info.pApplicationName = "layer_tests";
431 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600432 this->app_info.pEngineName = "unittest";
433 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600434 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600435
Tony Barbour15524c32015-04-29 17:34:29 -0600436 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
438
439 virtual void TearDown() {
440 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600441 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600442 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600443 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600446};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600448void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449 // Create identity matrix
450 int i;
451 struct vktriangle_vs_uniform data;
452
453 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700454 glm::mat4 View = glm::mat4(1.0f);
455 glm::mat4 Model = glm::mat4(1.0f);
456 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700458 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
460 memcpy(&data.mvp, &MVP[0][0], matrixSize);
461
Karl Schultz6addd812016-02-02 17:17:23 -0700462 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600463 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464 };
465
Karl Schultz6addd812016-02-02 17:17:23 -0700466 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 data.position[i][0] = tri_data[i].posX;
468 data.position[i][1] = tri_data[i].posY;
469 data.position[i][2] = tri_data[i].posZ;
470 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700471 data.color[i][0] = tri_data[i].r;
472 data.color[i][1] = tri_data[i].g;
473 data.color[i][2] = tri_data[i].b;
474 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475 }
476
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477 ASSERT_NO_FATAL_FAILURE(InitViewport());
478
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200479 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
480 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Karl Schultz6addd812016-02-02 17:17:23 -0700482 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800486 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487 pipelineobj.AddShader(&vs);
488 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 if (failMask & BsoFailLineWidth) {
490 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600492 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
494 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600495 }
496 if (failMask & BsoFailDepthBias) {
497 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600498 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600499 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600500 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600501 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600502 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700504 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700505 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600506 if (failMask & BsoFailViewport) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
508 }
509 if (failMask & BsoFailScissor) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
511 }
512 if (failMask & BsoFailBlend) {
513 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600514 VkPipelineColorBlendAttachmentState att_state = {};
515 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
516 att_state.blendEnable = VK_TRUE;
517 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 }
519 if (failMask & BsoFailDepthBounds) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
521 }
522 if (failMask & BsoFailStencilReadMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
524 }
525 if (failMask & BsoFailStencilWriteMask) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
527 }
528 if (failMask & BsoFailStencilReference) {
529 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
530 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600533 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700536 m_commandBuffer->BeginCommandBuffer();
537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538
Tony Barbourfe3351b2015-07-28 10:17:20 -0600539 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500540
541 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600542 if (failMask & BsoFailIndexBuffer) {
543 // Use DrawIndexed w/o an index buffer bound
544 DrawIndexed(3, 1, 0, 0, 0);
545 } else {
546 Draw(3, 1, 0, 0);
547 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500548
Mark Muellerd4914412016-06-13 17:52:06 -0600549 if (failMask & BsoFailCmdClearAttachments) {
550 VkClearAttachment color_attachment = {};
551 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700552 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600553 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
554
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600555 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600556 }
557
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500558 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700559 m_commandBuffer->EndRenderPass();
560 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600561 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562}
563
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
565 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500568 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600569 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500570 }
571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700573 // Make sure depthWriteEnable is set so that Depth fail test will work
574 // correctly
575 // Make sure stencilTestEnable is set so that Stencil fail test will work
576 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600577 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800578 stencil.failOp = VK_STENCIL_OP_KEEP;
579 stencil.passOp = VK_STENCIL_OP_KEEP;
580 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
581 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600582
583 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
584 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600585 ds_ci.pNext = NULL;
586 ds_ci.depthTestEnable = VK_FALSE;
587 ds_ci.depthWriteEnable = VK_TRUE;
588 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
589 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600590 if (failMask & BsoFailDepthBounds) {
591 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600592 ds_ci.maxDepthBounds = 0.0f;
593 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600594 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600595 ds_ci.stencilTestEnable = VK_TRUE;
596 ds_ci.front = stencil;
597 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600598
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600599 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600600 pipelineobj.SetViewport(m_viewports);
601 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600603 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 commandBuffer->BindPipeline(pipelineobj);
606 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500607}
608
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700610 public:
611 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600612};
613
Ian Elliott2c1daf52016-05-12 09:41:46 -0600614class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
616 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600617 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600618};
619
Mark Muellerdfe37552016-07-07 14:47:42 -0600620class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700621 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600622 enum eTestEnFlags {
623 eDoubleDelete,
624 eInvalidDeviceOffset,
625 eInvalidMemoryOffset,
626 eBindNullBuffer,
627 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600628 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 };
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
634 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635 return true;
636 }
637 VkDeviceSize offset_limit = 0;
638 if (eInvalidMemoryOffset == aTestFlag) {
639 VkBuffer vulkanBuffer;
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600646 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
650 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
652 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600654 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600656 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 }
658 if (eOffsetAlignment < offset_limit) {
659 return true;
660 }
661 return false;
662 }
663
664 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
666 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (eBindNullBuffer == aTestFlag) {
668 VulkanMemory = 0;
669 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
670 } else {
671 VkBufferCreateInfo buffer_create_info = {};
672 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
673 buffer_create_info.size = 32;
674 buffer_create_info.usage = aBufferUsage;
675
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600676 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677
678 CreateCurrent = true;
679
680 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 VkMemoryAllocateInfo memory_allocate_info = {};
684 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800685 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600686 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
687 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 if (!pass) {
689 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
690 return;
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 AllocateCurrent = true;
695 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600696 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
697 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 BoundCurrent = true;
699
700 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
701 }
702 }
703
704 ~VkBufferTest() {
705 if (CreateCurrent) {
706 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
707 }
708 if (AllocateCurrent) {
709 if (InvalidDeleteEn) {
710 union {
711 VkDeviceMemory device_memory;
712 unsigned long long index_access;
713 } bad_index;
714
715 bad_index.device_memory = VulkanMemory;
716 bad_index.index_access++;
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 }
720 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
721 }
722 }
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600725
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600727
728 void TestDoubleDestroy() {
729 // Destroy the buffer but leave the flag set, which will cause
730 // the buffer to be destroyed again in the destructor.
731 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
732 }
733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700734 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600735 bool AllocateCurrent;
736 bool BoundCurrent;
737 bool CreateCurrent;
738 bool InvalidDeleteEn;
739
740 VkBuffer VulkanBuffer;
741 VkDevice VulkanDevice;
742 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600743};
744
745class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600748 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700749 : BoundCurrent(false),
750 AttributeCount(aAttributeCount),
751 BindingCount(aBindingCount),
752 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600754 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
755 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700756 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
759 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
762 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
763 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
764 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
765 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600766
767 unsigned i = 0;
768 do {
769 VertexInputAttributeDescription[i].binding = BindId;
770 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
772 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 i++;
774 } while (AttributeCount < i);
775
776 i = 0;
777 do {
778 VertexInputBindingDescription[i].binding = BindId;
779 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600780 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600781 i++;
782 } while (BindingCount < i);
783 }
784
785 ~VkVerticesObj() {
786 if (VertexInputAttributeDescription) {
787 delete[] VertexInputAttributeDescription;
788 }
789 if (VertexInputBindingDescription) {
790 delete[] VertexInputBindingDescription;
791 }
792 }
793
794 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
796 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 return true;
798 }
799
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600800 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600801 VkDeviceSize *offsetList;
802 unsigned offsetCount;
803
804 if (aOffsetCount) {
805 offsetList = aOffsetList;
806 offsetCount = aOffsetCount;
807 } else {
808 offsetList = new VkDeviceSize[1]();
809 offsetCount = 1;
810 }
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600813 BoundCurrent = true;
814
815 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600817 }
818 }
819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700820 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600821 static uint32_t BindIdGenerator;
822
823 bool BoundCurrent;
824 unsigned AttributeCount;
825 unsigned BindingCount;
826 uint32_t BindId;
827
828 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
829 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
830 VkVertexInputBindingDescription *VertexInputBindingDescription;
831 VkConstantBufferObj VulkanMemoryBuffer;
832};
833
834uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500835// ********************************************************************************************************************
836// ********************************************************************************************************************
837// ********************************************************************************************************************
838// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700840 TEST_DESCRIPTION(
841 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
842 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600843
Tony Barbour1fa09702017-03-16 12:09:08 -0600844 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a pointer to a handle
848 // Expected to trigger an error with
849 // parameter_validation::validate_required_pointer
850 vkGetPhysicalDeviceFeatures(gpu(), NULL);
851 m_errorMonitor->VerifyFound();
852
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
854 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify NULL for pointer to array count
856 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600857 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify 0 for a required array count
862 // Expected to trigger an error with parameter_validation::validate_array
863 VkViewport view_port = {};
864 m_commandBuffer->SetViewport(0, 0, &view_port);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify NULL for a required array
869 // Expected to trigger an error with parameter_validation::validate_array
870 m_commandBuffer->SetViewport(0, 1, NULL);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify VK_NULL_HANDLE for a required handle
875 // Expected to trigger an error with
876 // parameter_validation::validate_required_handle
877 vkUnmapMemory(device(), VK_NULL_HANDLE);
878 m_errorMonitor->VerifyFound();
879
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
881 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882 // Specify VK_NULL_HANDLE for a required handle array entry
883 // Expected to trigger an error with
884 // parameter_validation::validate_required_handle_array
885 VkFence fence = VK_NULL_HANDLE;
886 vkResetFences(device(), 1, &fence);
887 m_errorMonitor->VerifyFound();
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags parameter
899 // Expected to trigger an error with parameter_validation::validate_flags
900 m_commandBuffer->SetStencilReference(0, 0);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600904 // Specify 0 for a required VkFlags array entry
905 // Expected to trigger an error with
906 // parameter_validation::validate_flags_array
907 VkSemaphore semaphore = VK_NULL_HANDLE;
908 VkPipelineStageFlags stageFlags = 0;
909 VkSubmitInfo submitInfo = {};
910 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
911 submitInfo.waitSemaphoreCount = 1;
912 submitInfo.pWaitSemaphores = &semaphore;
913 submitInfo.pWaitDstStageMask = &stageFlags;
914 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600917
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918TEST_F(VkLayerTest, ReservedParameter) {
919 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
920
Tony Barbour1fa09702017-03-16 12:09:08 -0600921 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600922
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600924 // Specify 0 for a reserved VkFlags parameter
925 // Expected to trigger an error with
926 // parameter_validation::validate_reserved_flags
927 VkEvent event_handle = VK_NULL_HANDLE;
928 VkEventCreateInfo event_info = {};
929 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
930 event_info.flags = 1;
931 vkCreateEvent(device(), &event_info, NULL, &event_handle);
932 m_errorMonitor->VerifyFound();
933}
934
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700936 TEST_DESCRIPTION(
937 "Specify an invalid VkStructureType for a Vulkan "
938 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939
Tony Barbour1fa09702017-03-16 12:09:08 -0600940 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600941
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943 // Zero struct memory, effectively setting sType to
944 // VK_STRUCTURE_TYPE_APPLICATION_INFO
945 // Expected to trigger an error with
946 // parameter_validation::validate_struct_type
947 VkMemoryAllocateInfo alloc_info = {};
948 VkDeviceMemory memory = VK_NULL_HANDLE;
949 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
950 m_errorMonitor->VerifyFound();
951
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600953 // Zero struct memory, effectively setting sType to
954 // VK_STRUCTURE_TYPE_APPLICATION_INFO
955 // Expected to trigger an error with
956 // parameter_validation::validate_struct_type_array
957 VkSubmitInfo submit_info = {};
958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
959 m_errorMonitor->VerifyFound();
960}
961
962TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600963 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600964
Tony Barbour1fa09702017-03-16 12:09:08 -0600965 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600966
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600968 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600969 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600970 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600971 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600972 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600973 // Zero-initialization will provide the correct sType
974 VkApplicationInfo app_info = {};
975 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
976 event_alloc_info.pNext = &app_info;
977 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
978 m_errorMonitor->VerifyFound();
979
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
981 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
983 // a function that has allowed pNext structure types and specify
984 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600985 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600987 VkMemoryAllocateInfo memory_alloc_info = {};
988 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
989 memory_alloc_info.pNext = &app_info;
990 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600991 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600992}
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
994TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600995 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600996
Tony Barbour1fa09702017-03-16 12:09:08 -0600997 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "does not fall within the begin..end "
1001 "range of the core VkFormat "
1002 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 // Specify an invalid VkFormat value
1004 // Expected to trigger an error with
1005 // parameter_validation::validate_ranged_enum
1006 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001008 m_errorMonitor->VerifyFound();
1009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001011 // Specify an invalid VkFlags bitmask value
1012 // Expected to trigger an error with parameter_validation::validate_flags
1013 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1015 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001016 m_errorMonitor->VerifyFound();
1017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001019 // Specify an invalid VkFlags array entry
1020 // Expected to trigger an error with
1021 // parameter_validation::validate_flags_array
1022 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001024 VkSubmitInfo submit_info = {};
1025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1026 submit_info.waitSemaphoreCount = 1;
1027 submit_info.pWaitSemaphores = &semaphore;
1028 submit_info.pWaitDstStageMask = &stage_flags;
1029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1030 m_errorMonitor->VerifyFound();
1031
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 // Specify an invalid VkBool32 value
1034 // Expected to trigger a warning with
1035 // parameter_validation::validate_bool32
1036 VkSampler sampler = VK_NULL_HANDLE;
1037 VkSamplerCreateInfo sampler_info = {};
1038 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1039 sampler_info.pNext = NULL;
1040 sampler_info.magFilter = VK_FILTER_NEAREST;
1041 sampler_info.minFilter = VK_FILTER_NEAREST;
1042 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1043 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1044 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1045 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1046 sampler_info.mipLodBias = 1.0;
1047 sampler_info.maxAnisotropy = 1;
1048 sampler_info.compareEnable = VK_FALSE;
1049 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1050 sampler_info.minLod = 1.0;
1051 sampler_info.maxLod = 1.0;
1052 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1053 sampler_info.unnormalizedCoordinates = VK_FALSE;
1054 // Not VK_TRUE or VK_FALSE
1055 sampler_info.anisotropyEnable = 3;
1056 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1057 m_errorMonitor->VerifyFound();
1058}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001059
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001060TEST_F(VkLayerTest, UpdateBufferAlignment) {
1061 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001062 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001063
Tony Barbour1fa09702017-03-16 12:09:08 -06001064 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001065
1066 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1067 vk_testing::Buffer buffer;
1068 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1069
Tony Barbour552f6c02016-12-21 14:34:07 -07001070 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001071 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1074 m_errorMonitor->VerifyFound();
1075
1076 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001078 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1079 m_errorMonitor->VerifyFound();
1080
1081 // Introduce failure by using dataSize that is < 0
1082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001083 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001084 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1085 m_errorMonitor->VerifyFound();
1086
1087 // Introduce failure by using dataSize that is > 65536
1088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001089 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1091 m_errorMonitor->VerifyFound();
1092
Tony Barbour552f6c02016-12-21 14:34:07 -07001093 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094}
1095
1096TEST_F(VkLayerTest, FillBufferAlignment) {
1097 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1098
Tony Barbour1fa09702017-03-16 12:09:08 -06001099 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100
1101 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1102 vk_testing::Buffer buffer;
1103 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1104
Tony Barbour552f6c02016-12-21 14:34:07 -07001105 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001106
1107 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001114 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1115 m_errorMonitor->VerifyFound();
1116
1117 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
Tony Barbour552f6c02016-12-21 14:34:07 -07001122 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001123}
Dustin Graves40f35822016-06-23 11:12:53 -06001124
Cortd889ff92016-07-27 09:51:27 -07001125TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1126 VkResult err;
1127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001128 TEST_DESCRIPTION(
1129 "Attempt to use a non-solid polygon fill mode in a "
1130 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001131
Tony Barbour1fa09702017-03-16 12:09:08 -06001132 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1134
1135 std::vector<const char *> device_extension_names;
1136 auto features = m_device->phy().features();
1137 // Artificially disable support for non-solid fill modes
1138 features.fillModeNonSolid = false;
1139 // The sacrificial device object
1140 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1141
1142 VkRenderpassObj render_pass(&test_device);
1143
1144 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1145 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1146 pipeline_layout_ci.setLayoutCount = 0;
1147 pipeline_layout_ci.pSetLayouts = NULL;
1148
1149 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001150 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001151 ASSERT_VK_SUCCESS(err);
1152
1153 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1154 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1155 rs_ci.pNext = nullptr;
1156 rs_ci.lineWidth = 1.0f;
1157 rs_ci.rasterizerDiscardEnable = true;
1158
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001159 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1160 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001161
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001162 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1164 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001165 {
1166 VkPipelineObj pipe(&test_device);
1167 pipe.AddShader(&vs);
1168 pipe.AddShader(&fs);
1169 pipe.AddColorAttachment();
1170 // Introduce failure by setting unsupported polygon mode
1171 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1172 pipe.SetRasterization(&rs_ci);
1173 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1174 }
1175 m_errorMonitor->VerifyFound();
1176
1177 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1179 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001180 {
1181 VkPipelineObj pipe(&test_device);
1182 pipe.AddShader(&vs);
1183 pipe.AddShader(&fs);
1184 pipe.AddColorAttachment();
1185 // Introduce failure by setting unsupported polygon mode
1186 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1187 pipe.SetRasterization(&rs_ci);
1188 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1189 }
1190 m_errorMonitor->VerifyFound();
1191
Cortd889ff92016-07-27 09:51:27 -07001192 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1193}
1194
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001195#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001196TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001197{
1198 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001199 VkFenceCreateInfo fenceInfo = {};
1200 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1201 fenceInfo.pNext = NULL;
1202 fenceInfo.flags = 0;
1203
Mike Weiblencce7ec72016-10-17 19:33:05 -06001204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001205
Tony Barbour1fa09702017-03-16 12:09:08 -06001206 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001207
1208 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1209 vk_testing::Buffer buffer;
1210 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001211
Tony Barbourfe3351b2015-07-28 10:17:20 -06001212 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001213 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001214 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001215
1216 testFence.init(*m_device, fenceInfo);
1217
1218 // Bypass framework since it does the waits automatically
1219 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001220 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001221 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1222 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001223 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001224 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001225 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001226 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001228 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001229 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001230
1231 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001232 ASSERT_VK_SUCCESS( err );
1233
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001234 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001235 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001237 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001238}
1239
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001240TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001241{
1242 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001243 VkFenceCreateInfo fenceInfo = {};
1244 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1245 fenceInfo.pNext = NULL;
1246 fenceInfo.flags = 0;
1247
Mike Weiblencce7ec72016-10-17 19:33:05 -06001248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001249
Tony Barbour1fa09702017-03-16 12:09:08 -06001250 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251 ASSERT_NO_FATAL_FAILURE(InitViewport());
1252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1253
Tony Barbourfe3351b2015-07-28 10:17:20 -06001254 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001255 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001256 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257
1258 testFence.init(*m_device, fenceInfo);
1259
1260 // Bypass framework since it does the waits automatically
1261 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001262 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001263 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1264 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001265 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001266 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001267 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001268 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001269 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001270 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001271 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001272
1273 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 ASSERT_VK_SUCCESS( err );
1275
Jon Ashburnf19916e2016-01-11 13:12:43 -07001276 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001277 VkCommandBufferBeginInfo info = {};
1278 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1279 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001280 info.renderPass = VK_NULL_HANDLE;
1281 info.subpass = 0;
1282 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001283 info.occlusionQueryEnable = VK_FALSE;
1284 info.queryFlags = 0;
1285 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001286
1287 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001288 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001289
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001290 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001291}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001292#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001293
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001294TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1295 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1296
Tony Barbour1fa09702017-03-16 12:09:08 -06001297 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001298
1299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1300 VkBuffer buffer;
1301 VkBufferCreateInfo buf_info = {};
1302 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1303 buf_info.pNext = NULL;
1304 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1305 buf_info.size = 2048;
1306 buf_info.queueFamilyIndexCount = 0;
1307 buf_info.pQueueFamilyIndices = NULL;
1308 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1309 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1310 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1311 m_errorMonitor->VerifyFound();
1312
1313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1314 VkImage image;
1315 VkImageCreateInfo image_create_info = {};
1316 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1317 image_create_info.pNext = NULL;
1318 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1319 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1320 image_create_info.extent.width = 512;
1321 image_create_info.extent.height = 64;
1322 image_create_info.extent.depth = 1;
1323 image_create_info.mipLevels = 1;
1324 image_create_info.arrayLayers = 1;
1325 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1326 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1327 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1328 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1329 image_create_info.queueFamilyIndexCount = 0;
1330 image_create_info.pQueueFamilyIndices = NULL;
1331 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1332 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1333 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1334 m_errorMonitor->VerifyFound();
1335}
1336
Dave Houlton829c0d82017-01-24 15:09:17 -07001337TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1338 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1339
1340 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001341 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001342 ASSERT_NO_FATAL_FAILURE(
1343 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001344 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001345
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001346 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001347 device_features.sparseResidencyImage2D = VK_FALSE;
1348 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001349 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 VkImage image = VK_NULL_HANDLE;
1352 VkResult result = VK_RESULT_MAX_ENUM;
1353 VkImageCreateInfo image_create_info = {};
1354 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1355 image_create_info.pNext = NULL;
1356 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1357 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1358 image_create_info.extent.width = 512;
1359 image_create_info.extent.height = 1;
1360 image_create_info.extent.depth = 1;
1361 image_create_info.mipLevels = 1;
1362 image_create_info.arrayLayers = 1;
1363 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1364 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1365 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1366 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1367 image_create_info.queueFamilyIndexCount = 0;
1368 image_create_info.pQueueFamilyIndices = NULL;
1369 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1370 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1371
1372 // 1D image w/ sparse residency is an error
1373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1374 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1375 m_errorMonitor->VerifyFound();
1376 if (VK_SUCCESS == result) {
1377 vkDestroyImage(m_device->device(), image, NULL);
1378 image = VK_NULL_HANDLE;
1379 }
1380
1381 // 2D image w/ sparse residency when feature isn't available
1382 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1383 image_create_info.extent.height = 64;
1384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1385 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1386 m_errorMonitor->VerifyFound();
1387 if (VK_SUCCESS == result) {
1388 vkDestroyImage(m_device->device(), image, NULL);
1389 image = VK_NULL_HANDLE;
1390 }
1391
1392 // 3D image w/ sparse residency when feature isn't available
1393 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1394 image_create_info.extent.depth = 8;
1395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1396 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1397 m_errorMonitor->VerifyFound();
1398 if (VK_SUCCESS == result) {
1399 vkDestroyImage(m_device->device(), image, NULL);
1400 image = VK_NULL_HANDLE;
1401 }
1402}
1403
1404TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1405 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1406
1407 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001408 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001409 ASSERT_NO_FATAL_FAILURE(
1410 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001411 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001412
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001413 // These tests require that the device support sparse residency for 2D images
1414 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1415 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001416 return;
1417 }
1418
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001419 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001420 device_features.sparseResidency2Samples = VK_FALSE;
1421 device_features.sparseResidency4Samples = VK_FALSE;
1422 device_features.sparseResidency8Samples = VK_FALSE;
1423 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001424 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001425
1426 VkImage image = VK_NULL_HANDLE;
1427 VkResult result = VK_RESULT_MAX_ENUM;
1428 VkImageCreateInfo image_create_info = {};
1429 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1430 image_create_info.pNext = NULL;
1431 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1432 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1433 image_create_info.extent.width = 64;
1434 image_create_info.extent.height = 64;
1435 image_create_info.extent.depth = 1;
1436 image_create_info.mipLevels = 1;
1437 image_create_info.arrayLayers = 1;
1438 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1439 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1440 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1441 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1442 image_create_info.queueFamilyIndexCount = 0;
1443 image_create_info.pQueueFamilyIndices = NULL;
1444 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1445 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1446
1447 // 2D image w/ sparse residency and linear tiling is an error
1448 m_errorMonitor->SetDesiredFailureMsg(
1449 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1450 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1451 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1452 m_errorMonitor->VerifyFound();
1453 if (VK_SUCCESS == result) {
1454 vkDestroyImage(m_device->device(), image, NULL);
1455 image = VK_NULL_HANDLE;
1456 }
1457 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1458
1459 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1460 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1462 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1463 m_errorMonitor->VerifyFound();
1464 if (VK_SUCCESS == result) {
1465 vkDestroyImage(m_device->device(), image, NULL);
1466 image = VK_NULL_HANDLE;
1467 }
1468
1469 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486
1487 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495}
1496
Tobin Ehlisf11be982016-05-11 13:52:53 -06001497TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001498 TEST_DESCRIPTION(
1499 "Create a buffer and image, allocate memory, and bind the "
1500 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001501 VkResult err;
1502 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001503 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001504
Tobin Ehlis077ded32016-05-12 17:39:13 -06001505 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001507 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001508 VkDeviceMemory mem; // buffer will be bound first
1509 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001510 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001511 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001512
1513 VkBufferCreateInfo buf_info = {};
1514 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1515 buf_info.pNext = NULL;
1516 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1517 buf_info.size = 256;
1518 buf_info.queueFamilyIndexCount = 0;
1519 buf_info.pQueueFamilyIndices = NULL;
1520 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1521 buf_info.flags = 0;
1522 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1523 ASSERT_VK_SUCCESS(err);
1524
Tobin Ehlis077ded32016-05-12 17:39:13 -06001525 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001526
1527 VkImageCreateInfo image_create_info = {};
1528 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1529 image_create_info.pNext = NULL;
1530 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1531 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1532 image_create_info.extent.width = 64;
1533 image_create_info.extent.height = 64;
1534 image_create_info.extent.depth = 1;
1535 image_create_info.mipLevels = 1;
1536 image_create_info.arrayLayers = 1;
1537 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001538 // Image tiling must be optimal to trigger error when aliasing linear buffer
1539 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001540 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1541 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1542 image_create_info.queueFamilyIndexCount = 0;
1543 image_create_info.pQueueFamilyIndices = NULL;
1544 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1545 image_create_info.flags = 0;
1546
Tobin Ehlisf11be982016-05-11 13:52:53 -06001547 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1548 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001549 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1550 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551
Tobin Ehlis077ded32016-05-12 17:39:13 -06001552 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1553
1554 VkMemoryAllocateInfo alloc_info = {};
1555 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1556 alloc_info.pNext = NULL;
1557 alloc_info.memoryTypeIndex = 0;
1558 // Ensure memory is big enough for both bindings
1559 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001560 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1561 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001562 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001563 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001564 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001565 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001566 return;
1567 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001568 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1569 ASSERT_VK_SUCCESS(err);
1570 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1571 ASSERT_VK_SUCCESS(err);
1572
Rene Lindsayd14f5572016-12-16 14:57:18 -07001573 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1574
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001576 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001577 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1578 m_errorMonitor->VerifyFound();
1579
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001581 // aliasing buffer2
1582 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1583 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001584 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1585 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001586 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001587 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001589 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 m_errorMonitor->VerifyFound();
1592
1593 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 vkFreeMemory(m_device->device(), mem, NULL);
1598 vkFreeMemory(m_device->device(), mem_img, NULL);
1599}
1600
Tobin Ehlis35372522016-05-12 08:32:31 -06001601TEST_F(VkLayerTest, InvalidMemoryMapping) {
1602 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1603 VkResult err;
1604 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001605 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001606
1607 VkBuffer buffer;
1608 VkDeviceMemory mem;
1609 VkMemoryRequirements mem_reqs;
1610
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001611 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1612
Tobin Ehlis35372522016-05-12 08:32:31 -06001613 VkBufferCreateInfo buf_info = {};
1614 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1615 buf_info.pNext = NULL;
1616 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1617 buf_info.size = 256;
1618 buf_info.queueFamilyIndexCount = 0;
1619 buf_info.pQueueFamilyIndices = NULL;
1620 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1621 buf_info.flags = 0;
1622 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1623 ASSERT_VK_SUCCESS(err);
1624
1625 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1626 VkMemoryAllocateInfo alloc_info = {};
1627 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1628 alloc_info.pNext = NULL;
1629 alloc_info.memoryTypeIndex = 0;
1630
1631 // Ensure memory is big enough for both bindings
1632 static const VkDeviceSize allocation_size = 0x10000;
1633 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001634 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001635 if (!pass) {
1636 vkDestroyBuffer(m_device->device(), buffer, NULL);
1637 return;
1638 }
1639 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1640 ASSERT_VK_SUCCESS(err);
1641
1642 uint8_t *pData;
1643 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001645 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1646 m_errorMonitor->VerifyFound();
1647 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001648 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001649 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1651 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1652 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001653 m_errorMonitor->VerifyFound();
1654
1655 // Unmap the memory to avoid re-map error
1656 vkUnmapMemory(m_device->device(), mem);
1657 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1659 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1660 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001661 m_errorMonitor->VerifyFound();
1662 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1664 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001665 m_errorMonitor->VerifyFound();
1666 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001668 vkUnmapMemory(m_device->device(), mem);
1669 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001670
Tobin Ehlis35372522016-05-12 08:32:31 -06001671 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001672 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001673 ASSERT_VK_SUCCESS(err);
1674 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001675 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001677 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001679 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1680 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 // Now flush range that oversteps mapped range
1683 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001684 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001686 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001687 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1689 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1690 m_errorMonitor->VerifyFound();
1691
1692 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1693 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001694 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001695 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001696 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 mmr.size = VK_WHOLE_SIZE;
1698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1700 m_errorMonitor->VerifyFound();
1701
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001702#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001703 // Some platforms have an atomsize of 1 which makes the test meaningless
1704 if (atom_size > 3) {
1705 // Now with an offset NOT a multiple of the device limit
1706 vkUnmapMemory(m_device->device(), mem);
1707 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1708 ASSERT_VK_SUCCESS(err);
1709 mmr.offset = 3; // Not a multiple of atom_size
1710 mmr.size = VK_WHOLE_SIZE;
1711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1712 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1713 m_errorMonitor->VerifyFound();
1714
1715 // Now with a size NOT a multiple of the device limit
1716 vkUnmapMemory(m_device->device(), mem);
1717 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1718 ASSERT_VK_SUCCESS(err);
1719 mmr.offset = atom_size;
1720 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1722 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1723 m_errorMonitor->VerifyFound();
1724 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001725#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001726 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1727 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001728 if (!pass) {
1729 vkFreeMemory(m_device->device(), mem, NULL);
1730 vkDestroyBuffer(m_device->device(), buffer, NULL);
1731 return;
1732 }
1733 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1734 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1735
1736 vkDestroyBuffer(m_device->device(), buffer, NULL);
1737 vkFreeMemory(m_device->device(), mem, NULL);
1738}
1739
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001740#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001741TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1742 VkResult err;
1743 bool pass;
1744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001745 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1746 // following declaration (which is temporarily being moved below):
1747 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001748 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001749 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001750 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001751 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001752 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001753 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001754
Tony Barbour1fa09702017-03-16 12:09:08 -06001755 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001756
Ian Elliott3f06ce52016-04-29 14:46:21 -06001757#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1758#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1759 // Use the functions from the VK_KHR_android_surface extension without
1760 // enabling that extension:
1761
1762 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001763 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1765 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766 pass = (err != VK_SUCCESS);
1767 ASSERT_TRUE(pass);
1768 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001769#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001770
Ian Elliott3f06ce52016-04-29 14:46:21 -06001771#if defined(VK_USE_PLATFORM_MIR_KHR)
1772 // Use the functions from the VK_KHR_mir_surface extension without enabling
1773 // that extension:
1774
1775 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001776 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001778 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1779 pass = (err != VK_SUCCESS);
1780 ASSERT_TRUE(pass);
1781 m_errorMonitor->VerifyFound();
1782
1783 // Tell whether an mir_connection supports presentation:
1784 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1786 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001788#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001789
Ian Elliott3f06ce52016-04-29 14:46:21 -06001790#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1791 // Use the functions from the VK_KHR_wayland_surface extension without
1792 // enabling that extension:
1793
1794 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001795 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1797 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798 pass = (err != VK_SUCCESS);
1799 ASSERT_TRUE(pass);
1800 m_errorMonitor->VerifyFound();
1801
1802 // Tell whether an wayland_display supports presentation:
1803 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1805 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001806 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001807#endif // VK_USE_PLATFORM_WAYLAND_KHR
1808#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809
Ian Elliott3f06ce52016-04-29 14:46:21 -06001810#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001811 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1812 // TO NON-LINUX PLATFORMS:
1813 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001814 // Use the functions from the VK_KHR_win32_surface extension without
1815 // enabling that extension:
1816
1817 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001818 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1820 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821 pass = (err != VK_SUCCESS);
1822 ASSERT_TRUE(pass);
1823 m_errorMonitor->VerifyFound();
1824
1825 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001827 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001828 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001829// Set this (for now, until all platforms are supported and tested):
1830#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001831#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001832#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001833 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1834 // TO NON-LINUX PLATFORMS:
1835 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001836#endif
1837#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001838 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1839 // that extension:
1840
1841 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001842 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001844 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1845 pass = (err != VK_SUCCESS);
1846 ASSERT_TRUE(pass);
1847 m_errorMonitor->VerifyFound();
1848
1849 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001850 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001851 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1853 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001854 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001855// Set this (for now, until all platforms are supported and tested):
1856#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001857#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001858
Ian Elliott12630812016-04-29 14:35:43 -06001859#if defined(VK_USE_PLATFORM_XLIB_KHR)
1860 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1861 // that extension:
1862
1863 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001864 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001866 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1867 pass = (err != VK_SUCCESS);
1868 ASSERT_TRUE(pass);
1869 m_errorMonitor->VerifyFound();
1870
1871 // Tell whether an Xlib VisualID supports presentation:
1872 Display *dpy = NULL;
1873 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1876 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001877// Set this (for now, until all platforms are supported and tested):
1878#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001879#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001880
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001881// Use the functions from the VK_KHR_surface extension without enabling
1882// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001883
Ian Elliott489eec02016-05-05 14:12:44 -06001884#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001887 vkDestroySurfaceKHR(instance(), surface, NULL);
1888 m_errorMonitor->VerifyFound();
1889
1890 // Check if surface supports presentation:
1891 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001893 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1894 pass = (err != VK_SUCCESS);
1895 ASSERT_TRUE(pass);
1896 m_errorMonitor->VerifyFound();
1897
1898 // Check surface capabilities:
1899 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1901 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 pass = (err != VK_SUCCESS);
1903 ASSERT_TRUE(pass);
1904 m_errorMonitor->VerifyFound();
1905
1906 // Check surface formats:
1907 uint32_t format_count = 0;
1908 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface present modes:
1916 uint32_t present_mode_count = 0;
1917 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001923#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001924
Ian Elliott1c32c772016-04-28 14:47:13 -06001925 // Use the functions from the VK_KHR_swapchain extension without enabling
1926 // that extension:
1927
1928 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001930 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1931 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001932 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1939 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001940 pass = (err != VK_SUCCESS);
1941 ASSERT_TRUE(pass);
1942 m_errorMonitor->VerifyFound();
1943
Chris Forbeseb7d5502016-09-13 18:19:21 +12001944 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1945 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1946 VkFence fence;
1947 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1948
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001951 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001952 pass = (err != VK_SUCCESS);
1953 ASSERT_TRUE(pass);
1954 m_errorMonitor->VerifyFound();
1955
Chris Forbeseb7d5502016-09-13 18:19:21 +12001956 vkDestroyFence(m_device->device(), fence, nullptr);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001959 //
1960 // NOTE: Currently can't test this because a real swapchain is needed (as
1961 // opposed to the fake one we created) in order for the layer to lookup the
1962 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001963
1964 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001966 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1967 m_errorMonitor->VerifyFound();
1968}
Chris Forbes09368e42016-10-13 11:59:22 +13001969#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001970
Karl Schultz6addd812016-02-02 17:17:23 -07001971TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1972 VkResult err;
1973 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001974
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1976 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001977
Tony Barbour1fa09702017-03-16 12:09:08 -06001978 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001979
1980 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001981 VkImage image;
1982 VkDeviceMemory mem;
1983 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001984
Karl Schultz6addd812016-02-02 17:17:23 -07001985 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1986 const int32_t tex_width = 32;
1987 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
Tony Barboureb254902015-07-15 12:50:33 -06001989 VkImageCreateInfo image_create_info = {};
1990 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001991 image_create_info.pNext = NULL;
1992 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1993 image_create_info.format = tex_format;
1994 image_create_info.extent.width = tex_width;
1995 image_create_info.extent.height = tex_height;
1996 image_create_info.extent.depth = 1;
1997 image_create_info.mipLevels = 1;
1998 image_create_info.arrayLayers = 1;
1999 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2000 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2001 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2002 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002003 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002004
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002005 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002006 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002007 mem_alloc.pNext = NULL;
2008 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002009
Chia-I Wuf7458c52015-10-26 21:10:41 +08002010 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002011 ASSERT_VK_SUCCESS(err);
2012
Karl Schultz6addd812016-02-02 17:17:23 -07002013 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002014
Mark Lobodzinski23065352015-05-29 09:32:35 -05002015 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002016
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002017 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002018 if (!pass) { // If we can't find any unmappable memory this test doesn't
2019 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002020 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002021 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002022 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002023
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002024 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002025 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002026 ASSERT_VK_SUCCESS(err);
2027
2028 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002029 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002030 ASSERT_VK_SUCCESS(err);
2031
2032 // Map memory as if to initialize the image
2033 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002034 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002036 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002037
Chia-I Wuf7458c52015-10-26 21:10:41 +08002038 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002039 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040}
2041
Karl Schultz6addd812016-02-02 17:17:23 -07002042TEST_F(VkLayerTest, RebindMemory) {
2043 VkResult err;
2044 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002045
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002047
Tony Barbour1fa09702017-03-16 12:09:08 -06002048 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002049
2050 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002051 VkImage image;
2052 VkDeviceMemory mem1;
2053 VkDeviceMemory mem2;
2054 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002055
Karl Schultz6addd812016-02-02 17:17:23 -07002056 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2057 const int32_t tex_width = 32;
2058 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002059
Tony Barboureb254902015-07-15 12:50:33 -06002060 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002061 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2062 image_create_info.pNext = NULL;
2063 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2064 image_create_info.format = tex_format;
2065 image_create_info.extent.width = tex_width;
2066 image_create_info.extent.height = tex_height;
2067 image_create_info.extent.depth = 1;
2068 image_create_info.mipLevels = 1;
2069 image_create_info.arrayLayers = 1;
2070 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2071 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2072 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2073 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002075 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002076 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2077 mem_alloc.pNext = NULL;
2078 mem_alloc.allocationSize = 0;
2079 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 // Introduce failure, do NOT set memProps to
2082 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002083 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002084 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002085 ASSERT_VK_SUCCESS(err);
2086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002088
2089 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002090 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002091 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002092
2093 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002094 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002095 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002096 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097 ASSERT_VK_SUCCESS(err);
2098
2099 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002100 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101 ASSERT_VK_SUCCESS(err);
2102
Karl Schultz6addd812016-02-02 17:17:23 -07002103 // Introduce validation failure, try to bind a different memory object to
2104 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002105 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002107 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002108
Chia-I Wuf7458c52015-10-26 21:10:41 +08002109 vkDestroyImage(m_device->device(), image, NULL);
2110 vkFreeMemory(m_device->device(), mem1, NULL);
2111 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002112}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002113
Karl Schultz6addd812016-02-02 17:17:23 -07002114TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002115 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002116
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2118 "submitted in SIGNALED state. Fences "
2119 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002120
2121 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002122 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2123 fenceInfo.pNext = NULL;
2124 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002125
Tony Barbour1fa09702017-03-16 12:09:08 -06002126 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002127 ASSERT_NO_FATAL_FAILURE(InitViewport());
2128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2129
Tony Barbour552f6c02016-12-21 14:34:07 -07002130 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002131 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002132 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002133
2134 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002135
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002136 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002137 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2138 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002139 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002140 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002141 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002142 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002143 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002144 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002146
2147 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002148 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002149
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002150 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002151}
Chris Forbes4e44c912016-06-16 10:20:00 +12002152
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002153TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002154 TEST_DESCRIPTION(
2155 "Specify wrong usage for image then create conflicting view of image "
2156 "Initialize buffer with wrong usage then perform copy expecting errors "
2157 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002159
Tony Barbour1fa09702017-03-16 12:09:08 -06002160 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002161 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002162 if (!format) {
2163 printf(" No Depth + Stencil format found. Skipped.\n");
2164 return;
2165 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002166
Tony Barbourf92621a2016-05-02 14:28:12 -06002167 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002168 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002169 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002170 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002171
Tony Barbourf92621a2016-05-02 14:28:12 -06002172 VkImageView dsv;
2173 VkImageViewCreateInfo dsvci = {};
2174 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2175 dsvci.image = image.handle();
2176 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002177 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002178 dsvci.subresourceRange.layerCount = 1;
2179 dsvci.subresourceRange.baseMipLevel = 0;
2180 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002181 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002182
Tony Barbourf92621a2016-05-02 14:28:12 -06002183 // Create a view with depth / stencil aspect for image with different usage
2184 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002186 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002187
2188 // Initialize buffer with TRANSFER_DST usage
2189 vk_testing::Buffer buffer;
2190 VkMemoryPropertyFlags reqs = 0;
2191 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2192 VkBufferImageCopy region = {};
2193 region.bufferRowLength = 128;
2194 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002195 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002196 region.imageSubresource.layerCount = 1;
2197 region.imageExtent.height = 16;
2198 region.imageExtent.width = 16;
2199 region.imageExtent.depth = 1;
2200
Mark Lobodzinski80871462017-02-16 10:37:27 -07002201 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002202 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002203
Chris Forbesda581202016-10-06 18:25:26 +13002204 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Chris Forbesda581202016-10-06 18:25:26 +13002207
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002208 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2209 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002210 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002211}
Tony Barbour75d79f02016-08-30 09:39:07 -06002212
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002213TEST_F(VkLayerTest, LeakAnObject) {
2214 VkResult err;
2215
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002216 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002217
2218 // Note that we have to create a new device since destroying the
2219 // framework's device causes Teardown() to fail and just calling Teardown
2220 // will destroy the errorMonitor.
2221
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223
Tony Barbour1fa09702017-03-16 12:09:08 -06002224 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227 std::vector<VkDeviceQueueCreateInfo> queue_info;
2228 queue_info.reserve(queue_props.size());
2229 std::vector<std::vector<float>> queue_priorities;
2230 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2231 VkDeviceQueueCreateInfo qi = {};
2232 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2233 qi.pNext = NULL;
2234 qi.queueFamilyIndex = i;
2235 qi.queueCount = queue_props[i].queueCount;
2236 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2237 qi.pQueuePriorities = queue_priorities[i].data();
2238 queue_info.push_back(qi);
2239 }
2240
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002241 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002242
2243 // The sacrificial device object
2244 VkDevice testDevice;
2245 VkDeviceCreateInfo device_create_info = {};
2246 auto features = m_device->phy().features();
2247 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2248 device_create_info.pNext = NULL;
2249 device_create_info.queueCreateInfoCount = queue_info.size();
2250 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002251 device_create_info.enabledLayerCount = 0;
2252 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002253 device_create_info.pEnabledFeatures = &features;
2254 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2255 ASSERT_VK_SUCCESS(err);
2256
2257 VkFence fence;
2258 VkFenceCreateInfo fence_create_info = {};
2259 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2260 fence_create_info.pNext = NULL;
2261 fence_create_info.flags = 0;
2262 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2263 ASSERT_VK_SUCCESS(err);
2264
2265 // Induce failure by not calling vkDestroyFence
2266 vkDestroyDevice(testDevice, NULL);
2267 m_errorMonitor->VerifyFound();
2268}
2269
2270TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002271 TEST_DESCRIPTION(
2272 "Allocate command buffers from one command pool and "
2273 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002274
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002276
Tony Barbour1fa09702017-03-16 12:09:08 -06002277 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002278 VkCommandPool command_pool_one;
2279 VkCommandPool command_pool_two;
2280
2281 VkCommandPoolCreateInfo pool_create_info{};
2282 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2283 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2284 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2285
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002286 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002288 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002289
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002290 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002291 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002292 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002293 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002294 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002295 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002296 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002298 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
2300 m_errorMonitor->VerifyFound();
2301
2302 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2303 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2304}
2305
2306TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2307 VkResult err;
2308
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002309 TEST_DESCRIPTION(
2310 "Allocate descriptor sets from one DS pool and "
2311 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002312
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002314
Tony Barbour1fa09702017-03-16 12:09:08 -06002315 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002316 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2317
2318 VkDescriptorPoolSize ds_type_count = {};
2319 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2320 ds_type_count.descriptorCount = 1;
2321
2322 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2323 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2324 ds_pool_ci.pNext = NULL;
2325 ds_pool_ci.flags = 0;
2326 ds_pool_ci.maxSets = 1;
2327 ds_pool_ci.poolSizeCount = 1;
2328 ds_pool_ci.pPoolSizes = &ds_type_count;
2329
2330 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002331 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002332 ASSERT_VK_SUCCESS(err);
2333
2334 // Create a second descriptor pool
2335 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002336 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002337 ASSERT_VK_SUCCESS(err);
2338
2339 VkDescriptorSetLayoutBinding dsl_binding = {};
2340 dsl_binding.binding = 0;
2341 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2342 dsl_binding.descriptorCount = 1;
2343 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2344 dsl_binding.pImmutableSamplers = NULL;
2345
2346 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2347 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2348 ds_layout_ci.pNext = NULL;
2349 ds_layout_ci.bindingCount = 1;
2350 ds_layout_ci.pBindings = &dsl_binding;
2351
2352 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002353 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002354 ASSERT_VK_SUCCESS(err);
2355
2356 VkDescriptorSet descriptorSet;
2357 VkDescriptorSetAllocateInfo alloc_info = {};
2358 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2359 alloc_info.descriptorSetCount = 1;
2360 alloc_info.descriptorPool = ds_pool_one;
2361 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2366
2367 m_errorMonitor->VerifyFound();
2368
2369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2370 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2371 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2372}
2373
2374TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002376
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002377 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002378
Tony Barbour1fa09702017-03-16 12:09:08 -06002379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002380
2381 // Pass bogus handle into GetImageMemoryRequirements
2382 VkMemoryRequirements mem_reqs;
2383 uint64_t fakeImageHandle = 0xCADECADE;
2384 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2385
2386 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2387
2388 m_errorMonitor->VerifyFound();
2389}
2390
Mike Schuchardt17838902017-02-21 09:48:06 -07002391TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2392 TEST_DESCRIPTION(
2393 "Try to destroy a render pass object using a device other than the one it was created on. "
2394 "This should generate a distinct error from the invalid handle error.");
2395 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002396 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2398
2399 // Create second device
2400 float priorities[] = {1.0f};
2401 VkDeviceQueueCreateInfo queue_info{};
2402 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2403 queue_info.pNext = NULL;
2404 queue_info.flags = 0;
2405 queue_info.queueFamilyIndex = 0;
2406 queue_info.queueCount = 1;
2407 queue_info.pQueuePriorities = &priorities[0];
2408
2409 VkDeviceCreateInfo device_create_info = {};
2410 auto features = m_device->phy().features();
2411 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2412 device_create_info.pNext = NULL;
2413 device_create_info.queueCreateInfoCount = 1;
2414 device_create_info.pQueueCreateInfos = &queue_info;
2415 device_create_info.enabledLayerCount = 0;
2416 device_create_info.ppEnabledLayerNames = NULL;
2417 device_create_info.pEnabledFeatures = &features;
2418
2419 VkDevice second_device;
2420 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2421
2422 // Try to destroy the renderpass from the first device using the second device
2423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2424 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2425 m_errorMonitor->VerifyFound();
2426
2427 vkDestroyDevice(second_device, NULL);
2428}
2429
Karl Schultz6addd812016-02-02 17:17:23 -07002430TEST_F(VkLayerTest, PipelineNotBound) {
2431 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002432
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002433 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002434
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002436
Tony Barbour1fa09702017-03-16 12:09:08 -06002437 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002439
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002440 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002441 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2442 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002443
2444 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002445 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2446 ds_pool_ci.pNext = NULL;
2447 ds_pool_ci.maxSets = 1;
2448 ds_pool_ci.poolSizeCount = 1;
2449 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002450
2451 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002452 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453 ASSERT_VK_SUCCESS(err);
2454
2455 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002456 dsl_binding.binding = 0;
2457 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2458 dsl_binding.descriptorCount = 1;
2459 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2460 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002461
2462 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002463 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2464 ds_layout_ci.pNext = NULL;
2465 ds_layout_ci.bindingCount = 1;
2466 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002467
2468 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002469 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470 ASSERT_VK_SUCCESS(err);
2471
2472 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002473 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002474 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002475 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002476 alloc_info.descriptorPool = ds_pool;
2477 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002478 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002479 ASSERT_VK_SUCCESS(err);
2480
2481 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002482 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2483 pipeline_layout_ci.pNext = NULL;
2484 pipeline_layout_ci.setLayoutCount = 1;
2485 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002486
2487 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
Mark Youngad779052016-01-06 14:26:04 -07002491 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
Tony Barbour552f6c02016-12-21 14:34:07 -07002493 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002494 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002497
Chia-I Wuf7458c52015-10-26 21:10:41 +08002498 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002501}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002502
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002503TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2504 VkResult err;
2505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002506 TEST_DESCRIPTION(
2507 "Test validation check for an invalid memory type index "
2508 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002509
Tony Barbour1fa09702017-03-16 12:09:08 -06002510 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002511
2512 // Create an image, allocate memory, set a bad typeIndex and then try to
2513 // bind it
2514 VkImage image;
2515 VkDeviceMemory mem;
2516 VkMemoryRequirements mem_reqs;
2517 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2518 const int32_t tex_width = 32;
2519 const int32_t tex_height = 32;
2520
2521 VkImageCreateInfo image_create_info = {};
2522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2523 image_create_info.pNext = NULL;
2524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2525 image_create_info.format = tex_format;
2526 image_create_info.extent.width = tex_width;
2527 image_create_info.extent.height = tex_height;
2528 image_create_info.extent.depth = 1;
2529 image_create_info.mipLevels = 1;
2530 image_create_info.arrayLayers = 1;
2531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2532 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2533 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2534 image_create_info.flags = 0;
2535
2536 VkMemoryAllocateInfo mem_alloc = {};
2537 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2538 mem_alloc.pNext = NULL;
2539 mem_alloc.allocationSize = 0;
2540 mem_alloc.memoryTypeIndex = 0;
2541
2542 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2543 ASSERT_VK_SUCCESS(err);
2544
2545 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2546 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002547
2548 // Introduce Failure, select invalid TypeIndex
2549 VkPhysicalDeviceMemoryProperties memory_info;
2550
2551 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2552 unsigned int i;
2553 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2554 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2555 mem_alloc.memoryTypeIndex = i;
2556 break;
2557 }
2558 }
2559 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002560 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002561 vkDestroyImage(m_device->device(), image, NULL);
2562 return;
2563 }
2564
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002566
2567 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2568 ASSERT_VK_SUCCESS(err);
2569
2570 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2571 (void)err;
2572
2573 m_errorMonitor->VerifyFound();
2574
2575 vkDestroyImage(m_device->device(), image, NULL);
2576 vkFreeMemory(m_device->device(), mem, NULL);
2577}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
Karl Schultz6addd812016-02-02 17:17:23 -07002579TEST_F(VkLayerTest, BindInvalidMemory) {
2580 VkResult err;
2581 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002582
Tony Barbour1fa09702017-03-16 12:09:08 -06002583 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002584
Cortf801b982017-01-17 18:10:21 -08002585 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002586 const int32_t tex_width = 256;
2587 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002588
2589 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002590 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2591 image_create_info.pNext = NULL;
2592 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2593 image_create_info.format = tex_format;
2594 image_create_info.extent.width = tex_width;
2595 image_create_info.extent.height = tex_height;
2596 image_create_info.extent.depth = 1;
2597 image_create_info.mipLevels = 1;
2598 image_create_info.arrayLayers = 1;
2599 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002600 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002601 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2602 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002603
Cortf801b982017-01-17 18:10:21 -08002604 VkBufferCreateInfo buffer_create_info = {};
2605 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2606 buffer_create_info.pNext = NULL;
2607 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002608 buffer_create_info.size = 4 * 1024 * 1024;
2609 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002610 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002611
Cortf801b982017-01-17 18:10:21 -08002612 // Create an image/buffer, allocate memory, free it, and then try to bind it
2613 {
2614 VkImage image = VK_NULL_HANDLE;
2615 VkBuffer buffer = VK_NULL_HANDLE;
2616 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2617 ASSERT_VK_SUCCESS(err);
2618 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2619 ASSERT_VK_SUCCESS(err);
2620 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2621 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2622 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002623
Cortf801b982017-01-17 18:10:21 -08002624 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2625 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2626 image_mem_alloc.allocationSize = image_mem_reqs.size;
2627 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2628 ASSERT_TRUE(pass);
2629 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2630 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2631 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2632 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2635 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2636 ASSERT_VK_SUCCESS(err);
2637 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2638 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002639
Cortf801b982017-01-17 18:10:21 -08002640 vkFreeMemory(device(), image_mem, NULL);
2641 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2644 err = vkBindImageMemory(device(), image, image_mem, 0);
2645 (void)err; // This may very well return an error.
2646 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002647
Cortf801b982017-01-17 18:10:21 -08002648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2649 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2650 (void)err; // This may very well return an error.
2651 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 vkDestroyImage(m_device->device(), image, NULL);
2654 vkDestroyBuffer(m_device->device(), buffer, NULL);
2655 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002656
2657 // Try to bind memory to an object that already has a memory binding
2658 {
2659 VkImage image = VK_NULL_HANDLE;
2660 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2661 ASSERT_VK_SUCCESS(err);
2662 VkBuffer buffer = VK_NULL_HANDLE;
2663 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2664 ASSERT_VK_SUCCESS(err);
2665 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2666 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2667 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2668 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2669 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2670 image_alloc_info.allocationSize = image_mem_reqs.size;
2671 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2672 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2673 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2674 ASSERT_TRUE(pass);
2675 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2676 ASSERT_TRUE(pass);
2677 VkDeviceMemory image_mem, buffer_mem;
2678 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2679 ASSERT_VK_SUCCESS(err);
2680 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2681 ASSERT_VK_SUCCESS(err);
2682
2683 err = vkBindImageMemory(device(), image, image_mem, 0);
2684 ASSERT_VK_SUCCESS(err);
2685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2686 err = vkBindImageMemory(device(), image, image_mem, 0);
2687 (void)err; // This may very well return an error.
2688 m_errorMonitor->VerifyFound();
2689
2690 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2691 ASSERT_VK_SUCCESS(err);
2692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2693 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2694 (void)err; // This may very well return an error.
2695 m_errorMonitor->VerifyFound();
2696
2697 vkFreeMemory(device(), image_mem, NULL);
2698 vkFreeMemory(device(), buffer_mem, NULL);
2699 vkDestroyImage(device(), image, NULL);
2700 vkDestroyBuffer(device(), buffer, NULL);
2701 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002702
Cort Strattonde748202017-02-17 12:50:01 -08002703 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002704 {
2705 VkImage image = VK_NULL_HANDLE;
2706 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2707 ASSERT_VK_SUCCESS(err);
2708 VkBuffer buffer = VK_NULL_HANDLE;
2709 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2710 ASSERT_VK_SUCCESS(err);
2711 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2712 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2713 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2714 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2715 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002716 // Leave some extra space for alignment wiggle room
2717 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002718 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002719 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002720 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2721 ASSERT_TRUE(pass);
2722 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2723 ASSERT_TRUE(pass);
2724 VkDeviceMemory image_mem, buffer_mem;
2725 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2726 ASSERT_VK_SUCCESS(err);
2727 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2728 ASSERT_VK_SUCCESS(err);
2729
Cort Strattonde748202017-02-17 12:50:01 -08002730 // Test unaligned memory offset
2731 {
2732 if (image_mem_reqs.alignment > 1) {
2733 VkDeviceSize image_offset = 1;
2734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2735 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2736 (void)err; // This may very well return an error.
2737 m_errorMonitor->VerifyFound();
2738 }
Cort6c7dff72017-01-27 18:34:50 -08002739
Cort Strattonde748202017-02-17 12:50:01 -08002740 if (buffer_mem_reqs.alignment > 1) {
2741 VkDeviceSize buffer_offset = 1;
2742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2743 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2744 (void)err; // This may very well return an error.
2745 m_errorMonitor->VerifyFound();
2746 }
2747 }
2748
2749 // Test memory offsets outside the memory allocation
2750 {
2751 VkDeviceSize image_offset =
2752 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2754 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2755 (void)err; // This may very well return an error.
2756 m_errorMonitor->VerifyFound();
2757
2758 VkDeviceSize buffer_offset =
2759 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2761 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2762 (void)err; // This may very well return an error.
2763 m_errorMonitor->VerifyFound();
2764 }
2765
2766 // Test memory offsets within the memory allocation, but which leave too little memory for
2767 // the resource.
2768 {
2769 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002770 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2772 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2773 (void)err; // This may very well return an error.
2774 m_errorMonitor->VerifyFound();
2775 }
2776
2777 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2778 if (buffer_offset > 0) {
2779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2780 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2781 (void)err; // This may very well return an error.
2782 m_errorMonitor->VerifyFound();
2783 }
2784 }
Cort6c7dff72017-01-27 18:34:50 -08002785
2786 vkFreeMemory(device(), image_mem, NULL);
2787 vkFreeMemory(device(), buffer_mem, NULL);
2788 vkDestroyImage(device(), image, NULL);
2789 vkDestroyBuffer(device(), buffer, NULL);
2790 }
2791
Cort Stratton4c38bb52017-01-28 13:33:10 -08002792 // Try to bind memory to an object with an invalid memory type
2793 {
2794 VkImage image = VK_NULL_HANDLE;
2795 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2796 ASSERT_VK_SUCCESS(err);
2797 VkBuffer buffer = VK_NULL_HANDLE;
2798 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2799 ASSERT_VK_SUCCESS(err);
2800 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2801 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2802 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2803 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2804 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2805 image_alloc_info.allocationSize = image_mem_reqs.size;
2806 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2807 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002808 // Create a mask of available memory types *not* supported by these resources,
2809 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002810 VkPhysicalDeviceMemoryProperties memory_properties = {};
2811 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002812 VkDeviceMemory image_mem, buffer_mem;
2813
Cort Stratton4c38bb52017-01-28 13:33:10 -08002814 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002815 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002816 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2817 ASSERT_TRUE(pass);
2818 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2819 ASSERT_VK_SUCCESS(err);
2820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2821 err = vkBindImageMemory(device(), image, image_mem, 0);
2822 (void)err; // This may very well return an error.
2823 m_errorMonitor->VerifyFound();
2824 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 }
2826
Cort Stratton4c38bb52017-01-28 13:33:10 -08002827 uint32_t buffer_unsupported_mem_type_bits =
2828 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002829 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002830 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2831 ASSERT_TRUE(pass);
2832 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2833 ASSERT_VK_SUCCESS(err);
2834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2835 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2836 (void)err; // This may very well return an error.
2837 m_errorMonitor->VerifyFound();
2838 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002840
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 vkDestroyImage(device(), image, NULL);
2842 vkDestroyBuffer(device(), buffer, NULL);
2843 }
2844
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002845 // Try to bind memory to an image created with sparse memory flags
2846 {
2847 VkImageCreateInfo sparse_image_create_info = image_create_info;
2848 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2849 VkImageFormatProperties image_format_properties = {};
2850 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2851 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2852 sparse_image_create_info.usage, sparse_image_create_info.flags,
2853 &image_format_properties);
2854 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2855 // most likely means sparse formats aren't supported here; skip this test.
2856 } else {
2857 ASSERT_VK_SUCCESS(err);
2858 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002859 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002860 return;
2861 } else {
2862 VkImage sparse_image = VK_NULL_HANDLE;
2863 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2864 ASSERT_VK_SUCCESS(err);
2865 VkMemoryRequirements sparse_mem_reqs = {};
2866 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2867 if (sparse_mem_reqs.memoryTypeBits != 0) {
2868 VkMemoryAllocateInfo sparse_mem_alloc = {};
2869 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2870 sparse_mem_alloc.pNext = NULL;
2871 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2872 sparse_mem_alloc.memoryTypeIndex = 0;
2873 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2874 ASSERT_TRUE(pass);
2875 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2876 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2877 ASSERT_VK_SUCCESS(err);
2878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2879 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2880 // This may very well return an error.
2881 (void)err;
2882 m_errorMonitor->VerifyFound();
2883 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2884 }
2885 vkDestroyImage(m_device->device(), sparse_image, NULL);
2886 }
2887 }
2888 }
2889
2890 // Try to bind memory to a buffer created with sparse memory flags
2891 {
2892 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2893 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2894 if (!m_device->phy().features().sparseResidencyBuffer) {
2895 // most likely means sparse formats aren't supported here; skip this test.
2896 } else {
2897 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2898 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2899 ASSERT_VK_SUCCESS(err);
2900 VkMemoryRequirements sparse_mem_reqs = {};
2901 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2902 if (sparse_mem_reqs.memoryTypeBits != 0) {
2903 VkMemoryAllocateInfo sparse_mem_alloc = {};
2904 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2905 sparse_mem_alloc.pNext = NULL;
2906 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2907 sparse_mem_alloc.memoryTypeIndex = 0;
2908 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2909 ASSERT_TRUE(pass);
2910 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2911 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2912 ASSERT_VK_SUCCESS(err);
2913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2914 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2915 // This may very well return an error.
2916 (void)err;
2917 m_errorMonitor->VerifyFound();
2918 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2919 }
2920 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2921 }
2922 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002923}
2924
Karl Schultz6addd812016-02-02 17:17:23 -07002925TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2926 VkResult err;
2927 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002928
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002930
Tony Barbour1fa09702017-03-16 12:09:08 -06002931 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002932
Karl Schultz6addd812016-02-02 17:17:23 -07002933 // Create an image object, allocate memory, destroy the object and then try
2934 // to bind it
2935 VkImage image;
2936 VkDeviceMemory mem;
2937 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultz6addd812016-02-02 17:17:23 -07002939 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2940 const int32_t tex_width = 32;
2941 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
2943 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002944 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2945 image_create_info.pNext = NULL;
2946 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2947 image_create_info.format = tex_format;
2948 image_create_info.extent.width = tex_width;
2949 image_create_info.extent.height = tex_height;
2950 image_create_info.extent.depth = 1;
2951 image_create_info.mipLevels = 1;
2952 image_create_info.arrayLayers = 1;
2953 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2954 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2955 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2956 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002957
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002958 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002959 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2960 mem_alloc.pNext = NULL;
2961 mem_alloc.allocationSize = 0;
2962 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Chia-I Wuf7458c52015-10-26 21:10:41 +08002964 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002965 ASSERT_VK_SUCCESS(err);
2966
Karl Schultz6addd812016-02-02 17:17:23 -07002967 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002968
2969 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002970 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002971 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002972
2973 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002974 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
2977 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002978 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002979 ASSERT_VK_SUCCESS(err);
2980
2981 // Now Try to bind memory to this destroyed object
2982 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2983 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002984 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002985
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002986 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002987
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002989}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002990
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002991TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2992 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2993
Tony Barbour1fa09702017-03-16 12:09:08 -06002994 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2996
2997 VkVertexInputBindingDescription input_binding;
2998 memset(&input_binding, 0, sizeof(input_binding));
2999
3000 VkVertexInputAttributeDescription input_attribs;
3001 memset(&input_attribs, 0, sizeof(input_attribs));
3002
3003 // Pick a really bad format for this purpose and make sure it should fail
3004 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3005 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3006 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003007 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003008 return;
3009 }
3010
3011 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003012 char const *vsSource =
3013 "#version 450\n"
3014 "\n"
3015 "out gl_PerVertex {\n"
3016 " vec4 gl_Position;\n"
3017 "};\n"
3018 "void main(){\n"
3019 " gl_Position = vec4(1);\n"
3020 "}\n";
3021 char const *fsSource =
3022 "#version 450\n"
3023 "\n"
3024 "layout(location=0) out vec4 color;\n"
3025 "void main(){\n"
3026 " color = vec4(1);\n"
3027 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003028
3029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3030 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3031 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3032
3033 VkPipelineObj pipe(m_device);
3034 pipe.AddColorAttachment();
3035 pipe.AddShader(&vs);
3036 pipe.AddShader(&fs);
3037
3038 pipe.AddVertexInputBindings(&input_binding, 1);
3039 pipe.AddVertexInputAttribs(&input_attribs, 1);
3040
3041 VkDescriptorSetObj descriptorSet(m_device);
3042 descriptorSet.AppendDummy();
3043 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3044
3045 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3046
3047 m_errorMonitor->VerifyFound();
3048}
3049
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003050TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003051 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003052 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003053
3054 VkMemoryPropertyFlags reqs = 0;
3055 VkImageCreateInfo image_create_info = {};
3056 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3057 image_create_info.pNext = NULL;
3058 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3059 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3060 image_create_info.extent.width = 256;
3061 image_create_info.extent.height = 256;
3062 image_create_info.extent.depth = 1;
3063 image_create_info.mipLevels = 1;
3064 image_create_info.arrayLayers = 1;
3065 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3066 image_create_info.flags = 0;
3067
3068 VkImageBlit blit_region = {};
3069 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3070 blit_region.srcSubresource.baseArrayLayer = 0;
3071 blit_region.srcSubresource.layerCount = 1;
3072 blit_region.srcSubresource.mipLevel = 0;
3073 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3074 blit_region.dstSubresource.baseArrayLayer = 0;
3075 blit_region.dstSubresource.layerCount = 1;
3076 blit_region.dstSubresource.mipLevel = 0;
3077
3078 // Create two images, the source with sampleCount = 2, and attempt to blit
3079 // between them
3080 {
3081 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003082 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003083 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003084 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003086 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003087 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003088 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003089 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003090 m_errorMonitor->SetDesiredFailureMsg(
3091 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3092 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003093 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3094 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 m_errorMonitor->VerifyFound();
3096 m_commandBuffer->EndCommandBuffer();
3097 }
3098
3099 // Create two images, the dest with sampleCount = 4, and attempt to blit
3100 // between them
3101 {
3102 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003103 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003104 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003105 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003106 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003107 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003108 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003109 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003110 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003111 m_errorMonitor->SetDesiredFailureMsg(
3112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3113 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003114 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3115 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 m_errorMonitor->VerifyFound();
3117 m_commandBuffer->EndCommandBuffer();
3118 }
3119
3120 VkBufferImageCopy copy_region = {};
3121 copy_region.bufferRowLength = 128;
3122 copy_region.bufferImageHeight = 128;
3123 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3124 copy_region.imageSubresource.layerCount = 1;
3125 copy_region.imageExtent.height = 64;
3126 copy_region.imageExtent.width = 64;
3127 copy_region.imageExtent.depth = 1;
3128
3129 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3130 // buffer to image
3131 {
3132 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003133 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3134 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003135 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003136 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003137 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003138 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003139 m_errorMonitor->SetDesiredFailureMsg(
3140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3141 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003142 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3143 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003144 m_errorMonitor->VerifyFound();
3145 m_commandBuffer->EndCommandBuffer();
3146 }
3147
3148 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3149 // image to buffer
3150 {
3151 vk_testing::Buffer dst_buffer;
3152 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3153 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003154 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003155 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003156 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003157 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003158 m_errorMonitor->SetDesiredFailureMsg(
3159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3160 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003161 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003162 dst_buffer.handle(), 1, &copy_region);
3163 m_errorMonitor->VerifyFound();
3164 m_commandBuffer->EndCommandBuffer();
3165 }
3166}
3167
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003168TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003169 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003170
3171 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003172 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003173 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003174 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003175 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003176 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003177
3178 VkImageBlit blitRegion = {};
3179 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3180 blitRegion.srcSubresource.baseArrayLayer = 0;
3181 blitRegion.srcSubresource.layerCount = 1;
3182 blitRegion.srcSubresource.mipLevel = 0;
3183 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3184 blitRegion.dstSubresource.baseArrayLayer = 0;
3185 blitRegion.dstSubresource.layerCount = 1;
3186 blitRegion.dstSubresource.mipLevel = 0;
3187
Dave Houlton34df4cb2016-12-01 16:43:06 -07003188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3189
3190 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3191 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003192
3193 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003194 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003195 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003196 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003197
3198 m_errorMonitor->VerifyFound();
3199
Dave Houlton34df4cb2016-12-01 16:43:06 -07003200 // Test should generate 2 VU failures
3201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003203
3204 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
Dave Houlton34df4cb2016-12-01 16:43:06 -07003208 // TODO: Note that this only verifies that at least one of the VU enums was found
3209 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003210 m_errorMonitor->VerifyFound();
3211
Tony Barbour552f6c02016-12-21 14:34:07 -07003212 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213}
3214
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003215TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3216 VkResult err;
3217 bool pass;
3218
3219 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003220 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003221
3222 // If w/d/h granularity is 1, test is not meaningful
3223 // TODO: When virtual device limits are available, create a set of limits for this test that
3224 // will always have a granularity of > 1 for w, h, and d
3225 auto index = m_device->graphics_queue_node_index_;
3226 auto queue_family_properties = m_device->phy().queue_properties();
3227
3228 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3229 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3230 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3231 return;
3232 }
3233
3234 // Create two images of different types and try to copy between them
3235 VkImage srcImage;
3236 VkImage dstImage;
3237 VkDeviceMemory srcMem;
3238 VkDeviceMemory destMem;
3239 VkMemoryRequirements memReqs;
3240
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003241 VkImageCreateInfo image_create_info = {};
3242 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3243 image_create_info.pNext = NULL;
3244 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3245 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3246 image_create_info.extent.width = 32;
3247 image_create_info.extent.height = 32;
3248 image_create_info.extent.depth = 1;
3249 image_create_info.mipLevels = 1;
3250 image_create_info.arrayLayers = 4;
3251 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3252 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3253 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3254 image_create_info.flags = 0;
3255
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003256 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003257 ASSERT_VK_SUCCESS(err);
3258
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003259 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003260 ASSERT_VK_SUCCESS(err);
3261
3262 // Allocate memory
3263 VkMemoryAllocateInfo memAlloc = {};
3264 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3265 memAlloc.pNext = NULL;
3266 memAlloc.allocationSize = 0;
3267 memAlloc.memoryTypeIndex = 0;
3268
3269 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3270 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003271 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 ASSERT_TRUE(pass);
3273 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3274 ASSERT_VK_SUCCESS(err);
3275
3276 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3277 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003278 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003279 ASSERT_VK_SUCCESS(err);
3280 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3281 ASSERT_VK_SUCCESS(err);
3282
3283 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3284 ASSERT_VK_SUCCESS(err);
3285 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3286 ASSERT_VK_SUCCESS(err);
3287
Tony Barbour552f6c02016-12-21 14:34:07 -07003288 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 VkImageCopy copyRegion;
3290 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3291 copyRegion.srcSubresource.mipLevel = 0;
3292 copyRegion.srcSubresource.baseArrayLayer = 0;
3293 copyRegion.srcSubresource.layerCount = 1;
3294 copyRegion.srcOffset.x = 0;
3295 copyRegion.srcOffset.y = 0;
3296 copyRegion.srcOffset.z = 0;
3297 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3298 copyRegion.dstSubresource.mipLevel = 0;
3299 copyRegion.dstSubresource.baseArrayLayer = 0;
3300 copyRegion.dstSubresource.layerCount = 1;
3301 copyRegion.dstOffset.x = 0;
3302 copyRegion.dstOffset.y = 0;
3303 copyRegion.dstOffset.z = 0;
3304 copyRegion.extent.width = 1;
3305 copyRegion.extent.height = 1;
3306 copyRegion.extent.depth = 1;
3307
3308 // Introduce failure by setting srcOffset to a bad granularity value
3309 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3311 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003312 m_errorMonitor->VerifyFound();
3313
3314 // Introduce failure by setting extent to a bad granularity value
3315 copyRegion.srcOffset.y = 0;
3316 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3318 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003319 m_errorMonitor->VerifyFound();
3320
3321 // Now do some buffer/image copies
3322 vk_testing::Buffer buffer;
3323 VkMemoryPropertyFlags reqs = 0;
3324 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3325 VkBufferImageCopy region = {};
3326 region.bufferOffset = 0;
3327 region.bufferRowLength = 3;
3328 region.bufferImageHeight = 128;
3329 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3330 region.imageSubresource.layerCount = 1;
3331 region.imageExtent.height = 16;
3332 region.imageExtent.width = 16;
3333 region.imageExtent.depth = 1;
3334 region.imageOffset.x = 0;
3335 region.imageOffset.y = 0;
3336 region.imageOffset.z = 0;
3337
3338 // Introduce failure by setting bufferRowLength to a bad granularity value
3339 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3341 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3342 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344 region.bufferRowLength = 128;
3345
3346 // Introduce failure by setting bufferOffset to a bad granularity value
3347 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3350 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003351 m_errorMonitor->VerifyFound();
3352 region.bufferOffset = 0;
3353
3354 // Introduce failure by setting bufferImageHeight to a bad granularity value
3355 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3357 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3358 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003359 m_errorMonitor->VerifyFound();
3360 region.bufferImageHeight = 128;
3361
3362 // Introduce failure by setting imageExtent to a bad granularity value
3363 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3365 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3366 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003367 m_errorMonitor->VerifyFound();
3368 region.imageExtent.width = 16;
3369
3370 // Introduce failure by setting imageOffset to a bad granularity value
3371 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3373 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3374 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003375 m_errorMonitor->VerifyFound();
3376
Tony Barbour552f6c02016-12-21 14:34:07 -07003377 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003378
3379 vkDestroyImage(m_device->device(), srcImage, NULL);
3380 vkDestroyImage(m_device->device(), dstImage, NULL);
3381 vkFreeMemory(m_device->device(), srcMem, NULL);
3382 vkFreeMemory(m_device->device(), destMem, NULL);
3383}
3384
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003385TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003386 TEST_DESCRIPTION(
3387 "Submit command buffer created using one queue family and "
3388 "attempt to submit them on a queue created in a different "
3389 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003390
Tony Barbour1fa09702017-03-16 12:09:08 -06003391 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003392
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003393 // This test is meaningless unless we have multiple queue families
3394 auto queue_family_properties = m_device->phy().queue_properties();
3395 if (queue_family_properties.size() < 2) {
3396 return;
3397 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003399 // Get safe index of another queue family
3400 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003401 VkQueue other_queue;
3402 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3403
3404 // Record an empty cmd buffer
3405 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3406 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3407 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3408 vkEndCommandBuffer(m_commandBuffer->handle());
3409
3410 // And submit on the wrong queue
3411 VkSubmitInfo submit_info = {};
3412 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3413 submit_info.commandBufferCount = 1;
3414 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003415 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416
3417 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003418}
3419
Chris Forbes4c24a922016-11-16 08:59:10 +13003420TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003421 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003422
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003423 // There are no attachments, but refer to attachment 0.
3424 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003425 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003426 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003427 };
3428
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003429 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003430 VkRenderPass rp;
3431
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003432 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003434 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3435 m_errorMonitor->VerifyFound();
3436}
3437
Chris Forbesa58c4522016-09-28 15:19:39 +13003438TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3439 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003440 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003441
3442 // A renderpass with two subpasses, both writing the same attachment.
3443 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003444 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3445 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3446 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003447 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003448 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003449 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003450 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3451 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003452 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003453 VkSubpassDependency dep = {0,
3454 1,
3455 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3456 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3457 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3458 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3459 VK_DEPENDENCY_BY_REGION_BIT};
3460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkRenderPass rp;
3462 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3463 ASSERT_VK_SUCCESS(err);
3464
3465 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003466 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003467 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3468
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003469 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003470 VkFramebuffer fb;
3471 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3472 ASSERT_VK_SUCCESS(err);
3473
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003474 char const *vsSource =
3475 "#version 450\n"
3476 "void main() { gl_Position = vec4(1); }\n";
3477 char const *fsSource =
3478 "#version 450\n"
3479 "layout(location=0) out vec4 color;\n"
3480 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003481
3482 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3484 VkPipelineObj pipe(m_device);
3485 pipe.AddColorAttachment();
3486 pipe.AddShader(&vs);
3487 pipe.AddShader(&fs);
3488 VkViewport view_port = {};
3489 m_viewports.push_back(view_port);
3490 pipe.SetViewport(m_viewports);
3491 VkRect2D rect = {};
3492 m_scissors.push_back(rect);
3493 pipe.SetScissor(m_scissors);
3494
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003495 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003496 VkPipelineLayout pl;
3497 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3498 ASSERT_VK_SUCCESS(err);
3499 pipe.CreateVKPipeline(pl, rp);
3500
Tony Barbour552f6c02016-12-21 14:34:07 -07003501 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003502
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003503 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3504 nullptr,
3505 rp,
3506 fb,
3507 {{
3508 0, 0,
3509 },
3510 {32, 32}},
3511 0,
3512 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003513
3514 // subtest 1: bind in the wrong subpass
3515 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3516 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003518 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3519 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3520 m_errorMonitor->VerifyFound();
3521
3522 vkCmdEndRenderPass(m_commandBuffer->handle());
3523
3524 // subtest 2: bind in correct subpass, then transition to next subpass
3525 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3526 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3527 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003529 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3530 m_errorMonitor->VerifyFound();
3531
3532 vkCmdEndRenderPass(m_commandBuffer->handle());
3533
Tony Barbour552f6c02016-12-21 14:34:07 -07003534 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003535
3536 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3537 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3538 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3539}
3540
Tony Barbour4e919972016-08-09 13:27:40 -06003541TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003542 TEST_DESCRIPTION(
3543 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3544 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003545 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3547
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3549 "Cannot execute a render pass with renderArea "
3550 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003551
3552 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3553 m_renderPassBeginInfo.renderArea.extent.width = 257;
3554 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003555 m_commandBuffer->BeginCommandBuffer();
3556 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003557 m_errorMonitor->VerifyFound();
3558}
3559
3560TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003561 TEST_DESCRIPTION(
3562 "Generate INDEPENDENT_BLEND by disabling independent "
3563 "blend and then specifying different blend states for two "
3564 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003565 VkPhysicalDeviceFeatures features = {};
3566 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003567 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003568
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3570 "Invalid Pipeline CreateInfo: If independent blend feature not "
3571 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003572
Cody Northropc31a84f2016-08-22 10:41:47 -06003573 VkDescriptorSetObj descriptorSet(m_device);
3574 descriptorSet.AppendDummy();
3575 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003576
Cody Northropc31a84f2016-08-22 10:41:47 -06003577 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003578 // Create a renderPass with two color attachments
3579 VkAttachmentReference attachments[2] = {};
3580 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003581 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003582 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3583
3584 VkSubpassDescription subpass = {};
3585 subpass.pColorAttachments = attachments;
3586 subpass.colorAttachmentCount = 2;
3587
3588 VkRenderPassCreateInfo rpci = {};
3589 rpci.subpassCount = 1;
3590 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003591 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003592
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 VkAttachmentDescription attach_desc[2] = {};
3594 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3595 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3596 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3597 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3598 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3599 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3600 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3601 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003602
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3605
3606 VkRenderPass renderpass;
3607 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003608 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003609 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003610
Cody Northropc31a84f2016-08-22 10:41:47 -06003611 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3612 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3613 att_state1.blendEnable = VK_TRUE;
3614 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3615 att_state2.blendEnable = VK_FALSE;
3616 pipeline.AddColorAttachment(0, &att_state1);
3617 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003618 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003619 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003620 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003621}
3622
Mike Weiblen40b160e2017-02-06 19:21:52 -07003623// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3624TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3625 TEST_DESCRIPTION(
3626 "Create a graphics pipeline that is incompatible with the requirements "
3627 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003628 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003629
3630 VkDescriptorSetObj ds_obj(m_device);
3631 ds_obj.AppendDummy();
3632 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3633
3634 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3635
3636 VkPipelineColorBlendAttachmentState att_state1 = {};
3637 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3638 att_state1.blendEnable = VK_TRUE;
3639
3640 VkRenderpassObj rp_obj(m_device);
3641
3642 {
3643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3644 VkPipelineObj pipeline(m_device);
3645 pipeline.AddShader(&vs_obj);
3646 pipeline.AddColorAttachment(0, &att_state1);
3647
3648 VkGraphicsPipelineCreateInfo info = {};
3649 pipeline.InitGraphicsPipelineCreateInfo(&info);
3650 info.pColorBlendState = nullptr;
3651
3652 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3653 m_errorMonitor->VerifyFound();
3654 }
3655}
3656
Cort Stratton7547f772017-05-04 15:18:52 -07003657TEST_F(VkLayerTest, CreateRenderPassAttachments) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003658 TEST_DESCRIPTION(
Cort Stratton7547f772017-05-04 15:18:52 -07003659 "Ensure that CreateRenderPass produces the expected validation errors "
3660 "when a subpass's attachments violate the valid usage conditions.");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003661
Tony Barbour1fa09702017-03-16 12:09:08 -06003662 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003663
Cort Stratton7547f772017-05-04 15:18:52 -07003664 std::vector<VkAttachmentDescription> attachments = {
3665 // input attachments
3666 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3667 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_GENERAL,
3668 VK_IMAGE_LAYOUT_GENERAL},
3669 // color attachments
3670 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3671 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3672 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3673 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3674 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3675 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3676 // depth attachment
3677 {0, VK_FORMAT_D24_UNORM_S8_UINT, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3678 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
3679 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
3680 // resolve attachment
3681 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3682 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3683 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3684 // preserve attachments
3685 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3686 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3687 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3688 };
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003689
Cort Stratton7547f772017-05-04 15:18:52 -07003690 std::vector<VkAttachmentReference> input = {
3691 {0, VK_IMAGE_LAYOUT_GENERAL},
3692 };
3693 std::vector<VkAttachmentReference> color = {
3694 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3695 };
3696 VkAttachmentReference depth = {3, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
3697 std::vector<VkAttachmentReference> resolve = {
3698 {4, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3699 };
3700 std::vector<uint32_t> preserve = {5};
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003701
Cort Stratton7547f772017-05-04 15:18:52 -07003702 VkSubpassDescription subpass = {0,
3703 VK_PIPELINE_BIND_POINT_GRAPHICS,
3704 (uint32_t)input.size(),
3705 input.data(),
3706 (uint32_t)color.size(),
3707 color.data(),
3708 resolve.data(),
3709 &depth,
3710 (uint32_t)preserve.size(),
3711 preserve.data()};
3712
3713 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3714 nullptr,
3715 0,
3716 (uint32_t)attachments.size(),
3717 attachments.data(),
3718 1,
3719 &subpass,
3720 0,
3721 nullptr};
3722
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003723 VkRenderPass rp;
Cort Stratton7547f772017-05-04 15:18:52 -07003724 VkResult err;
3725 // Test too many color attachments
3726 {
3727 std::vector<VkAttachmentReference> too_many_colors(m_device->props.limits.maxColorAttachments + 1, color[0]);
3728 subpass.colorAttachmentCount = (uint32_t)too_many_colors.size();
3729 subpass.pColorAttachments = too_many_colors.data();
3730 subpass.pResolveAttachments = NULL;
3731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00348);
3732 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3733 m_errorMonitor->VerifyFound();
3734 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3735 subpass.colorAttachmentCount = (uint32_t)color.size();
3736 subpass.pColorAttachments = color.data();
3737 subpass.pResolveAttachments = resolve.data();
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003738 }
Cort Stratton7547f772017-05-04 15:18:52 -07003739 // Test sample count mismatch between color buffers
3740 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3742 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003743 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003744 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003745 attachments[subpass.pColorAttachments[1].attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3746 // Test sample count mismatch between color buffers and depth buffer
3747 attachments[subpass.pDepthStencilAttachment->attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3749 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003750 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003751 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003752 attachments[subpass.pDepthStencilAttachment->attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3753 // Test resolve attachment with UNUSED color attachment
3754 color[0].attachment = VK_ATTACHMENT_UNUSED;
3755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00350);
3756 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003757 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003758 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003759 color[0].attachment = 1;
3760 // Test resolve from a single-sampled color attachment
3761 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3762 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_1_BIT; // avoid mismatch (00337)
3763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00351);
3764 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3765 m_errorMonitor->VerifyFound();
3766 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3767 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3768 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3769 // Test resolve to a multi-sampled resolve attachment
3770 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00352);
3772 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3773 m_errorMonitor->VerifyFound();
3774 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3775 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3776 // Test with color/resolve format mismatch
3777 attachments[subpass.pColorAttachments[0].attachment].format = VK_FORMAT_R8G8B8A8_SRGB;
3778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00353);
3779 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3780 m_errorMonitor->VerifyFound();
3781 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3782 attachments[subpass.pColorAttachments[0].attachment].format = attachments[subpass.pResolveAttachments[0].attachment].format;
3783 // Test for UNUSED preserve attachments
3784 preserve[0] = VK_ATTACHMENT_UNUSED;
3785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00356);
3786 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3787 m_errorMonitor->VerifyFound();
3788 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3789 preserve[0] = 5;
3790 // Test for preserve attachments used elsewhere in the subpass
3791 color[0].attachment = preserve[0];
3792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00357);
3793 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3794 m_errorMonitor->VerifyFound();
3795 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3796 color[0].attachment = 1;
3797 // test for layout mismatch between input attachment and color attachment
3798 input[0].attachment = color[0].attachment;
3799 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3801 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3802 m_errorMonitor->VerifyFound();
3803 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3804 input[0].attachment = 0;
3805 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3806 // test for layout mismatch between input attachment and depth attachment
3807 input[0].attachment = depth.attachment;
3808 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3810 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3811 m_errorMonitor->VerifyFound();
3812 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3813 input[0].attachment = 0;
3814 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3815 // Test for attachment used first as input with loadOp=CLEAR
3816 {
3817 std::vector<VkSubpassDescription> subpasses = {subpass, subpass, subpass};
3818 subpasses[0].inputAttachmentCount = 0;
3819 subpasses[1].inputAttachmentCount = 0;
3820 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3821 VkRenderPassCreateInfo rpci_multipass = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3822 nullptr,
3823 0,
3824 (uint32_t)attachments.size(),
3825 attachments.data(),
3826 (uint32_t)subpasses.size(),
3827 subpasses.data(),
3828 0,
3829 nullptr};
3830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00349);
3831 err = vkCreateRenderPass(m_device->device(), &rpci_multipass, nullptr, &rp);
3832 m_errorMonitor->VerifyFound();
3833 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3834 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3835 }
Chris Forbes3f128ef2016-06-29 14:58:53 +12003836}
3837
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003838TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003839 TEST_DESCRIPTION(
3840 "Hit errors when attempting to create a framebuffer :\n"
3841 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3842 " 2. Use a color image as depthStencil attachment\n"
3843 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3844 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3845 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3846 " 6. Framebuffer attachment where dimensions don't match\n"
Cort Stratton8133ec22017-04-27 16:25:03 +02003847 " 7. Framebuffer attachment where dimensions don't match\n"
3848 " 8. Framebuffer attachment w/o identity swizzle\n"
3849 " 9. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003850
Tony Barbour1fa09702017-03-16 12:09:08 -06003851 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3853
Cort Stratton8133ec22017-04-27 16:25:03 +02003854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00404);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003855
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003856 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003857 VkAttachmentReference attach = {};
3858 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3859 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003860 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003861 VkRenderPassCreateInfo rpci = {};
3862 rpci.subpassCount = 1;
3863 rpci.pSubpasses = &subpass;
3864 rpci.attachmentCount = 1;
3865 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003866 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003867 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003868 rpci.pAttachments = &attach_desc;
3869 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3870 VkRenderPass rp;
3871 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3872 ASSERT_VK_SUCCESS(err);
3873
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003874 VkImageView ivs[2];
3875 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3876 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003877 VkFramebufferCreateInfo fb_info = {};
3878 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3879 fb_info.pNext = NULL;
3880 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003881 // Set mis-matching attachmentCount
3882 fb_info.attachmentCount = 2;
3883 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003884 fb_info.width = 100;
3885 fb_info.height = 100;
3886 fb_info.layers = 1;
3887
3888 VkFramebuffer fb;
3889 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3890
3891 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 if (err == VK_SUCCESS) {
3893 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3894 }
3895 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003896
3897 // Create a renderPass with a depth-stencil attachment created with
3898 // IMAGE_USAGE_COLOR_ATTACHMENT
3899 // Add our color attachment to pDepthStencilAttachment
3900 subpass.pDepthStencilAttachment = &attach;
3901 subpass.pColorAttachments = NULL;
3902 VkRenderPass rp_ds;
3903 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3904 ASSERT_VK_SUCCESS(err);
3905 // Set correct attachment count, but attachment has COLOR usage bit set
3906 fb_info.attachmentCount = 1;
3907 fb_info.renderPass = rp_ds;
3908
Cort Stratton8133ec22017-04-27 16:25:03 +02003909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00406);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003910 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3911
3912 m_errorMonitor->VerifyFound();
3913 if (err == VK_SUCCESS) {
3914 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3915 }
3916 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003917
3918 // Create new renderpass with alternate attachment format from fb
3919 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3920 subpass.pDepthStencilAttachment = NULL;
3921 subpass.pColorAttachments = &attach;
3922 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3923 ASSERT_VK_SUCCESS(err);
3924
3925 // Cause error due to mis-matched formats between rp & fb
3926 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3927 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00408);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003929 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3930
3931 m_errorMonitor->VerifyFound();
3932 if (err == VK_SUCCESS) {
3933 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3934 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003935 vkDestroyRenderPass(m_device->device(), rp, NULL);
3936
3937 // Create new renderpass with alternate sample count from fb
3938 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3939 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3940 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3941 ASSERT_VK_SUCCESS(err);
3942
3943 // Cause error due to mis-matched sample count between rp & fb
3944 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00409);
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003946 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3947
3948 m_errorMonitor->VerifyFound();
3949 if (err == VK_SUCCESS) {
3950 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3951 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003952
3953 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003954
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003955 {
3956 // Create an image with 2 mip levels.
3957 VkImageObj image(m_device);
3958 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3959 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003960
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003961 // Create a image view with two mip levels.
3962 VkImageView view;
3963 VkImageViewCreateInfo ivci = {};
3964 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3965 ivci.image = image.handle();
3966 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3967 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3968 ivci.subresourceRange.layerCount = 1;
3969 ivci.subresourceRange.baseMipLevel = 0;
3970 // Set level count to 2 (only 1 is allowed for FB attachment)
3971 ivci.subresourceRange.levelCount = 2;
3972 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3973 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3974 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003975
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003976 // Re-create renderpass to have matching sample count
3977 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3978 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3979 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003981 fb_info.renderPass = rp;
3982 fb_info.pAttachments = &view;
Cort Stratton8133ec22017-04-27 16:25:03 +02003983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00411);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003984 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3985
3986 m_errorMonitor->VerifyFound();
3987 if (err == VK_SUCCESS) {
3988 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3989 }
3990 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003991 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003992
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003993 // Update view to original color buffer and grow FB dimensions too big
3994 fb_info.pAttachments = ivs;
3995 fb_info.height = 1024;
3996 fb_info.width = 1024;
3997 fb_info.layers = 2;
Cort Stratton8133ec22017-04-27 16:25:03 +02003998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003999 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4000
4001 m_errorMonitor->VerifyFound();
4002 if (err == VK_SUCCESS) {
4003 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4004 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004005
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004006 {
4007 // Create an image with one mip level.
4008 VkImageObj image(m_device);
4009 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4010 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004011
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004012 // Create view attachment with non-identity swizzle
4013 VkImageView view;
4014 VkImageViewCreateInfo ivci = {};
4015 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4016 ivci.image = image.handle();
4017 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4018 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4019 ivci.subresourceRange.layerCount = 1;
4020 ivci.subresourceRange.baseMipLevel = 0;
4021 ivci.subresourceRange.levelCount = 1;
4022 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4023 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4024 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4025 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4026 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4027 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4028 ASSERT_VK_SUCCESS(err);
4029
4030 fb_info.pAttachments = &view;
4031 fb_info.height = 100;
4032 fb_info.width = 100;
4033 fb_info.layers = 1;
4034
Cort Stratton8133ec22017-04-27 16:25:03 +02004035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00412);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004036 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4037
4038 m_errorMonitor->VerifyFound();
4039 if (err == VK_SUCCESS) {
4040 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4041 }
4042 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004043 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004044
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004045 // reset attachment to color attachment
4046 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004047
4048 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004049 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004050 fb_info.height = 100;
4051 fb_info.layers = 1;
4052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Cort Stratton8133ec22017-04-27 16:25:03 +02004053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004054 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004055 m_errorMonitor->VerifyFound();
4056 if (err == VK_SUCCESS) {
4057 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4058 }
4059 // and width=0
4060 fb_info.width = 0;
4061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02806);
4062 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004063 m_errorMonitor->VerifyFound();
4064 if (err == VK_SUCCESS) {
4065 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4066 }
4067
4068 // Request fb that exceeds max height
4069 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004070 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004071 fb_info.layers = 1;
4072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Cort Stratton8133ec22017-04-27 16:25:03 +02004073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004074 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004075 m_errorMonitor->VerifyFound();
4076 if (err == VK_SUCCESS) {
4077 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4078 }
4079 // and height=0
4080 fb_info.height = 0;
4081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02807);
4082 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004083 m_errorMonitor->VerifyFound();
4084 if (err == VK_SUCCESS) {
4085 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4086 }
4087
4088 // Request fb that exceeds max layers
4089 fb_info.width = 100;
4090 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004091 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Cort Stratton8133ec22017-04-27 16:25:03 +02004093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004094 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004095 m_errorMonitor->VerifyFound();
4096 if (err == VK_SUCCESS) {
4097 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4098 }
4099 // and layers=0
4100 fb_info.layers = 0;
4101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02808);
4102 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinski33826372017-04-13 11:10:11 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Mark Lobodzinski33826372017-04-13 11:10:11 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinski33826372017-04-13 11:10:11 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005060 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005194 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005195 subpass.pColorAttachments = &attach;
5196 VkRenderPassCreateInfo rpci = {};
5197 rpci.subpassCount = 1;
5198 rpci.pSubpasses = &subpass;
5199 rpci.attachmentCount = 1;
5200 VkAttachmentDescription attach_desc = {};
5201 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5202 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5203 rpci.pAttachments = &attach_desc;
5204 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5205 VkRenderPass rp;
5206 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5207 ASSERT_VK_SUCCESS(err);
5208
5209 // Create a pipeline that uses the given renderpass
5210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5212
5213 VkPipelineLayout pipeline_layout;
5214 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5215 ASSERT_VK_SUCCESS(err);
5216
5217 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5218 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005220 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005221 vp_state_ci.pViewports = &vp;
5222 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005223 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 vp_state_ci.pScissors = &scissors;
5225
5226 VkPipelineShaderStageCreateInfo shaderStages[2];
5227 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5228
5229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005230 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005231 // but add it to be able to run on more devices
5232 shaderStages[0] = vs.GetStageCreateInfo();
5233 shaderStages[1] = fs.GetStageCreateInfo();
5234
5235 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5236 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5237
5238 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5239 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5240 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5241
5242 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5243 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5244 rs_ci.rasterizerDiscardEnable = true;
5245 rs_ci.lineWidth = 1.0f;
5246
5247 VkPipelineColorBlendAttachmentState att = {};
5248 att.blendEnable = VK_FALSE;
5249 att.colorWriteMask = 0xf;
5250
5251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5253 cb_ci.attachmentCount = 1;
5254 cb_ci.pAttachments = &att;
5255
5256 VkGraphicsPipelineCreateInfo gp_ci = {};
5257 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5258 gp_ci.stageCount = 2;
5259 gp_ci.pStages = shaderStages;
5260 gp_ci.pVertexInputState = &vi_ci;
5261 gp_ci.pInputAssemblyState = &ia_ci;
5262 gp_ci.pViewportState = &vp_state_ci;
5263 gp_ci.pRasterizationState = &rs_ci;
5264 gp_ci.pColorBlendState = &cb_ci;
5265 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5266 gp_ci.layout = pipeline_layout;
5267 gp_ci.renderPass = rp;
5268
5269 VkPipelineCacheCreateInfo pc_ci = {};
5270 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5271
Dave Houlton756e6742017-03-23 14:33:22 -06005272 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 VkPipeline pipeline;
5274 VkPipelineCache pipe_cache;
5275 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5276 ASSERT_VK_SUCCESS(err);
5277
5278 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5279 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005280
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005281 // Bind pipeline to cmd buffer, will also bind renderpass
5282 m_commandBuffer->BeginCommandBuffer();
5283 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5284 m_commandBuffer->EndCommandBuffer();
5285
5286 VkSubmitInfo submit_info = {};
5287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5288 submit_info.commandBufferCount = 1;
5289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5290 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005291 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005292
5293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5294 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5295 m_errorMonitor->VerifyFound();
5296
5297 // Wait for queue to complete so we can safely destroy everything
5298 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005299 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005300 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005301 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5302 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5303 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5304 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5305}
5306
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005307TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005308 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005310
5311 VkImage image;
5312 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5313 VkImageCreateInfo image_create_info = {};
5314 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5315 image_create_info.pNext = NULL;
5316 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5317 image_create_info.format = tex_format;
5318 image_create_info.extent.width = 32;
5319 image_create_info.extent.height = 32;
5320 image_create_info.extent.depth = 1;
5321 image_create_info.mipLevels = 1;
5322 image_create_info.arrayLayers = 1;
5323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5324 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005326 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005327 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005328 ASSERT_VK_SUCCESS(err);
5329 // Have to bind memory to image before recording cmd in cmd buffer using it
5330 VkMemoryRequirements mem_reqs;
5331 VkDeviceMemory image_mem;
5332 bool pass;
5333 VkMemoryAllocateInfo mem_alloc = {};
5334 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5335 mem_alloc.pNext = NULL;
5336 mem_alloc.memoryTypeIndex = 0;
5337 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5338 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005339 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340 ASSERT_TRUE(pass);
5341 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5342 ASSERT_VK_SUCCESS(err);
5343
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005344 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005346 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005347
5348 m_commandBuffer->BeginCommandBuffer();
5349 VkClearColorValue ccv;
5350 ccv.float32[0] = 1.0f;
5351 ccv.float32[1] = 1.0f;
5352 ccv.float32[2] = 1.0f;
5353 ccv.float32[3] = 1.0f;
5354 VkImageSubresourceRange isr = {};
5355 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5356 isr.baseArrayLayer = 0;
5357 isr.baseMipLevel = 0;
5358 isr.layerCount = 1;
5359 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005360 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005361 m_commandBuffer->EndCommandBuffer();
5362
5363 m_errorMonitor->VerifyFound();
5364 vkDestroyImage(m_device->device(), image, NULL);
5365 vkFreeMemory(m_device->device(), image_mem, nullptr);
5366}
5367
5368TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005371
5372 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005373 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005374 VK_IMAGE_TILING_OPTIMAL, 0);
5375 ASSERT_TRUE(image.initialized());
5376
5377 VkBuffer buffer;
5378 VkDeviceMemory mem;
5379 VkMemoryRequirements mem_reqs;
5380
5381 VkBufferCreateInfo buf_info = {};
5382 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005383 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005384 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005385 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5386 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5387 ASSERT_VK_SUCCESS(err);
5388
5389 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5390
5391 VkMemoryAllocateInfo alloc_info = {};
5392 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005393 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005394 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005395 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005396 if (!pass) {
5397 vkDestroyBuffer(m_device->device(), buffer, NULL);
5398 return;
5399 }
5400 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5401 ASSERT_VK_SUCCESS(err);
5402
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005403 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005405 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005406 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005407 region.bufferRowLength = 16;
5408 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005409 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5410
5411 region.imageSubresource.layerCount = 1;
5412 region.imageExtent.height = 4;
5413 region.imageExtent.width = 4;
5414 region.imageExtent.depth = 1;
5415 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005416 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5417 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005418 m_commandBuffer->EndCommandBuffer();
5419
5420 m_errorMonitor->VerifyFound();
5421
5422 vkDestroyBuffer(m_device->device(), buffer, NULL);
5423 vkFreeMemory(m_device->handle(), mem, NULL);
5424}
5425
Tobin Ehlis85940f52016-07-07 16:57:21 -06005426TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005427 TEST_DESCRIPTION(
5428 "Attempt to draw with a command buffer that is invalid "
5429 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005431
5432 VkEvent event;
5433 VkEventCreateInfo evci = {};
5434 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5435 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5436 ASSERT_VK_SUCCESS(result);
5437
5438 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005439 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005440 m_commandBuffer->EndCommandBuffer();
5441
Mark Lobodzinski33826372017-04-13 11:10:11 -06005442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005443 // Destroy event dependency prior to submit to cause ERROR
5444 vkDestroyEvent(m_device->device(), event, NULL);
5445
5446 VkSubmitInfo submit_info = {};
5447 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5448 submit_info.commandBufferCount = 1;
5449 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5450 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5451
5452 m_errorMonitor->VerifyFound();
5453}
5454
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005455TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005456 TEST_DESCRIPTION(
5457 "Attempt to draw with a command buffer that is invalid "
5458 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005459 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005460
5461 VkQueryPool query_pool;
5462 VkQueryPoolCreateInfo qpci{};
5463 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5464 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5465 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005466 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005467 ASSERT_VK_SUCCESS(result);
5468
5469 m_commandBuffer->BeginCommandBuffer();
5470 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5471 m_commandBuffer->EndCommandBuffer();
5472
Mark Lobodzinski33826372017-04-13 11:10:11 -06005473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005474 // Destroy query pool dependency prior to submit to cause ERROR
5475 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5476
5477 VkSubmitInfo submit_info = {};
5478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5479 submit_info.commandBufferCount = 1;
5480 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5482
5483 m_errorMonitor->VerifyFound();
5484}
5485
Tobin Ehlis24130d92016-07-08 15:50:53 -06005486TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005487 TEST_DESCRIPTION(
5488 "Attempt to draw with a command buffer that is invalid "
5489 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005490 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5492
5493 VkResult err;
5494
5495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5497
5498 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005500 ASSERT_VK_SUCCESS(err);
5501
5502 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5503 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5504 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005505 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005506 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005507 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005508 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005510
5511 VkPipelineShaderStageCreateInfo shaderStages[2];
5512 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5513
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005514 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005515 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005516 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005517 shaderStages[0] = vs.GetStageCreateInfo();
5518 shaderStages[1] = fs.GetStageCreateInfo();
5519
5520 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5521 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5522
5523 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5524 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5525 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5526
5527 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5528 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005529 rs_ci.rasterizerDiscardEnable = true;
5530 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005531
5532 VkPipelineColorBlendAttachmentState att = {};
5533 att.blendEnable = VK_FALSE;
5534 att.colorWriteMask = 0xf;
5535
5536 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5537 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5538 cb_ci.attachmentCount = 1;
5539 cb_ci.pAttachments = &att;
5540
5541 VkGraphicsPipelineCreateInfo gp_ci = {};
5542 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5543 gp_ci.stageCount = 2;
5544 gp_ci.pStages = shaderStages;
5545 gp_ci.pVertexInputState = &vi_ci;
5546 gp_ci.pInputAssemblyState = &ia_ci;
5547 gp_ci.pViewportState = &vp_state_ci;
5548 gp_ci.pRasterizationState = &rs_ci;
5549 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005550 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5551 gp_ci.layout = pipeline_layout;
5552 gp_ci.renderPass = renderPass();
5553
5554 VkPipelineCacheCreateInfo pc_ci = {};
5555 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5556
5557 VkPipeline pipeline;
5558 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005559 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005560 ASSERT_VK_SUCCESS(err);
5561
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005562 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005563 ASSERT_VK_SUCCESS(err);
5564
5565 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005566 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567 m_commandBuffer->EndCommandBuffer();
5568 // Now destroy pipeline in order to cause error when submitting
5569 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5570
Mark Lobodzinski33826372017-04-13 11:10:11 -06005571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005572
5573 VkSubmitInfo submit_info = {};
5574 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5575 submit_info.commandBufferCount = 1;
5576 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5578
5579 m_errorMonitor->VerifyFound();
5580 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5581 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5582}
5583
Tobin Ehlis31289162016-08-17 14:57:58 -06005584TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005585 TEST_DESCRIPTION(
5586 "Attempt to draw with a command buffer that is invalid "
5587 "due to a bound descriptor set with a buffer dependency "
5588 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005590 ASSERT_NO_FATAL_FAILURE(InitViewport());
5591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5592
5593 VkDescriptorPoolSize ds_type_count = {};
5594 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5595 ds_type_count.descriptorCount = 1;
5596
5597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5599 ds_pool_ci.pNext = NULL;
5600 ds_pool_ci.maxSets = 1;
5601 ds_pool_ci.poolSizeCount = 1;
5602 ds_pool_ci.pPoolSizes = &ds_type_count;
5603
5604 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSetLayoutBinding dsl_binding = {};
5609 dsl_binding.binding = 0;
5610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5611 dsl_binding.descriptorCount = 1;
5612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5613 dsl_binding.pImmutableSamplers = NULL;
5614
5615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5617 ds_layout_ci.pNext = NULL;
5618 ds_layout_ci.bindingCount = 1;
5619 ds_layout_ci.pBindings = &dsl_binding;
5620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSet descriptorSet;
5625 VkDescriptorSetAllocateInfo alloc_info = {};
5626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5627 alloc_info.descriptorSetCount = 1;
5628 alloc_info.descriptorPool = ds_pool;
5629 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5635 pipeline_layout_ci.pNext = NULL;
5636 pipeline_layout_ci.setLayoutCount = 1;
5637 pipeline_layout_ci.pSetLayouts = &ds_layout;
5638
5639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005641 ASSERT_VK_SUCCESS(err);
5642
5643 // Create a buffer to update the descriptor with
5644 uint32_t qfi = 0;
5645 VkBufferCreateInfo buffCI = {};
5646 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5647 buffCI.size = 1024;
5648 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5649 buffCI.queueFamilyIndexCount = 1;
5650 buffCI.pQueueFamilyIndices = &qfi;
5651
5652 VkBuffer buffer;
5653 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5654 ASSERT_VK_SUCCESS(err);
5655 // Allocate memory and bind to buffer so we can make it to the appropriate
5656 // error
5657 VkMemoryAllocateInfo mem_alloc = {};
5658 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5659 mem_alloc.pNext = NULL;
5660 mem_alloc.allocationSize = 1024;
5661 mem_alloc.memoryTypeIndex = 0;
5662
5663 VkMemoryRequirements memReqs;
5664 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005665 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005666 if (!pass) {
5667 vkDestroyBuffer(m_device->device(), buffer, NULL);
5668 return;
5669 }
5670
5671 VkDeviceMemory mem;
5672 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5673 ASSERT_VK_SUCCESS(err);
5674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5675 ASSERT_VK_SUCCESS(err);
5676 // Correctly update descriptor to avoid "NOT_UPDATED" error
5677 VkDescriptorBufferInfo buffInfo = {};
5678 buffInfo.buffer = buffer;
5679 buffInfo.offset = 0;
5680 buffInfo.range = 1024;
5681
5682 VkWriteDescriptorSet descriptor_write;
5683 memset(&descriptor_write, 0, sizeof(descriptor_write));
5684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5685 descriptor_write.dstSet = descriptorSet;
5686 descriptor_write.dstBinding = 0;
5687 descriptor_write.descriptorCount = 1;
5688 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5689 descriptor_write.pBufferInfo = &buffInfo;
5690
5691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5692
5693 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005694 char const *vsSource =
5695 "#version 450\n"
5696 "\n"
5697 "out gl_PerVertex { \n"
5698 " vec4 gl_Position;\n"
5699 "};\n"
5700 "void main(){\n"
5701 " gl_Position = vec4(1);\n"
5702 "}\n";
5703 char const *fsSource =
5704 "#version 450\n"
5705 "\n"
5706 "layout(location=0) out vec4 x;\n"
5707 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5708 "void main(){\n"
5709 " x = vec4(bar.y);\n"
5710 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5713 VkPipelineObj pipe(m_device);
5714 pipe.AddShader(&vs);
5715 pipe.AddShader(&fs);
5716 pipe.AddColorAttachment();
5717 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5718
Tony Barbour552f6c02016-12-21 14:34:07 -07005719 m_commandBuffer->BeginCommandBuffer();
5720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005721 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5722 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5723 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005724
5725 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5726 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5727
Tobin Ehlis31289162016-08-17 14:57:58 -06005728 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005729 m_commandBuffer->EndRenderPass();
5730 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005732 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5733 vkDestroyBuffer(m_device->device(), buffer, NULL);
5734 // Attempt to submit cmd buffer
5735 VkSubmitInfo submit_info = {};
5736 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5737 submit_info.commandBufferCount = 1;
5738 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5740 m_errorMonitor->VerifyFound();
5741 // Cleanup
5742 vkFreeMemory(m_device->device(), mem, NULL);
5743
5744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5747}
5748
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005749TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005750 TEST_DESCRIPTION(
5751 "Attempt to draw with a command buffer that is invalid "
5752 "due to a bound descriptor sets with a combined image "
5753 "sampler having their image, sampler, and descriptor set "
5754 "each respectively destroyed and then attempting to "
5755 "submit associated cmd buffers. Attempt to destroy a "
5756 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005757 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005758 ASSERT_NO_FATAL_FAILURE(InitViewport());
5759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5760
5761 VkDescriptorPoolSize ds_type_count = {};
5762 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5763 ds_type_count.descriptorCount = 1;
5764
5765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5767 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005768 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005769 ds_pool_ci.maxSets = 1;
5770 ds_pool_ci.poolSizeCount = 1;
5771 ds_pool_ci.pPoolSizes = &ds_type_count;
5772
5773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005775 ASSERT_VK_SUCCESS(err);
5776
5777 VkDescriptorSetLayoutBinding dsl_binding = {};
5778 dsl_binding.binding = 0;
5779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5780 dsl_binding.descriptorCount = 1;
5781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5782 dsl_binding.pImmutableSamplers = NULL;
5783
5784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5786 ds_layout_ci.pNext = NULL;
5787 ds_layout_ci.bindingCount = 1;
5788 ds_layout_ci.pBindings = &dsl_binding;
5789 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 ASSERT_VK_SUCCESS(err);
5792
5793 VkDescriptorSet descriptorSet;
5794 VkDescriptorSetAllocateInfo alloc_info = {};
5795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5796 alloc_info.descriptorSetCount = 1;
5797 alloc_info.descriptorPool = ds_pool;
5798 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_VK_SUCCESS(err);
5801
5802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5804 pipeline_layout_ci.pNext = NULL;
5805 pipeline_layout_ci.setLayoutCount = 1;
5806 pipeline_layout_ci.pSetLayouts = &ds_layout;
5807
5808 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005810 ASSERT_VK_SUCCESS(err);
5811
5812 // Create images to update the descriptor with
5813 VkImage image;
5814 VkImage image2;
5815 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5816 const int32_t tex_width = 32;
5817 const int32_t tex_height = 32;
5818 VkImageCreateInfo image_create_info = {};
5819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5820 image_create_info.pNext = NULL;
5821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5822 image_create_info.format = tex_format;
5823 image_create_info.extent.width = tex_width;
5824 image_create_info.extent.height = tex_height;
5825 image_create_info.extent.depth = 1;
5826 image_create_info.mipLevels = 1;
5827 image_create_info.arrayLayers = 1;
5828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5831 image_create_info.flags = 0;
5832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5833 ASSERT_VK_SUCCESS(err);
5834 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5835 ASSERT_VK_SUCCESS(err);
5836
5837 VkMemoryRequirements memory_reqs;
5838 VkDeviceMemory image_memory;
5839 bool pass;
5840 VkMemoryAllocateInfo memory_info = {};
5841 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5842 memory_info.pNext = NULL;
5843 memory_info.allocationSize = 0;
5844 memory_info.memoryTypeIndex = 0;
5845 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5846 // Allocate enough memory for both images
5847 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005848 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005849 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005850 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005851 ASSERT_VK_SUCCESS(err);
5852 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5853 ASSERT_VK_SUCCESS(err);
5854 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005856 ASSERT_VK_SUCCESS(err);
5857
5858 VkImageViewCreateInfo image_view_create_info = {};
5859 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5860 image_view_create_info.image = image;
5861 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5862 image_view_create_info.format = tex_format;
5863 image_view_create_info.subresourceRange.layerCount = 1;
5864 image_view_create_info.subresourceRange.baseMipLevel = 0;
5865 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005866 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005867
5868 VkImageView view;
5869 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005870 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005871 ASSERT_VK_SUCCESS(err);
5872 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005874 ASSERT_VK_SUCCESS(err);
5875 // Create Samplers
5876 VkSamplerCreateInfo sampler_ci = {};
5877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5878 sampler_ci.pNext = NULL;
5879 sampler_ci.magFilter = VK_FILTER_NEAREST;
5880 sampler_ci.minFilter = VK_FILTER_NEAREST;
5881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5885 sampler_ci.mipLodBias = 1.0;
5886 sampler_ci.anisotropyEnable = VK_FALSE;
5887 sampler_ci.maxAnisotropy = 1;
5888 sampler_ci.compareEnable = VK_FALSE;
5889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5890 sampler_ci.minLod = 1.0;
5891 sampler_ci.maxLod = 1.0;
5892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5894 VkSampler sampler;
5895 VkSampler sampler2;
5896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5897 ASSERT_VK_SUCCESS(err);
5898 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5899 ASSERT_VK_SUCCESS(err);
5900 // Update descriptor with image and sampler
5901 VkDescriptorImageInfo img_info = {};
5902 img_info.sampler = sampler;
5903 img_info.imageView = view;
5904 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5905
5906 VkWriteDescriptorSet descriptor_write;
5907 memset(&descriptor_write, 0, sizeof(descriptor_write));
5908 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5909 descriptor_write.dstSet = descriptorSet;
5910 descriptor_write.dstBinding = 0;
5911 descriptor_write.descriptorCount = 1;
5912 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5913 descriptor_write.pImageInfo = &img_info;
5914
5915 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5916
5917 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005918 char const *vsSource =
5919 "#version 450\n"
5920 "\n"
5921 "out gl_PerVertex { \n"
5922 " vec4 gl_Position;\n"
5923 "};\n"
5924 "void main(){\n"
5925 " gl_Position = vec4(1);\n"
5926 "}\n";
5927 char const *fsSource =
5928 "#version 450\n"
5929 "\n"
5930 "layout(set=0, binding=0) uniform sampler2D s;\n"
5931 "layout(location=0) out vec4 x;\n"
5932 "void main(){\n"
5933 " x = texture(s, vec2(1));\n"
5934 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5937 VkPipelineObj pipe(m_device);
5938 pipe.AddShader(&vs);
5939 pipe.AddShader(&fs);
5940 pipe.AddColorAttachment();
5941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5942
5943 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005945 m_commandBuffer->BeginCommandBuffer();
5946 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005947 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5948 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5949 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005950 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5951 VkRect2D scissor = {{0, 0}, {16, 16}};
5952 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5953 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005954 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005955 m_commandBuffer->EndRenderPass();
5956 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005957 // Destroy sampler invalidates the cmd buffer, causing error on submit
5958 vkDestroySampler(m_device->device(), sampler, NULL);
5959 // Attempt to submit cmd buffer
5960 VkSubmitInfo submit_info = {};
5961 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5962 submit_info.commandBufferCount = 1;
5963 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5965 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005966
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005967 // Now re-update descriptor with valid sampler and delete image
5968 img_info.sampler = sampler2;
5969 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005970
5971 VkCommandBufferBeginInfo info = {};
5972 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5973 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5974
Mark Lobodzinski33826372017-04-13 11:10:11 -06005975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005976 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005977 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005978 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5979 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5980 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005981 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5982 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005983 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005984 m_commandBuffer->EndRenderPass();
5985 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005986 // Destroy image invalidates the cmd buffer, causing error on submit
5987 vkDestroyImage(m_device->device(), image, NULL);
5988 // Attempt to submit cmd buffer
5989 submit_info = {};
5990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5991 submit_info.commandBufferCount = 1;
5992 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5994 m_errorMonitor->VerifyFound();
5995 // Now update descriptor to be valid, but then free descriptor
5996 img_info.imageView = view2;
5997 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005998 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005999 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006000 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6001 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6002 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006003 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6004 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006005 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006006 m_commandBuffer->EndRenderPass();
6007 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006009
6010 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006012 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006013 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006014
6015 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006016 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006017 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006018 m_errorMonitor->SetUnexpectedError(
6019 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6020 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006021 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006022 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6023
6024 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006030 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6031 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006032
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006033 // Cleanup
6034 vkFreeMemory(m_device->device(), image_memory, NULL);
6035 vkDestroySampler(m_device->device(), sampler2, NULL);
6036 vkDestroyImage(m_device->device(), image2, NULL);
6037 vkDestroyImageView(m_device->device(), view, NULL);
6038 vkDestroyImageView(m_device->device(), view2, NULL);
6039 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6042}
6043
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006044TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6045 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6046 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6047 ASSERT_NO_FATAL_FAILURE(InitViewport());
6048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6049
6050 VkDescriptorPoolSize ds_type_count = {};
6051 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6052 ds_type_count.descriptorCount = 1;
6053
6054 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6055 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6056 ds_pool_ci.pNext = NULL;
6057 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6058 ds_pool_ci.maxSets = 1;
6059 ds_pool_ci.poolSizeCount = 1;
6060 ds_pool_ci.pPoolSizes = &ds_type_count;
6061
6062 VkDescriptorPool ds_pool;
6063 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6064 ASSERT_VK_SUCCESS(err);
6065
6066 VkDescriptorSetLayoutBinding dsl_binding = {};
6067 dsl_binding.binding = 0;
6068 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6069 dsl_binding.descriptorCount = 1;
6070 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6071 dsl_binding.pImmutableSamplers = NULL;
6072
6073 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6074 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6075 ds_layout_ci.pNext = NULL;
6076 ds_layout_ci.bindingCount = 1;
6077 ds_layout_ci.pBindings = &dsl_binding;
6078 VkDescriptorSetLayout ds_layout;
6079 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6080 ASSERT_VK_SUCCESS(err);
6081
6082 VkDescriptorSet descriptorSet;
6083 VkDescriptorSetAllocateInfo alloc_info = {};
6084 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6085 alloc_info.descriptorSetCount = 1;
6086 alloc_info.descriptorPool = ds_pool;
6087 alloc_info.pSetLayouts = &ds_layout;
6088 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6089 ASSERT_VK_SUCCESS(err);
6090
6091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6093 pipeline_layout_ci.pNext = NULL;
6094 pipeline_layout_ci.setLayoutCount = 1;
6095 pipeline_layout_ci.pSetLayouts = &ds_layout;
6096
6097 VkPipelineLayout pipeline_layout;
6098 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6099 ASSERT_VK_SUCCESS(err);
6100
6101 // Create images to update the descriptor with
6102 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6103 VkImageObj image(m_device);
6104 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6105 0);
6106 ASSERT_TRUE(image.initialized());
6107
6108 VkImageViewCreateInfo image_view_create_info = {};
6109 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6110 image_view_create_info.image = image.handle();
6111 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6112 image_view_create_info.format = format;
6113 image_view_create_info.subresourceRange.layerCount = 1;
6114 image_view_create_info.subresourceRange.baseMipLevel = 0;
6115 image_view_create_info.subresourceRange.levelCount = 1;
6116 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6117
6118 VkImageView view;
6119 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6120 ASSERT_VK_SUCCESS(err);
6121 // Create Sampler
6122 VkSamplerCreateInfo sampler_ci = {};
6123 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6124 sampler_ci.pNext = NULL;
6125 sampler_ci.magFilter = VK_FILTER_NEAREST;
6126 sampler_ci.minFilter = VK_FILTER_NEAREST;
6127 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6128 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6129 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6130 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6131 sampler_ci.mipLodBias = 1.0;
6132 sampler_ci.anisotropyEnable = VK_FALSE;
6133 sampler_ci.maxAnisotropy = 1;
6134 sampler_ci.compareEnable = VK_FALSE;
6135 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6136 sampler_ci.minLod = 1.0;
6137 sampler_ci.maxLod = 1.0;
6138 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6139 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6140 VkSampler sampler;
6141 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6142 ASSERT_VK_SUCCESS(err);
6143 // Update descriptor with image and sampler
6144 VkDescriptorImageInfo img_info = {};
6145 img_info.sampler = sampler;
6146 img_info.imageView = view;
6147 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6148 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6149
6150 VkWriteDescriptorSet descriptor_write;
6151 memset(&descriptor_write, 0, sizeof(descriptor_write));
6152 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6153 descriptor_write.dstSet = descriptorSet;
6154 descriptor_write.dstBinding = 0;
6155 descriptor_write.descriptorCount = 1;
6156 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6157 descriptor_write.pImageInfo = &img_info;
6158
6159 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6160
6161 // Create PSO to be used for draw-time errors below
6162 char const *vsSource =
6163 "#version 450\n"
6164 "\n"
6165 "out gl_PerVertex { \n"
6166 " vec4 gl_Position;\n"
6167 "};\n"
6168 "void main(){\n"
6169 " gl_Position = vec4(1);\n"
6170 "}\n";
6171 char const *fsSource =
6172 "#version 450\n"
6173 "\n"
6174 "layout(set=0, binding=0) uniform sampler2D s;\n"
6175 "layout(location=0) out vec4 x;\n"
6176 "void main(){\n"
6177 " x = texture(s, vec2(1));\n"
6178 "}\n";
6179 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6180 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6181 VkPipelineObj pipe(m_device);
6182 pipe.AddShader(&vs);
6183 pipe.AddShader(&fs);
6184 pipe.AddColorAttachment();
6185 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6186
6187 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6188 cmd_buf.BeginCommandBuffer();
6189 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
6190 // record layout different than actual descriptor layout of SHADER_RO
6191 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
6192 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6193 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6194 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6195 VkRect2D scissor = {{0, 0}, {16, 16}};
6196 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6197 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6198 // At draw time the update layout will mis-match the actual layout
6199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6200 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6201 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6202 m_errorMonitor->SetDesiredFailureMsg(
6203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6204 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6205 cmd_buf.Draw(1, 0, 0, 0);
6206 m_errorMonitor->VerifyFound();
6207 cmd_buf.EndRenderPass();
6208 cmd_buf.EndCommandBuffer();
6209 // Submit cmd buffer
6210 VkSubmitInfo submit_info = {};
6211 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6212 submit_info.commandBufferCount = 1;
6213 submit_info.pCommandBuffers = &cmd_buf.handle();
6214 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6215 vkQueueWaitIdle(m_device->m_queue);
6216 // Cleanup
6217 vkDestroySampler(m_device->device(), sampler, NULL);
6218 vkDestroyImageView(m_device->device(), view, NULL);
6219 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6221 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6222}
6223
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006224TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6225 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006226 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006227 ASSERT_NO_FATAL_FAILURE(InitViewport());
6228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6229
6230 VkDescriptorPoolSize ds_type_count = {};
6231 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6232 ds_type_count.descriptorCount = 1;
6233
6234 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6235 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6236 ds_pool_ci.pNext = NULL;
6237 ds_pool_ci.maxSets = 1;
6238 ds_pool_ci.poolSizeCount = 1;
6239 ds_pool_ci.pPoolSizes = &ds_type_count;
6240
6241 VkDescriptorPool ds_pool;
6242 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6243 ASSERT_VK_SUCCESS(err);
6244
6245 VkDescriptorSetLayoutBinding dsl_binding = {};
6246 dsl_binding.binding = 0;
6247 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6248 dsl_binding.descriptorCount = 1;
6249 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6250 dsl_binding.pImmutableSamplers = NULL;
6251
6252 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6253 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6254 ds_layout_ci.pNext = NULL;
6255 ds_layout_ci.bindingCount = 1;
6256 ds_layout_ci.pBindings = &dsl_binding;
6257 VkDescriptorSetLayout ds_layout;
6258 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6259 ASSERT_VK_SUCCESS(err);
6260
6261 VkDescriptorSet descriptor_set;
6262 VkDescriptorSetAllocateInfo alloc_info = {};
6263 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6264 alloc_info.descriptorSetCount = 1;
6265 alloc_info.descriptorPool = ds_pool;
6266 alloc_info.pSetLayouts = &ds_layout;
6267 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6268 ASSERT_VK_SUCCESS(err);
6269
6270 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6271 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6272 pipeline_layout_ci.pNext = NULL;
6273 pipeline_layout_ci.setLayoutCount = 1;
6274 pipeline_layout_ci.pSetLayouts = &ds_layout;
6275
6276 VkPipelineLayout pipeline_layout;
6277 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6278 ASSERT_VK_SUCCESS(err);
6279
6280 // Create image to update the descriptor with
6281 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006282 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006283 ASSERT_TRUE(image.initialized());
6284
6285 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6286 // Create Sampler
6287 VkSamplerCreateInfo sampler_ci = {};
6288 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6289 sampler_ci.pNext = NULL;
6290 sampler_ci.magFilter = VK_FILTER_NEAREST;
6291 sampler_ci.minFilter = VK_FILTER_NEAREST;
6292 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6293 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6294 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6295 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6296 sampler_ci.mipLodBias = 1.0;
6297 sampler_ci.anisotropyEnable = VK_FALSE;
6298 sampler_ci.maxAnisotropy = 1;
6299 sampler_ci.compareEnable = VK_FALSE;
6300 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6301 sampler_ci.minLod = 1.0;
6302 sampler_ci.maxLod = 1.0;
6303 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6304 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6305 VkSampler sampler;
6306 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6307 ASSERT_VK_SUCCESS(err);
6308 // Update descriptor with image and sampler
6309 VkDescriptorImageInfo img_info = {};
6310 img_info.sampler = sampler;
6311 img_info.imageView = view;
6312 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6313
6314 VkWriteDescriptorSet descriptor_write;
6315 memset(&descriptor_write, 0, sizeof(descriptor_write));
6316 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6317 descriptor_write.dstSet = descriptor_set;
6318 descriptor_write.dstBinding = 0;
6319 descriptor_write.descriptorCount = 1;
6320 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6321 descriptor_write.pImageInfo = &img_info;
6322
6323 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6324
6325 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006326 char const *vsSource =
6327 "#version 450\n"
6328 "\n"
6329 "out gl_PerVertex { \n"
6330 " vec4 gl_Position;\n"
6331 "};\n"
6332 "void main(){\n"
6333 " gl_Position = vec4(1);\n"
6334 "}\n";
6335 char const *fsSource =
6336 "#version 450\n"
6337 "\n"
6338 "layout(set=0, binding=0) uniform sampler2D s;\n"
6339 "layout(location=0) out vec4 x;\n"
6340 "void main(){\n"
6341 " x = texture(s, vec2(1));\n"
6342 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006343 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6344 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6345 VkPipelineObj pipe(m_device);
6346 pipe.AddShader(&vs);
6347 pipe.AddShader(&fs);
6348 pipe.AddColorAttachment();
6349 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6350
Tony Barbour552f6c02016-12-21 14:34:07 -07006351 m_commandBuffer->BeginCommandBuffer();
6352 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006353 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6354 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6355 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006356
6357 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6358 VkRect2D scissor = {{0, 0}, {16, 16}};
6359 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6360 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6361
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006362 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006363 m_commandBuffer->EndRenderPass();
6364 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006365 // Submit cmd buffer to put pool in-flight
6366 VkSubmitInfo submit_info = {};
6367 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6368 submit_info.commandBufferCount = 1;
6369 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6370 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6371 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006373 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6374 m_errorMonitor->VerifyFound();
6375 vkQueueWaitIdle(m_device->m_queue);
6376 // Cleanup
6377 vkDestroySampler(m_device->device(), sampler, NULL);
6378 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006380 m_errorMonitor->SetUnexpectedError(
6381 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006382 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006383 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006384 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006385}
6386
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006387TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6388 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006389 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006390 ASSERT_NO_FATAL_FAILURE(InitViewport());
6391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6392
6393 VkDescriptorPoolSize ds_type_count = {};
6394 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6395 ds_type_count.descriptorCount = 1;
6396
6397 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6398 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6399 ds_pool_ci.pNext = NULL;
6400 ds_pool_ci.maxSets = 1;
6401 ds_pool_ci.poolSizeCount = 1;
6402 ds_pool_ci.pPoolSizes = &ds_type_count;
6403
6404 VkDescriptorPool ds_pool;
6405 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6406 ASSERT_VK_SUCCESS(err);
6407
6408 VkDescriptorSetLayoutBinding dsl_binding = {};
6409 dsl_binding.binding = 0;
6410 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6411 dsl_binding.descriptorCount = 1;
6412 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6413 dsl_binding.pImmutableSamplers = NULL;
6414
6415 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6416 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6417 ds_layout_ci.pNext = NULL;
6418 ds_layout_ci.bindingCount = 1;
6419 ds_layout_ci.pBindings = &dsl_binding;
6420 VkDescriptorSetLayout ds_layout;
6421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6422 ASSERT_VK_SUCCESS(err);
6423
6424 VkDescriptorSet descriptorSet;
6425 VkDescriptorSetAllocateInfo alloc_info = {};
6426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6427 alloc_info.descriptorSetCount = 1;
6428 alloc_info.descriptorPool = ds_pool;
6429 alloc_info.pSetLayouts = &ds_layout;
6430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6431 ASSERT_VK_SUCCESS(err);
6432
6433 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6434 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6435 pipeline_layout_ci.pNext = NULL;
6436 pipeline_layout_ci.setLayoutCount = 1;
6437 pipeline_layout_ci.pSetLayouts = &ds_layout;
6438
6439 VkPipelineLayout pipeline_layout;
6440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6441 ASSERT_VK_SUCCESS(err);
6442
6443 // Create images to update the descriptor with
6444 VkImage image;
6445 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6446 const int32_t tex_width = 32;
6447 const int32_t tex_height = 32;
6448 VkImageCreateInfo image_create_info = {};
6449 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6450 image_create_info.pNext = NULL;
6451 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6452 image_create_info.format = tex_format;
6453 image_create_info.extent.width = tex_width;
6454 image_create_info.extent.height = tex_height;
6455 image_create_info.extent.depth = 1;
6456 image_create_info.mipLevels = 1;
6457 image_create_info.arrayLayers = 1;
6458 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6459 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6460 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6461 image_create_info.flags = 0;
6462 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6463 ASSERT_VK_SUCCESS(err);
6464 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6465 VkMemoryRequirements memory_reqs;
6466 VkDeviceMemory image_memory;
6467 bool pass;
6468 VkMemoryAllocateInfo memory_info = {};
6469 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6470 memory_info.pNext = NULL;
6471 memory_info.allocationSize = 0;
6472 memory_info.memoryTypeIndex = 0;
6473 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6474 // Allocate enough memory for image
6475 memory_info.allocationSize = memory_reqs.size;
6476 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6477 ASSERT_TRUE(pass);
6478 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6479 ASSERT_VK_SUCCESS(err);
6480 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6481 ASSERT_VK_SUCCESS(err);
6482
6483 VkImageViewCreateInfo image_view_create_info = {};
6484 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6485 image_view_create_info.image = image;
6486 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6487 image_view_create_info.format = tex_format;
6488 image_view_create_info.subresourceRange.layerCount = 1;
6489 image_view_create_info.subresourceRange.baseMipLevel = 0;
6490 image_view_create_info.subresourceRange.levelCount = 1;
6491 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6492
6493 VkImageView view;
6494 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6495 ASSERT_VK_SUCCESS(err);
6496 // Create Samplers
6497 VkSamplerCreateInfo sampler_ci = {};
6498 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6499 sampler_ci.pNext = NULL;
6500 sampler_ci.magFilter = VK_FILTER_NEAREST;
6501 sampler_ci.minFilter = VK_FILTER_NEAREST;
6502 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6503 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6504 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6505 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6506 sampler_ci.mipLodBias = 1.0;
6507 sampler_ci.anisotropyEnable = VK_FALSE;
6508 sampler_ci.maxAnisotropy = 1;
6509 sampler_ci.compareEnable = VK_FALSE;
6510 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6511 sampler_ci.minLod = 1.0;
6512 sampler_ci.maxLod = 1.0;
6513 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6514 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6515 VkSampler sampler;
6516 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6517 ASSERT_VK_SUCCESS(err);
6518 // Update descriptor with image and sampler
6519 VkDescriptorImageInfo img_info = {};
6520 img_info.sampler = sampler;
6521 img_info.imageView = view;
6522 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6523
6524 VkWriteDescriptorSet descriptor_write;
6525 memset(&descriptor_write, 0, sizeof(descriptor_write));
6526 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6527 descriptor_write.dstSet = descriptorSet;
6528 descriptor_write.dstBinding = 0;
6529 descriptor_write.descriptorCount = 1;
6530 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6531 descriptor_write.pImageInfo = &img_info;
6532 // Break memory binding and attempt update
6533 vkFreeMemory(m_device->device(), image_memory, nullptr);
6534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006535 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6537 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6538 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6539 m_errorMonitor->VerifyFound();
6540 // Cleanup
6541 vkDestroyImage(m_device->device(), image, NULL);
6542 vkDestroySampler(m_device->device(), sampler, NULL);
6543 vkDestroyImageView(m_device->device(), view, NULL);
6544 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6545 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6547}
6548
Karl Schultz6addd812016-02-02 17:17:23 -07006549TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006550 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6551 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006552 // Create a valid cmd buffer
6553 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006554 uint64_t fake_pipeline_handle = 0xbaad6001;
6555 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006556 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6558
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006560 m_commandBuffer->BeginCommandBuffer();
6561 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006562 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006563 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006564
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006565 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006567 Draw(1, 0, 0, 0);
6568 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006569
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006570 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006572 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006573 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6574 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006575}
6576
Karl Schultz6addd812016-02-02 17:17:23 -07006577TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006578 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006579 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006582
Tony Barbour1fa09702017-03-16 12:09:08 -06006583 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006584 ASSERT_NO_FATAL_FAILURE(InitViewport());
6585 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006586 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6588 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006589
6590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6592 ds_pool_ci.pNext = NULL;
6593 ds_pool_ci.maxSets = 1;
6594 ds_pool_ci.poolSizeCount = 1;
6595 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006596
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006597 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006598 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006599 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006600
Tony Barboureb254902015-07-15 12:50:33 -06006601 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006602 dsl_binding.binding = 0;
6603 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6604 dsl_binding.descriptorCount = 1;
6605 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6606 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006607
Tony Barboureb254902015-07-15 12:50:33 -06006608 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006609 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6610 ds_layout_ci.pNext = NULL;
6611 ds_layout_ci.bindingCount = 1;
6612 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006613 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006614 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006615 ASSERT_VK_SUCCESS(err);
6616
6617 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006618 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006619 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006620 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006621 alloc_info.descriptorPool = ds_pool;
6622 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006624 ASSERT_VK_SUCCESS(err);
6625
Tony Barboureb254902015-07-15 12:50:33 -06006626 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6628 pipeline_layout_ci.pNext = NULL;
6629 pipeline_layout_ci.setLayoutCount = 1;
6630 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006631
6632 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006634 ASSERT_VK_SUCCESS(err);
6635
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006636 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006637 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006638 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006639 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006640
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006641 VkPipelineObj pipe(m_device);
6642 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006643 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006644 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006645 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006646
Tony Barbour552f6c02016-12-21 14:34:07 -07006647 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006648 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6649 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6650 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006651
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006652 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006653
Chia-I Wuf7458c52015-10-26 21:10:41 +08006654 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6655 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6656 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006657}
6658
Karl Schultz6addd812016-02-02 17:17:23 -07006659TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006660 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006661 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006662
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006664
Tony Barbour1fa09702017-03-16 12:09:08 -06006665 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006666 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006667 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6668 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006669
6670 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006671 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6672 ds_pool_ci.pNext = NULL;
6673 ds_pool_ci.maxSets = 1;
6674 ds_pool_ci.poolSizeCount = 1;
6675 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006676
6677 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006679 ASSERT_VK_SUCCESS(err);
6680
6681 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006682 dsl_binding.binding = 0;
6683 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6684 dsl_binding.descriptorCount = 1;
6685 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6686 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006687
6688 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006689 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6690 ds_layout_ci.pNext = NULL;
6691 ds_layout_ci.bindingCount = 1;
6692 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006693 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006694 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006695 ASSERT_VK_SUCCESS(err);
6696
6697 VkDescriptorSet descriptorSet;
6698 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006700 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006701 alloc_info.descriptorPool = ds_pool;
6702 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006704 ASSERT_VK_SUCCESS(err);
6705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006706 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006707 VkWriteDescriptorSet descriptor_write;
6708 memset(&descriptor_write, 0, sizeof(descriptor_write));
6709 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6710 descriptor_write.dstSet = descriptorSet;
6711 descriptor_write.dstBinding = 0;
6712 descriptor_write.descriptorCount = 1;
6713 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6714 descriptor_write.pTexelBufferView = &view;
6715
6716 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6717
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006718 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006719
6720 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6721 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6722}
6723
Mark Youngd339ba32016-05-30 13:28:35 -06006724TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006725 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006726
6727 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006729 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006730
Tony Barbour1fa09702017-03-16 12:09:08 -06006731 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006732
6733 // Create a buffer with no bound memory and then attempt to create
6734 // a buffer view.
6735 VkBufferCreateInfo buff_ci = {};
6736 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006737 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006738 buff_ci.size = 256;
6739 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6740 VkBuffer buffer;
6741 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6742 ASSERT_VK_SUCCESS(err);
6743
6744 VkBufferViewCreateInfo buff_view_ci = {};
6745 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6746 buff_view_ci.buffer = buffer;
6747 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6748 buff_view_ci.range = VK_WHOLE_SIZE;
6749 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006750 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006751
6752 m_errorMonitor->VerifyFound();
6753 vkDestroyBuffer(m_device->device(), buffer, NULL);
6754 // If last error is success, it still created the view, so delete it.
6755 if (err == VK_SUCCESS) {
6756 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6757 }
6758}
6759
Karl Schultz6addd812016-02-02 17:17:23 -07006760TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6761 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6762 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006763 // 1. No dynamicOffset supplied
6764 // 2. Too many dynamicOffsets supplied
6765 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006766 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6768 " requires 1 dynamicOffsets, but only "
6769 "0 dynamicOffsets are left in "
6770 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006771
Tony Barbour1fa09702017-03-16 12:09:08 -06006772 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006773 ASSERT_NO_FATAL_FAILURE(InitViewport());
6774 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6775
6776 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006777 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6778 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006779
6780 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006781 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6782 ds_pool_ci.pNext = NULL;
6783 ds_pool_ci.maxSets = 1;
6784 ds_pool_ci.poolSizeCount = 1;
6785 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006786
6787 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006788 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006789 ASSERT_VK_SUCCESS(err);
6790
6791 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006792 dsl_binding.binding = 0;
6793 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6794 dsl_binding.descriptorCount = 1;
6795 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6796 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006797
6798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6800 ds_layout_ci.pNext = NULL;
6801 ds_layout_ci.bindingCount = 1;
6802 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006803 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006805 ASSERT_VK_SUCCESS(err);
6806
6807 VkDescriptorSet descriptorSet;
6808 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006809 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006810 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006811 alloc_info.descriptorPool = ds_pool;
6812 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006813 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006814 ASSERT_VK_SUCCESS(err);
6815
6816 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6818 pipeline_layout_ci.pNext = NULL;
6819 pipeline_layout_ci.setLayoutCount = 1;
6820 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006821
6822 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006823 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006824 ASSERT_VK_SUCCESS(err);
6825
6826 // Create a buffer to update the descriptor with
6827 uint32_t qfi = 0;
6828 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006829 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6830 buffCI.size = 1024;
6831 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6832 buffCI.queueFamilyIndexCount = 1;
6833 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006834
6835 VkBuffer dyub;
6836 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6837 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006838 // Allocate memory and bind to buffer so we can make it to the appropriate
6839 // error
6840 VkMemoryAllocateInfo mem_alloc = {};
6841 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6842 mem_alloc.pNext = NULL;
6843 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006844 mem_alloc.memoryTypeIndex = 0;
6845
6846 VkMemoryRequirements memReqs;
6847 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006848 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006849 if (!pass) {
6850 vkDestroyBuffer(m_device->device(), dyub, NULL);
6851 return;
6852 }
6853
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006854 VkDeviceMemory mem;
6855 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6856 ASSERT_VK_SUCCESS(err);
6857 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6858 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006859 // Correctly update descriptor to avoid "NOT_UPDATED" error
6860 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006861 buffInfo.buffer = dyub;
6862 buffInfo.offset = 0;
6863 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006864
6865 VkWriteDescriptorSet descriptor_write;
6866 memset(&descriptor_write, 0, sizeof(descriptor_write));
6867 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6868 descriptor_write.dstSet = descriptorSet;
6869 descriptor_write.dstBinding = 0;
6870 descriptor_write.descriptorCount = 1;
6871 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6872 descriptor_write.pBufferInfo = &buffInfo;
6873
6874 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6875
Tony Barbour552f6c02016-12-21 14:34:07 -07006876 m_commandBuffer->BeginCommandBuffer();
6877 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006878 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6879 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006880 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006881 uint32_t pDynOff[2] = {512, 756};
6882 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6884 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6885 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6886 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006887 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006888 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6890 " dynamic offset 512 combined with "
6891 "offset 0 and range 1024 that "
6892 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006893 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006894 char const *vsSource =
6895 "#version 450\n"
6896 "\n"
6897 "out gl_PerVertex { \n"
6898 " vec4 gl_Position;\n"
6899 "};\n"
6900 "void main(){\n"
6901 " gl_Position = vec4(1);\n"
6902 "}\n";
6903 char const *fsSource =
6904 "#version 450\n"
6905 "\n"
6906 "layout(location=0) out vec4 x;\n"
6907 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6908 "void main(){\n"
6909 " x = vec4(bar.y);\n"
6910 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006911 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6912 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6913 VkPipelineObj pipe(m_device);
6914 pipe.AddShader(&vs);
6915 pipe.AddShader(&fs);
6916 pipe.AddColorAttachment();
6917 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6918
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006919 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6920 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6921 VkRect2D scissor = {{0, 0}, {16, 16}};
6922 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6923
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006924 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006925 // This update should succeed, but offset size of 512 will overstep buffer
6926 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6928 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006929 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006930 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006931
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006932 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006933 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006934
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006935 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006936 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006937 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6938}
6939
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006940TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006941 TEST_DESCRIPTION(
6942 "Attempt to update a descriptor with a non-sparse buffer "
6943 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006944 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006946 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6948 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006949
Tony Barbour1fa09702017-03-16 12:09:08 -06006950 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006951 ASSERT_NO_FATAL_FAILURE(InitViewport());
6952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6953
6954 VkDescriptorPoolSize ds_type_count = {};
6955 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6956 ds_type_count.descriptorCount = 1;
6957
6958 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6959 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6960 ds_pool_ci.pNext = NULL;
6961 ds_pool_ci.maxSets = 1;
6962 ds_pool_ci.poolSizeCount = 1;
6963 ds_pool_ci.pPoolSizes = &ds_type_count;
6964
6965 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006966 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006967 ASSERT_VK_SUCCESS(err);
6968
6969 VkDescriptorSetLayoutBinding dsl_binding = {};
6970 dsl_binding.binding = 0;
6971 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6972 dsl_binding.descriptorCount = 1;
6973 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6974 dsl_binding.pImmutableSamplers = NULL;
6975
6976 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6977 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6978 ds_layout_ci.pNext = NULL;
6979 ds_layout_ci.bindingCount = 1;
6980 ds_layout_ci.pBindings = &dsl_binding;
6981 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006982 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006983 ASSERT_VK_SUCCESS(err);
6984
6985 VkDescriptorSet descriptorSet;
6986 VkDescriptorSetAllocateInfo alloc_info = {};
6987 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6988 alloc_info.descriptorSetCount = 1;
6989 alloc_info.descriptorPool = ds_pool;
6990 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006991 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006992 ASSERT_VK_SUCCESS(err);
6993
6994 // Create a buffer to update the descriptor with
6995 uint32_t qfi = 0;
6996 VkBufferCreateInfo buffCI = {};
6997 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6998 buffCI.size = 1024;
6999 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7000 buffCI.queueFamilyIndexCount = 1;
7001 buffCI.pQueueFamilyIndices = &qfi;
7002
7003 VkBuffer dyub;
7004 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7005 ASSERT_VK_SUCCESS(err);
7006
7007 // Attempt to update descriptor without binding memory to it
7008 VkDescriptorBufferInfo buffInfo = {};
7009 buffInfo.buffer = dyub;
7010 buffInfo.offset = 0;
7011 buffInfo.range = 1024;
7012
7013 VkWriteDescriptorSet descriptor_write;
7014 memset(&descriptor_write, 0, sizeof(descriptor_write));
7015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7016 descriptor_write.dstSet = descriptorSet;
7017 descriptor_write.dstBinding = 0;
7018 descriptor_write.descriptorCount = 1;
7019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7020 descriptor_write.pBufferInfo = &buffInfo;
7021
7022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7023 m_errorMonitor->VerifyFound();
7024
7025 vkDestroyBuffer(m_device->device(), dyub, NULL);
7026 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7027 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7028}
7029
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007030TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007031 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007032 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007033 ASSERT_NO_FATAL_FAILURE(InitViewport());
7034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7035
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007036 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007037 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007038 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7039 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7040 pipeline_layout_ci.pushConstantRangeCount = 1;
7041 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7042
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007043 //
7044 // Check for invalid push constant ranges in pipeline layouts.
7045 //
7046 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007047 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007048 char const *msg;
7049 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007050
Karl Schultzc81037d2016-05-12 08:11:23 -06007051 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7052 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7053 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7054 "vkCreatePipelineLayout() call has push constants index 0 with "
7055 "size 0."},
7056 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7057 "vkCreatePipelineLayout() call has push constants index 0 with "
7058 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007059 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007060 "vkCreatePipelineLayout() call has push constants index 0 with "
7061 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007062 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007063 "vkCreatePipelineLayout() call has push constants index 0 with "
7064 "size 0."},
7065 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7066 "vkCreatePipelineLayout() call has push constants index 0 with "
7067 "offset 1. Offset must"},
7068 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7069 "vkCreatePipelineLayout() call has push constants index 0 "
7070 "with offset "},
7071 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7072 "vkCreatePipelineLayout() call has push constants "
7073 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007074 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007075 "vkCreatePipelineLayout() call has push constants index 0 "
7076 "with offset "},
7077 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7078 "vkCreatePipelineLayout() call has push "
7079 "constants index 0 with offset "},
7080 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7081 "vkCreatePipelineLayout() call has push "
7082 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007083 }};
7084
7085 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007086 for (const auto &iter : range_tests) {
7087 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7089 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007090 m_errorMonitor->VerifyFound();
7091 if (VK_SUCCESS == err) {
7092 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7093 }
7094 }
7095
7096 // Check for invalid stage flag
7097 pc_range.offset = 0;
7098 pc_range.size = 16;
7099 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007100 m_errorMonitor->SetDesiredFailureMsg(
7101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7102 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007103 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007104 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007105 if (VK_SUCCESS == err) {
7106 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7107 }
7108
Karl Schultzc59b72d2017-02-24 15:45:05 -07007109 // Check for duplicate stage flags in a list of push constant ranges.
7110 // A shader can only have one push constant block and that block is mapped
7111 // to the push constant range that has that shader's stage flag set.
7112 // The shader's stage flag can only appear once in all the ranges, so the
7113 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007114 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007115 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007116 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007117 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007118 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007119 // Overlapping ranges are OK, but a stage flag can appear only once.
7120 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7121 {
7122 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7123 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7124 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7125 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007126 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007127 {
7128 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7129 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7130 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7131 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7132 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7133 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7134 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7135 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7136 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7137 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7138 }},
7139 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7140 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7141 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7142 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7143 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7144 {
7145 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7146 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7147 }},
7148 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7149 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7150 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7151 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7152 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7153 {
7154 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7155 }},
7156 },
7157 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007158
Karl Schultzc59b72d2017-02-24 15:45:05 -07007159 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007160 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007161 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007163 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007164 m_errorMonitor->VerifyFound();
7165 if (VK_SUCCESS == err) {
7166 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7167 }
7168 }
7169
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007170 //
7171 // CmdPushConstants tests
7172 //
7173
Karl Schultzc59b72d2017-02-24 15:45:05 -07007174 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007175 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007176 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007177 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007178 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007179 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007181 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007182
7183 const uint8_t dummy_values[100] = {};
7184
7185 m_commandBuffer->BeginCommandBuffer();
7186 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007187
7188 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007189 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007191 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007192 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007193
Karl Schultzc59b72d2017-02-24 15:45:05 -07007194 m_errorMonitor->ExpectSuccess();
7195 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7196 m_errorMonitor->VerifyNotFound();
7197 m_errorMonitor->ExpectSuccess();
7198 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7199 m_errorMonitor->VerifyNotFound();
7200 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7201 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7202 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7203 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7204 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7205 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7206 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007207 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007208 for (const auto &iter : cmd_range_tests) {
7209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7210 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7211 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007212 m_errorMonitor->VerifyFound();
7213 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007214
Tony Barbour552f6c02016-12-21 14:34:07 -07007215 m_commandBuffer->EndRenderPass();
7216 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007217 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007218}
7219
Karl Schultz6addd812016-02-02 17:17:23 -07007220TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007221 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007222 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007223
Tony Barbour1fa09702017-03-16 12:09:08 -06007224 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007225 ASSERT_NO_FATAL_FAILURE(InitViewport());
7226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7227
7228 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7229 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007230 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7231 ds_type_count[0].descriptorCount = 10;
7232 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7233 ds_type_count[1].descriptorCount = 2;
7234 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7235 ds_type_count[2].descriptorCount = 2;
7236 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7237 ds_type_count[3].descriptorCount = 5;
7238 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7239 // type
7240 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7241 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7242 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007243
7244 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007245 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7246 ds_pool_ci.pNext = NULL;
7247 ds_pool_ci.maxSets = 5;
7248 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7249 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007250
7251 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007252 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007253 ASSERT_VK_SUCCESS(err);
7254
7255 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7256 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007257 dsl_binding[0].binding = 0;
7258 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7259 dsl_binding[0].descriptorCount = 5;
7260 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7261 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007262
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007263 // Create layout identical to set0 layout but w/ different stageFlags
7264 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007265 dsl_fs_stage_only.binding = 0;
7266 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7267 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007268 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7269 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007270 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007271 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007272 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7273 ds_layout_ci.pNext = NULL;
7274 ds_layout_ci.bindingCount = 1;
7275 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007276 static const uint32_t NUM_LAYOUTS = 4;
7277 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007278 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007279 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7280 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007281 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007282 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007283 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007284 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007285 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007286 dsl_binding[0].binding = 0;
7287 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007288 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007289 dsl_binding[1].binding = 1;
7290 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7291 dsl_binding[1].descriptorCount = 2;
7292 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7293 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007294 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007295 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007296 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007297 ASSERT_VK_SUCCESS(err);
7298 dsl_binding[0].binding = 0;
7299 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007300 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007301 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007302 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007303 ASSERT_VK_SUCCESS(err);
7304 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007305 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007306 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007307 ASSERT_VK_SUCCESS(err);
7308
7309 static const uint32_t NUM_SETS = 4;
7310 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7311 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007312 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007313 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007314 alloc_info.descriptorPool = ds_pool;
7315 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007316 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007317 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007318 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007319 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007320 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007321 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007322 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007323
7324 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007325 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7326 pipeline_layout_ci.pNext = NULL;
7327 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7328 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007329
7330 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007331 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007332 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007333 // Create pipelineLayout with only one setLayout
7334 pipeline_layout_ci.setLayoutCount = 1;
7335 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007336 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007337 ASSERT_VK_SUCCESS(err);
7338 // Create pipelineLayout with 2 descriptor setLayout at index 0
7339 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7340 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007341 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 ASSERT_VK_SUCCESS(err);
7343 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7344 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7345 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007346 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007347 ASSERT_VK_SUCCESS(err);
7348 // Create pipelineLayout with UB type, but stageFlags for FS only
7349 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7350 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007351 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007352 ASSERT_VK_SUCCESS(err);
7353 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7354 VkDescriptorSetLayout pl_bad_s0[2] = {};
7355 pl_bad_s0[0] = ds_layout_fs_only;
7356 pl_bad_s0[1] = ds_layout[1];
7357 pipeline_layout_ci.setLayoutCount = 2;
7358 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7359 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007360 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007361 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007362
Tobin Ehlis88452832015-12-03 09:40:56 -07007363 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007364 char const *vsSource =
7365 "#version 450\n"
7366 "\n"
7367 "out gl_PerVertex {\n"
7368 " vec4 gl_Position;\n"
7369 "};\n"
7370 "void main(){\n"
7371 " gl_Position = vec4(1);\n"
7372 "}\n";
7373 char const *fsSource =
7374 "#version 450\n"
7375 "\n"
7376 "layout(location=0) out vec4 x;\n"
7377 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7378 "void main(){\n"
7379 " x = vec4(bar.y);\n"
7380 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007381 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007383 VkPipelineObj pipe(m_device);
7384 pipe.AddShader(&vs);
7385 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007386 pipe.AddColorAttachment();
7387 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007388
Tony Barbour552f6c02016-12-21 14:34:07 -07007389 m_commandBuffer->BeginCommandBuffer();
7390 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007391
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007392 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007393 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7394 // of PSO
7395 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7396 // cmd_pipeline.c
7397 // due to the fact that cmd_alloc_dset_data() has not been called in
7398 // cmd_bind_graphics_pipeline()
7399 // TODO : Want to cause various binding incompatibility issues here to test
7400 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007401 // First cause various verify_layout_compatibility() fails
7402 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007403 // verify_set_layout_compatibility fail cases:
7404 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007406 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7407 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007408 m_errorMonitor->VerifyFound();
7409
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007410 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7412 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7413 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007414 m_errorMonitor->VerifyFound();
7415
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007416 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007417 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7418 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7420 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7421 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007422 m_errorMonitor->VerifyFound();
7423
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007424 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7425 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7427 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7428 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007429 m_errorMonitor->VerifyFound();
7430
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007431 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7432 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7434 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7435 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7436 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007437 m_errorMonitor->VerifyFound();
7438
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 // Cause INFO messages due to disturbing previously bound Sets
7440 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007441 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7442 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007443 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7445 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7446 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007447 m_errorMonitor->VerifyFound();
7448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007449 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7450 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007451 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7453 " newly bound as set #0 so set #1 and "
7454 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7456 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007457 m_errorMonitor->VerifyFound();
7458
Tobin Ehlis10fad692016-07-07 12:00:36 -06007459 // Now that we're done actively using the pipelineLayout that gfx pipeline
7460 // was created with, we should be able to delete it. Do that now to verify
7461 // that validation obeys pipelineLayout lifetime
7462 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7463
Tobin Ehlis88452832015-12-03 09:40:56 -07007464 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007465 // 1. Error due to not binding required set (we actually use same code as
7466 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007467 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7468 &descriptorSet[0], 0, NULL);
7469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7470 &descriptorSet[1], 0, NULL);
7471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007472
7473 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7474 VkRect2D scissor = {{0, 0}, {16, 16}};
7475 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7476 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7477
Tobin Ehlis88452832015-12-03 09:40:56 -07007478 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007479 m_errorMonitor->VerifyFound();
7480
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007481 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007482 // 2. Error due to bound set not being compatible with PSO's
7483 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007484 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7485 &descriptorSet[0], 0, NULL);
7486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007487 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007488 m_errorMonitor->VerifyFound();
7489
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007490 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007491 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007492 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7493 }
7494 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007495 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7497}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007498
Karl Schultz6addd812016-02-02 17:17:23 -07007499TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7501 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007502
Tony Barbour1fa09702017-03-16 12:09:08 -06007503 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007504 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007505 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007506 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007508 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007509}
7510
Karl Schultz6addd812016-02-02 17:17:23 -07007511TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7512 VkResult err;
7513 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007514
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007516
Tony Barbour1fa09702017-03-16 12:09:08 -06007517 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007518
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007519 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007520 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007521 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007522 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007523 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007524 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007525
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007526 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007527 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007528
7529 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007530 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007531 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7532
7533 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007534 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007535 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007536 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007537 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007538
7539 // The error should be caught by validation of the BeginCommandBuffer call
7540 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007542 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007543 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007544}
7545
Karl Schultz6addd812016-02-02 17:17:23 -07007546TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007547 // Cause error due to Begin while recording CB
7548 // Then cause 2 errors for attempting to reset CB w/o having
7549 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7550 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007552
Tony Barbour1fa09702017-03-16 12:09:08 -06007553 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007554
7555 // Calls AllocateCommandBuffers
7556 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7557
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007558 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007559 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007560 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7561 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007562 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7563 cmd_buf_info.pNext = NULL;
7564 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007565 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007566
7567 // Begin CB to transition to recording state
7568 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7569 // Can't re-begin. This should trigger error
7570 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007571 m_errorMonitor->VerifyFound();
7572
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007574 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007575 // Reset attempt will trigger error due to incorrect CommandPool state
7576 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007577 m_errorMonitor->VerifyFound();
7578
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007580 // Transition CB to RECORDED state
7581 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7582 // Now attempting to Begin will implicitly reset, which triggers error
7583 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007584 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007585}
7586
Karl Schultz6addd812016-02-02 17:17:23 -07007587TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007588 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007589 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007590
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7592 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007593
Tony Barbour1fa09702017-03-16 12:09:08 -06007594 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007596
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007597 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007598 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7599 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007600
7601 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007602 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7603 ds_pool_ci.pNext = NULL;
7604 ds_pool_ci.maxSets = 1;
7605 ds_pool_ci.poolSizeCount = 1;
7606 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007607
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007608 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007609 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007610 ASSERT_VK_SUCCESS(err);
7611
Tony Barboureb254902015-07-15 12:50:33 -06007612 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007613 dsl_binding.binding = 0;
7614 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7615 dsl_binding.descriptorCount = 1;
7616 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7617 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007618
Tony Barboureb254902015-07-15 12:50:33 -06007619 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007620 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7621 ds_layout_ci.pNext = NULL;
7622 ds_layout_ci.bindingCount = 1;
7623 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007624
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007625 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007626 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007627 ASSERT_VK_SUCCESS(err);
7628
7629 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007630 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007631 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007632 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007633 alloc_info.descriptorPool = ds_pool;
7634 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007635 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007636 ASSERT_VK_SUCCESS(err);
7637
Tony Barboureb254902015-07-15 12:50:33 -06007638 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007639 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7640 pipeline_layout_ci.setLayoutCount = 1;
7641 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007642
7643 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007644 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007645 ASSERT_VK_SUCCESS(err);
7646
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007647 VkViewport vp = {}; // Just need dummy vp to point to
7648 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007649
7650 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007651 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7652 vp_state_ci.scissorCount = 1;
7653 vp_state_ci.pScissors = &sc;
7654 vp_state_ci.viewportCount = 1;
7655 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007656
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007657 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7658 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7659 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7660 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7661 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7662 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007663 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007664 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007665 rs_state_ci.lineWidth = 1.0f;
7666
7667 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7668 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7669 vi_ci.pNext = nullptr;
7670 vi_ci.vertexBindingDescriptionCount = 0;
7671 vi_ci.pVertexBindingDescriptions = nullptr;
7672 vi_ci.vertexAttributeDescriptionCount = 0;
7673 vi_ci.pVertexAttributeDescriptions = nullptr;
7674
7675 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7676 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7677 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7678
7679 VkPipelineShaderStageCreateInfo shaderStages[2];
7680 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7681
7682 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7683 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007684 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007685 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007686
Tony Barboureb254902015-07-15 12:50:33 -06007687 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007688 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7689 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007690 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007691 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7692 gp_ci.layout = pipeline_layout;
7693 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007694 gp_ci.pVertexInputState = &vi_ci;
7695 gp_ci.pInputAssemblyState = &ia_ci;
7696
7697 gp_ci.stageCount = 1;
7698 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007699
7700 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007701 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7702 pc_ci.initialDataSize = 0;
7703 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007704
7705 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007706 VkPipelineCache pipelineCache;
7707
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007708 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007709 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007710 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007711 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007712
Chia-I Wuf7458c52015-10-26 21:10:41 +08007713 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7714 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7715 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7716 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007717}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007718
Tobin Ehlis912df022015-09-17 08:46:18 -06007719/*// TODO : This test should be good, but needs Tess support in compiler to run
7720TEST_F(VkLayerTest, InvalidPatchControlPoints)
7721{
7722 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007723 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007724
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007726 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7727primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007728
Tony Barbour1fa09702017-03-16 12:09:08 -06007729 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007731
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007732 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007733 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007734 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007735
7736 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7737 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7738 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007739 ds_pool_ci.poolSizeCount = 1;
7740 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007741
7742 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007743 err = vkCreateDescriptorPool(m_device->device(),
7744VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007745 ASSERT_VK_SUCCESS(err);
7746
7747 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007748 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007749 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007750 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007751 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7752 dsl_binding.pImmutableSamplers = NULL;
7753
7754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007755 ds_layout_ci.sType =
7756VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007757 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007758 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007759 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007760
7761 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007762 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7763&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007764 ASSERT_VK_SUCCESS(err);
7765
7766 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007767 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7768VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007769 ASSERT_VK_SUCCESS(err);
7770
7771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007772 pipeline_layout_ci.sType =
7773VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007774 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007775 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007776 pipeline_layout_ci.pSetLayouts = &ds_layout;
7777
7778 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007779 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7780&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007781 ASSERT_VK_SUCCESS(err);
7782
7783 VkPipelineShaderStageCreateInfo shaderStages[3];
7784 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7785
Karl Schultz6addd812016-02-02 17:17:23 -07007786 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7787this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007788 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007789 VkShaderObj
7790tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7791this);
7792 VkShaderObj
7793te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7794this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007795
Karl Schultz6addd812016-02-02 17:17:23 -07007796 shaderStages[0].sType =
7797VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007798 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007799 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007800 shaderStages[1].sType =
7801VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007802 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007803 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007804 shaderStages[2].sType =
7805VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007806 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007807 shaderStages[2].shader = te.handle();
7808
7809 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007810 iaCI.sType =
7811VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007812 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007813
7814 VkPipelineTessellationStateCreateInfo tsCI = {};
7815 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7816 tsCI.patchControlPoints = 0; // This will cause an error
7817
7818 VkGraphicsPipelineCreateInfo gp_ci = {};
7819 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7820 gp_ci.pNext = NULL;
7821 gp_ci.stageCount = 3;
7822 gp_ci.pStages = shaderStages;
7823 gp_ci.pVertexInputState = NULL;
7824 gp_ci.pInputAssemblyState = &iaCI;
7825 gp_ci.pTessellationState = &tsCI;
7826 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007827 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007828 gp_ci.pMultisampleState = NULL;
7829 gp_ci.pDepthStencilState = NULL;
7830 gp_ci.pColorBlendState = NULL;
7831 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7832 gp_ci.layout = pipeline_layout;
7833 gp_ci.renderPass = renderPass();
7834
7835 VkPipelineCacheCreateInfo pc_ci = {};
7836 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7837 pc_ci.pNext = NULL;
7838 pc_ci.initialSize = 0;
7839 pc_ci.initialData = 0;
7840 pc_ci.maxSize = 0;
7841
7842 VkPipeline pipeline;
7843 VkPipelineCache pipelineCache;
7844
Karl Schultz6addd812016-02-02 17:17:23 -07007845 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7846&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007847 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007848 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7849&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007850
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007851 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007852
Chia-I Wuf7458c52015-10-26 21:10:41 +08007853 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7854 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7855 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7856 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007857}
7858*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007859
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007860TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007861 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007862
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007863 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007864
Tony Barbour1fa09702017-03-16 12:09:08 -06007865 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007867
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007868 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007869 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7870 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007871
7872 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007873 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7874 ds_pool_ci.maxSets = 1;
7875 ds_pool_ci.poolSizeCount = 1;
7876 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007877
7878 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007879 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007880 ASSERT_VK_SUCCESS(err);
7881
7882 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007883 dsl_binding.binding = 0;
7884 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7885 dsl_binding.descriptorCount = 1;
7886 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007887
7888 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007889 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7890 ds_layout_ci.bindingCount = 1;
7891 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007892
7893 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007894 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007895 ASSERT_VK_SUCCESS(err);
7896
7897 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007898 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007899 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007900 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007901 alloc_info.descriptorPool = ds_pool;
7902 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007903 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007904 ASSERT_VK_SUCCESS(err);
7905
7906 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007907 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7908 pipeline_layout_ci.setLayoutCount = 1;
7909 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910
7911 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007912 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007913 ASSERT_VK_SUCCESS(err);
7914
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007915 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007916 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007917 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007918 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007919 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007920 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007921
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007922 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7923 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7924 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7925 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7926 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7927 rs_state_ci.depthClampEnable = VK_FALSE;
7928 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7929 rs_state_ci.depthBiasEnable = VK_FALSE;
7930
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007931 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7932 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7933 vi_ci.pNext = nullptr;
7934 vi_ci.vertexBindingDescriptionCount = 0;
7935 vi_ci.pVertexBindingDescriptions = nullptr;
7936 vi_ci.vertexAttributeDescriptionCount = 0;
7937 vi_ci.pVertexAttributeDescriptions = nullptr;
7938
7939 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7940 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7941 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7942
7943 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7944 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7945 pipe_ms_state_ci.pNext = NULL;
7946 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7947 pipe_ms_state_ci.sampleShadingEnable = 0;
7948 pipe_ms_state_ci.minSampleShading = 1.0;
7949 pipe_ms_state_ci.pSampleMask = NULL;
7950
Cody Northropeb3a6c12015-10-05 14:44:45 -06007951 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007952 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007953
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007954 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007955 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007956 shaderStages[0] = vs.GetStageCreateInfo();
7957 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007958
7959 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007960 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7961 gp_ci.stageCount = 2;
7962 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007963 gp_ci.pVertexInputState = &vi_ci;
7964 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007965 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007966 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007967 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007968 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7969 gp_ci.layout = pipeline_layout;
7970 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007971
7972 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007973 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007974
7975 VkPipeline pipeline;
7976 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007977 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007978 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007979
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007980 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007981 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007982
7983 // Check case where multiViewport is disabled and viewport count is not 1
7984 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7987 vp_state_ci.scissorCount = 0;
7988 vp_state_ci.viewportCount = 0;
7989 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7990 m_errorMonitor->VerifyFound();
7991 } else {
7992 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007993 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007994 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007995 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007996
7997 // Check is that viewportcount and scissorcount match
7998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7999 vp_state_ci.scissorCount = 1;
8000 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8001 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8002 m_errorMonitor->VerifyFound();
8003
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008004 // Check case where multiViewport is enabled and viewport count is greater than max
8005 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8008 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8009 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8010 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8011 m_errorMonitor->VerifyFound();
8012 }
8013 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008014
Chia-I Wuf7458c52015-10-26 21:10:41 +08008015 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8016 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8017 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8018 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008019}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008020
8021// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
8022// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008023TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008024 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008025
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008026 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8027
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008029
Tony Barbour1fa09702017-03-16 12:09:08 -06008030 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008032
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008033 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008034 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8035 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008036
8037 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008038 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8039 ds_pool_ci.maxSets = 1;
8040 ds_pool_ci.poolSizeCount = 1;
8041 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008042
8043 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008044 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008045 ASSERT_VK_SUCCESS(err);
8046
8047 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008048 dsl_binding.binding = 0;
8049 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8050 dsl_binding.descriptorCount = 1;
8051 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008052
8053 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008054 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8055 ds_layout_ci.bindingCount = 1;
8056 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008057
8058 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008059 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008060 ASSERT_VK_SUCCESS(err);
8061
8062 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008063 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008064 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008065 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008066 alloc_info.descriptorPool = ds_pool;
8067 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008068 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008069 ASSERT_VK_SUCCESS(err);
8070
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008071 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8072 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8073 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8074
8075 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8076 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8077 vi_ci.pNext = nullptr;
8078 vi_ci.vertexBindingDescriptionCount = 0;
8079 vi_ci.pVertexBindingDescriptions = nullptr;
8080 vi_ci.vertexAttributeDescriptionCount = 0;
8081 vi_ci.pVertexAttributeDescriptions = nullptr;
8082
8083 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8084 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8085 pipe_ms_state_ci.pNext = NULL;
8086 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8087 pipe_ms_state_ci.sampleShadingEnable = 0;
8088 pipe_ms_state_ci.minSampleShading = 1.0;
8089 pipe_ms_state_ci.pSampleMask = NULL;
8090
Tobin Ehlise68360f2015-10-01 11:15:13 -06008091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8093 pipeline_layout_ci.setLayoutCount = 1;
8094 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008095
8096 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008097 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008098 ASSERT_VK_SUCCESS(err);
8099
8100 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8101 // Set scissor as dynamic to avoid second error
8102 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008103 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8104 dyn_state_ci.dynamicStateCount = 1;
8105 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008106
Cody Northropeb3a6c12015-10-05 14:44:45 -06008107 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008108 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008109
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008110 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008111 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8112 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008113 shaderStages[0] = vs.GetStageCreateInfo();
8114 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008115
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008116 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8117 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8118 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8119 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8120 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8121 rs_state_ci.depthClampEnable = VK_FALSE;
8122 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8123 rs_state_ci.depthBiasEnable = VK_FALSE;
8124
Tobin Ehlise68360f2015-10-01 11:15:13 -06008125 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008126 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8127 gp_ci.stageCount = 2;
8128 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008129 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008130 // Not setting VP state w/o dynamic vp state should cause validation error
8131 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008132 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008133 gp_ci.pVertexInputState = &vi_ci;
8134 gp_ci.pInputAssemblyState = &ia_ci;
8135 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008136 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8137 gp_ci.layout = pipeline_layout;
8138 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008139
8140 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008141 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008142
8143 VkPipeline pipeline;
8144 VkPipelineCache pipelineCache;
8145
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008146 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008147 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008148 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008149
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008150 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151
Chia-I Wuf7458c52015-10-26 21:10:41 +08008152 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8153 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8154 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8155 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008156}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008157
8158// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8159// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008160TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8161 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008162
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008164
Tony Barbour1fa09702017-03-16 12:09:08 -06008165 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008166
8167 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008168 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008169 return;
8170 }
8171
Tobin Ehlise68360f2015-10-01 11:15:13 -06008172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008173
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008174 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008175 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8176 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008177
8178 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008179 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8180 ds_pool_ci.maxSets = 1;
8181 ds_pool_ci.poolSizeCount = 1;
8182 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008183
8184 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008185 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008186 ASSERT_VK_SUCCESS(err);
8187
8188 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008189 dsl_binding.binding = 0;
8190 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8191 dsl_binding.descriptorCount = 1;
8192 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008193
8194 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008195 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8196 ds_layout_ci.bindingCount = 1;
8197 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008198
8199 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008200 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008201 ASSERT_VK_SUCCESS(err);
8202
8203 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008204 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008205 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008206 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008207 alloc_info.descriptorPool = ds_pool;
8208 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008209 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008210 ASSERT_VK_SUCCESS(err);
8211
8212 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008213 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8214 pipeline_layout_ci.setLayoutCount = 1;
8215 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008216
8217 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008218 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008219 ASSERT_VK_SUCCESS(err);
8220
8221 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008222 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8223 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008224 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008225 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008226 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008227
8228 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8229 // Set scissor as dynamic to avoid that error
8230 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8232 dyn_state_ci.dynamicStateCount = 1;
8233 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008234
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008235 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8236 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8237 pipe_ms_state_ci.pNext = NULL;
8238 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8239 pipe_ms_state_ci.sampleShadingEnable = 0;
8240 pipe_ms_state_ci.minSampleShading = 1.0;
8241 pipe_ms_state_ci.pSampleMask = NULL;
8242
Cody Northropeb3a6c12015-10-05 14:44:45 -06008243 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008244 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008245
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008246 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008247 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8248 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008249 shaderStages[0] = vs.GetStageCreateInfo();
8250 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008251
Cody Northropf6622dc2015-10-06 10:33:21 -06008252 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8253 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8254 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008255 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008256 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008257 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008258 vi_ci.pVertexAttributeDescriptions = nullptr;
8259
8260 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8261 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8262 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8263
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008264 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008265 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008266 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008267 rs_ci.pNext = nullptr;
8268
Mark Youngc89c6312016-03-31 16:03:20 -06008269 VkPipelineColorBlendAttachmentState att = {};
8270 att.blendEnable = VK_FALSE;
8271 att.colorWriteMask = 0xf;
8272
Cody Northropf6622dc2015-10-06 10:33:21 -06008273 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8274 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8275 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008276 cb_ci.attachmentCount = 1;
8277 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008278
Tobin Ehlise68360f2015-10-01 11:15:13 -06008279 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008280 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8281 gp_ci.stageCount = 2;
8282 gp_ci.pStages = shaderStages;
8283 gp_ci.pVertexInputState = &vi_ci;
8284 gp_ci.pInputAssemblyState = &ia_ci;
8285 gp_ci.pViewportState = &vp_state_ci;
8286 gp_ci.pRasterizationState = &rs_ci;
8287 gp_ci.pColorBlendState = &cb_ci;
8288 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008289 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008290 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8291 gp_ci.layout = pipeline_layout;
8292 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008293
8294 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008295 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008296
8297 VkPipeline pipeline;
8298 VkPipelineCache pipelineCache;
8299
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008300 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008301 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008302 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008303
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008304 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008305
Tobin Ehlisd332f282015-10-02 11:00:56 -06008306 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008307 // First need to successfully create the PSO from above by setting
8308 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008311 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008312 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008313 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008314 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008315 m_commandBuffer->BeginCommandBuffer();
8316 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008317 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008318 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008319 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008320 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008321 Draw(1, 0, 0, 0);
8322
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008323 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008324
8325 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8326 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8327 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8328 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008329 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008330}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008331
8332// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008333// viewportCount
8334TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8335 VkResult err;
8336
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008338
Tony Barbour1fa09702017-03-16 12:09:08 -06008339 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008340
8341 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008342 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008343 return;
8344 }
8345
Karl Schultz6addd812016-02-02 17:17:23 -07008346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8347
8348 VkDescriptorPoolSize ds_type_count = {};
8349 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8350 ds_type_count.descriptorCount = 1;
8351
8352 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8353 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8354 ds_pool_ci.maxSets = 1;
8355 ds_pool_ci.poolSizeCount = 1;
8356 ds_pool_ci.pPoolSizes = &ds_type_count;
8357
8358 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008359 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008360 ASSERT_VK_SUCCESS(err);
8361
8362 VkDescriptorSetLayoutBinding dsl_binding = {};
8363 dsl_binding.binding = 0;
8364 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8365 dsl_binding.descriptorCount = 1;
8366 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8367
8368 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8369 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8370 ds_layout_ci.bindingCount = 1;
8371 ds_layout_ci.pBindings = &dsl_binding;
8372
8373 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008374 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008375 ASSERT_VK_SUCCESS(err);
8376
8377 VkDescriptorSet descriptorSet;
8378 VkDescriptorSetAllocateInfo alloc_info = {};
8379 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8380 alloc_info.descriptorSetCount = 1;
8381 alloc_info.descriptorPool = ds_pool;
8382 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008383 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008384 ASSERT_VK_SUCCESS(err);
8385
8386 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8387 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8388 pipeline_layout_ci.setLayoutCount = 1;
8389 pipeline_layout_ci.pSetLayouts = &ds_layout;
8390
8391 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008392 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008393 ASSERT_VK_SUCCESS(err);
8394
8395 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8396 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8397 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008398 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008399 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008400 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008401
8402 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8403 // Set scissor as dynamic to avoid that error
8404 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8405 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8406 dyn_state_ci.dynamicStateCount = 1;
8407 dyn_state_ci.pDynamicStates = &vp_state;
8408
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008409 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8410 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8411 pipe_ms_state_ci.pNext = NULL;
8412 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8413 pipe_ms_state_ci.sampleShadingEnable = 0;
8414 pipe_ms_state_ci.minSampleShading = 1.0;
8415 pipe_ms_state_ci.pSampleMask = NULL;
8416
Karl Schultz6addd812016-02-02 17:17:23 -07008417 VkPipelineShaderStageCreateInfo shaderStages[2];
8418 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8419
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008420 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008421 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8422 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008423 shaderStages[0] = vs.GetStageCreateInfo();
8424 shaderStages[1] = fs.GetStageCreateInfo();
8425
8426 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8427 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8428 vi_ci.pNext = nullptr;
8429 vi_ci.vertexBindingDescriptionCount = 0;
8430 vi_ci.pVertexBindingDescriptions = nullptr;
8431 vi_ci.vertexAttributeDescriptionCount = 0;
8432 vi_ci.pVertexAttributeDescriptions = nullptr;
8433
8434 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8435 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8436 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8437
8438 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8439 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008440 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008441 rs_ci.pNext = nullptr;
8442
Mark Youngc89c6312016-03-31 16:03:20 -06008443 VkPipelineColorBlendAttachmentState att = {};
8444 att.blendEnable = VK_FALSE;
8445 att.colorWriteMask = 0xf;
8446
Karl Schultz6addd812016-02-02 17:17:23 -07008447 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8448 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8449 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008450 cb_ci.attachmentCount = 1;
8451 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008452
8453 VkGraphicsPipelineCreateInfo gp_ci = {};
8454 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8455 gp_ci.stageCount = 2;
8456 gp_ci.pStages = shaderStages;
8457 gp_ci.pVertexInputState = &vi_ci;
8458 gp_ci.pInputAssemblyState = &ia_ci;
8459 gp_ci.pViewportState = &vp_state_ci;
8460 gp_ci.pRasterizationState = &rs_ci;
8461 gp_ci.pColorBlendState = &cb_ci;
8462 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008463 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008464 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8465 gp_ci.layout = pipeline_layout;
8466 gp_ci.renderPass = renderPass();
8467
8468 VkPipelineCacheCreateInfo pc_ci = {};
8469 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8470
8471 VkPipeline pipeline;
8472 VkPipelineCache pipelineCache;
8473
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008474 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008475 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008476 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008477
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008478 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008479
8480 // Now hit second fail case where we set scissor w/ different count than PSO
8481 // First need to successfully create the PSO from above by setting
8482 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8484 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008486 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008487 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008488 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008489 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008490 m_commandBuffer->BeginCommandBuffer();
8491 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008492 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008493 VkViewport viewports[1] = {};
8494 viewports[0].width = 8;
8495 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008496 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008497 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008498 Draw(1, 0, 0, 0);
8499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008500 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008501
Chia-I Wuf7458c52015-10-26 21:10:41 +08008502 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8503 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8504 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8505 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008506 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008507}
8508
Mark Young7394fdd2016-03-31 14:56:43 -06008509TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8510 VkResult err;
8511
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008513
Tony Barbour1fa09702017-03-16 12:09:08 -06008514 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8516
8517 VkDescriptorPoolSize ds_type_count = {};
8518 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8519 ds_type_count.descriptorCount = 1;
8520
8521 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8522 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8523 ds_pool_ci.maxSets = 1;
8524 ds_pool_ci.poolSizeCount = 1;
8525 ds_pool_ci.pPoolSizes = &ds_type_count;
8526
8527 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008528 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008529 ASSERT_VK_SUCCESS(err);
8530
8531 VkDescriptorSetLayoutBinding dsl_binding = {};
8532 dsl_binding.binding = 0;
8533 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8534 dsl_binding.descriptorCount = 1;
8535 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8536
8537 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8538 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8539 ds_layout_ci.bindingCount = 1;
8540 ds_layout_ci.pBindings = &dsl_binding;
8541
8542 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008543 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008544 ASSERT_VK_SUCCESS(err);
8545
8546 VkDescriptorSet descriptorSet;
8547 VkDescriptorSetAllocateInfo alloc_info = {};
8548 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8549 alloc_info.descriptorSetCount = 1;
8550 alloc_info.descriptorPool = ds_pool;
8551 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008552 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008553 ASSERT_VK_SUCCESS(err);
8554
8555 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8556 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8557 pipeline_layout_ci.setLayoutCount = 1;
8558 pipeline_layout_ci.pSetLayouts = &ds_layout;
8559
8560 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008561 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008562 ASSERT_VK_SUCCESS(err);
8563
8564 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8565 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8566 vp_state_ci.scissorCount = 1;
8567 vp_state_ci.pScissors = NULL;
8568 vp_state_ci.viewportCount = 1;
8569 vp_state_ci.pViewports = NULL;
8570
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008571 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008572 // Set scissor as dynamic to avoid that error
8573 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8574 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8575 dyn_state_ci.dynamicStateCount = 2;
8576 dyn_state_ci.pDynamicStates = dynamic_states;
8577
8578 VkPipelineShaderStageCreateInfo shaderStages[2];
8579 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008581 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8582 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008583 this); // TODO - We shouldn't need a fragment shader
8584 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008585 shaderStages[0] = vs.GetStageCreateInfo();
8586 shaderStages[1] = fs.GetStageCreateInfo();
8587
8588 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8589 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8590 vi_ci.pNext = nullptr;
8591 vi_ci.vertexBindingDescriptionCount = 0;
8592 vi_ci.pVertexBindingDescriptions = nullptr;
8593 vi_ci.vertexAttributeDescriptionCount = 0;
8594 vi_ci.pVertexAttributeDescriptions = nullptr;
8595
8596 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8597 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8598 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8599
8600 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8601 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8602 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008603 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008604
Mark Young47107952016-05-02 15:59:55 -06008605 // Check too low (line width of -1.0f).
8606 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008607
8608 VkPipelineColorBlendAttachmentState att = {};
8609 att.blendEnable = VK_FALSE;
8610 att.colorWriteMask = 0xf;
8611
8612 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8613 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8614 cb_ci.pNext = nullptr;
8615 cb_ci.attachmentCount = 1;
8616 cb_ci.pAttachments = &att;
8617
8618 VkGraphicsPipelineCreateInfo gp_ci = {};
8619 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8620 gp_ci.stageCount = 2;
8621 gp_ci.pStages = shaderStages;
8622 gp_ci.pVertexInputState = &vi_ci;
8623 gp_ci.pInputAssemblyState = &ia_ci;
8624 gp_ci.pViewportState = &vp_state_ci;
8625 gp_ci.pRasterizationState = &rs_ci;
8626 gp_ci.pColorBlendState = &cb_ci;
8627 gp_ci.pDynamicState = &dyn_state_ci;
8628 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8629 gp_ci.layout = pipeline_layout;
8630 gp_ci.renderPass = renderPass();
8631
8632 VkPipelineCacheCreateInfo pc_ci = {};
8633 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8634
8635 VkPipeline pipeline;
8636 VkPipelineCache pipelineCache;
8637
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008638 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008639 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008640 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008641
8642 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008643 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008644
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008646
8647 // Check too high (line width of 65536.0f).
8648 rs_ci.lineWidth = 65536.0f;
8649
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008650 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008651 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008652 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008653
8654 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008655 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008656
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008658
8659 dyn_state_ci.dynamicStateCount = 3;
8660
8661 rs_ci.lineWidth = 1.0f;
8662
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008663 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008664 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008665 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008666 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008667 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008668
8669 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008670 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008671 m_errorMonitor->VerifyFound();
8672
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008674
8675 // Check too high with dynamic setting.
8676 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8677 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008678 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008679
8680 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8681 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8682 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8683 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008684 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008685}
8686
Jeremy Hayes37f0cdd2017-05-04 18:08:49 -06008687TEST_F(VkLayerTest, VALIDATION_ERROR_01407) {
8688 TEST_DESCRIPTION("Test VALIDATION_ERROR_01407: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
8689
8690 ASSERT_NO_FATAL_FAILURE(Init());
8691 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8692
8693 VkPipelineCache pipeline_cache;
8694 {
8695 VkPipelineCacheCreateInfo create_info{};
8696 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8697
8698 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8699 ASSERT_VK_SUCCESS(err);
8700 }
8701
8702 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8703 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8704
8705 VkPipelineShaderStageCreateInfo stages[2]{{}};
8706 stages[0] = vs.GetStageCreateInfo();
8707 stages[1] = fs.GetStageCreateInfo();
8708
8709 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
8710 VkVertexInputBindingDescription vertex_input_binding_description{};
8711 vertex_input_binding_description.binding = m_device->props.limits.maxVertexInputBindings;
8712
8713 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8714 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8715 vertex_input_state.pNext = nullptr;
8716 vertex_input_state.vertexBindingDescriptionCount = 1;
8717 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8718 vertex_input_state.vertexAttributeDescriptionCount = 0;
8719 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8720
8721 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8722 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8723 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8724
8725 VkViewport viewport{};
8726 VkPipelineViewportStateCreateInfo viewport_state{};
8727 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8728 viewport_state.scissorCount = 1;
8729 viewport_state.viewportCount = 1;
8730 viewport_state.pViewports = &viewport;
8731
8732 VkPipelineMultisampleStateCreateInfo multisample_state{};
8733 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8734 multisample_state.pNext = nullptr;
8735 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8736 multisample_state.sampleShadingEnable = 0;
8737 multisample_state.minSampleShading = 1.0;
8738 multisample_state.pSampleMask = nullptr;
8739
8740 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8741 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8742 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8743 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8744 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8745 rasterization_state.depthClampEnable = VK_FALSE;
8746 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8747 rasterization_state.depthBiasEnable = VK_FALSE;
8748
8749 VkPipelineLayout pipeline_layout;
8750 {
8751 VkPipelineLayoutCreateInfo create_info{};
8752 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8753 create_info.setLayoutCount = 0;
8754 create_info.pSetLayouts = nullptr;
8755
8756 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8757 ASSERT_VK_SUCCESS(err);
8758 }
8759
8760 {
8761 VkGraphicsPipelineCreateInfo create_info{};
8762 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8763 create_info.stageCount = 2;
8764 create_info.pStages = stages;
8765 create_info.pVertexInputState = &vertex_input_state;
8766 create_info.pInputAssemblyState = &input_assembly_state;
8767 create_info.pViewportState = &viewport_state;
8768 create_info.pMultisampleState = &multisample_state;
8769 create_info.pRasterizationState = &rasterization_state;
8770 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8771 create_info.layout = pipeline_layout;
8772 create_info.renderPass = renderPass();
8773
8774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01407);
8775 VkPipeline pipeline;
8776 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8777 m_errorMonitor->VerifyFound();
8778 }
8779
8780 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8781 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8782}
8783
8784TEST_F(VkLayerTest, VALIDATION_ERROR_01408) {
8785 TEST_DESCRIPTION(
8786 "Test VALIDATION_ERROR_01408: stride must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride");
8787
8788 ASSERT_NO_FATAL_FAILURE(Init());
8789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8790
8791 VkPipelineCache pipeline_cache;
8792 {
8793 VkPipelineCacheCreateInfo create_info{};
8794 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8795
8796 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8797 ASSERT_VK_SUCCESS(err);
8798 }
8799
8800 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8801 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8802
8803 VkPipelineShaderStageCreateInfo stages[2]{{}};
8804 stages[0] = vs.GetStageCreateInfo();
8805 stages[1] = fs.GetStageCreateInfo();
8806
8807 // Test when stride is greater than VkPhysicalDeviceLimits::maxVertexInputBindingStride.
8808 VkVertexInputBindingDescription vertex_input_binding_description{};
8809 vertex_input_binding_description.stride = m_device->props.limits.maxVertexInputBindingStride + 1;
8810
8811 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8812 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8813 vertex_input_state.pNext = nullptr;
8814 vertex_input_state.vertexBindingDescriptionCount = 1;
8815 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8816 vertex_input_state.vertexAttributeDescriptionCount = 0;
8817 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8818
8819 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8820 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8821 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8822
8823 VkViewport viewport{};
8824 VkPipelineViewportStateCreateInfo viewport_state{};
8825 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8826 viewport_state.scissorCount = 1;
8827 viewport_state.viewportCount = 1;
8828 viewport_state.pViewports = &viewport;
8829
8830 VkPipelineMultisampleStateCreateInfo multisample_state{};
8831 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8832 multisample_state.pNext = nullptr;
8833 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8834 multisample_state.sampleShadingEnable = 0;
8835 multisample_state.minSampleShading = 1.0;
8836 multisample_state.pSampleMask = nullptr;
8837
8838 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8839 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8840 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8841 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8842 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8843 rasterization_state.depthClampEnable = VK_FALSE;
8844 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8845 rasterization_state.depthBiasEnable = VK_FALSE;
8846
8847 VkPipelineLayout pipeline_layout;
8848 {
8849 VkPipelineLayoutCreateInfo create_info{};
8850 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8851 create_info.setLayoutCount = 0;
8852 create_info.pSetLayouts = nullptr;
8853
8854 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8855 ASSERT_VK_SUCCESS(err);
8856 }
8857
8858 {
8859 VkGraphicsPipelineCreateInfo create_info{};
8860 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8861 create_info.stageCount = 2;
8862 create_info.pStages = stages;
8863 create_info.pVertexInputState = &vertex_input_state;
8864 create_info.pInputAssemblyState = &input_assembly_state;
8865 create_info.pViewportState = &viewport_state;
8866 create_info.pMultisampleState = &multisample_state;
8867 create_info.pRasterizationState = &rasterization_state;
8868 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8869 create_info.layout = pipeline_layout;
8870 create_info.renderPass = renderPass();
8871
8872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01408);
8873 VkPipeline pipeline;
8874 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8875 m_errorMonitor->VerifyFound();
8876 }
8877
8878 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8879 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8880}
8881
Jeremy Hayes091e1ab2017-05-04 18:10:28 -06008882TEST_F(VkLayerTest, VALIDATION_ERROR_01410) {
8883 TEST_DESCRIPTION("Test VALIDATION_ERROR_01410: location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes");
8884
8885 ASSERT_NO_FATAL_FAILURE(Init());
8886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8887
8888 VkPipelineCache pipeline_cache;
8889 {
8890 VkPipelineCacheCreateInfo create_info{};
8891 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8892
8893 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8894 ASSERT_VK_SUCCESS(err);
8895 }
8896
8897 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8898 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8899
8900 VkPipelineShaderStageCreateInfo stages[2]{{}};
8901 stages[0] = vs.GetStageCreateInfo();
8902 stages[1] = fs.GetStageCreateInfo();
8903
8904 // Test when location is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes.
8905 VkVertexInputAttributeDescription vertex_input_attribute_description{};
8906 vertex_input_attribute_description.location = m_device->props.limits.maxVertexInputAttributes;
8907
8908 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8909 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8910 vertex_input_state.pNext = nullptr;
8911 vertex_input_state.vertexBindingDescriptionCount = 0;
8912 vertex_input_state.pVertexBindingDescriptions = nullptr;
8913 vertex_input_state.vertexAttributeDescriptionCount = 1;
8914 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
8915
8916 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8917 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8918 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8919
8920 VkViewport viewport{};
8921 VkPipelineViewportStateCreateInfo viewport_state{};
8922 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8923 viewport_state.scissorCount = 1;
8924 viewport_state.viewportCount = 1;
8925 viewport_state.pViewports = &viewport;
8926
8927 VkPipelineMultisampleStateCreateInfo multisample_state{};
8928 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8929 multisample_state.pNext = nullptr;
8930 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8931 multisample_state.sampleShadingEnable = 0;
8932 multisample_state.minSampleShading = 1.0;
8933 multisample_state.pSampleMask = nullptr;
8934
8935 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8936 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8937 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8938 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8939 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8940 rasterization_state.depthClampEnable = VK_FALSE;
8941 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8942 rasterization_state.depthBiasEnable = VK_FALSE;
8943
8944 VkPipelineLayout pipeline_layout;
8945 {
8946 VkPipelineLayoutCreateInfo create_info{};
8947 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8948 create_info.setLayoutCount = 0;
8949 create_info.pSetLayouts = nullptr;
8950
8951 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8952 ASSERT_VK_SUCCESS(err);
8953 }
8954
8955 {
8956 VkGraphicsPipelineCreateInfo create_info{};
8957 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8958 create_info.stageCount = 2;
8959 create_info.pStages = stages;
8960 create_info.pVertexInputState = &vertex_input_state;
8961 create_info.pInputAssemblyState = &input_assembly_state;
8962 create_info.pViewportState = &viewport_state;
8963 create_info.pMultisampleState = &multisample_state;
8964 create_info.pRasterizationState = &rasterization_state;
8965 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8966 create_info.layout = pipeline_layout;
8967 create_info.renderPass = renderPass();
8968
8969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01410);
8970 VkPipeline pipeline;
8971 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8972 m_errorMonitor->VerifyFound();
8973 }
8974
8975 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8976 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8977}
8978
8979TEST_F(VkLayerTest, VALIDATION_ERROR_01411) {
8980 TEST_DESCRIPTION("Test VALIDATION_ERROR_01411: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
8981
8982 ASSERT_NO_FATAL_FAILURE(Init());
8983 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8984
8985 VkPipelineCache pipeline_cache;
8986 {
8987 VkPipelineCacheCreateInfo create_info{};
8988 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8989
8990 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8991 ASSERT_VK_SUCCESS(err);
8992 }
8993
8994 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8995 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8996
8997 VkPipelineShaderStageCreateInfo stages[2]{{}};
8998 stages[0] = vs.GetStageCreateInfo();
8999 stages[1] = fs.GetStageCreateInfo();
9000
9001 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
9002 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9003 vertex_input_attribute_description.binding = m_device->props.limits.maxVertexInputBindings;
9004
9005 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9006 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9007 vertex_input_state.pNext = nullptr;
9008 vertex_input_state.vertexBindingDescriptionCount = 0;
9009 vertex_input_state.pVertexBindingDescriptions = nullptr;
9010 vertex_input_state.vertexAttributeDescriptionCount = 1;
9011 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9012
9013 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9014 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9015 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9016
9017 VkViewport viewport{};
9018 VkPipelineViewportStateCreateInfo viewport_state{};
9019 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9020 viewport_state.scissorCount = 1;
9021 viewport_state.viewportCount = 1;
9022 viewport_state.pViewports = &viewport;
9023
9024 VkPipelineMultisampleStateCreateInfo multisample_state{};
9025 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9026 multisample_state.pNext = nullptr;
9027 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9028 multisample_state.sampleShadingEnable = 0;
9029 multisample_state.minSampleShading = 1.0;
9030 multisample_state.pSampleMask = nullptr;
9031
9032 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9033 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9034 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9035 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9036 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9037 rasterization_state.depthClampEnable = VK_FALSE;
9038 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9039 rasterization_state.depthBiasEnable = VK_FALSE;
9040
9041 VkPipelineLayout pipeline_layout;
9042 {
9043 VkPipelineLayoutCreateInfo create_info{};
9044 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9045 create_info.setLayoutCount = 0;
9046 create_info.pSetLayouts = nullptr;
9047
9048 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9049 ASSERT_VK_SUCCESS(err);
9050 }
9051
9052 {
9053 VkGraphicsPipelineCreateInfo create_info{};
9054 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9055 create_info.stageCount = 2;
9056 create_info.pStages = stages;
9057 create_info.pVertexInputState = &vertex_input_state;
9058 create_info.pInputAssemblyState = &input_assembly_state;
9059 create_info.pViewportState = &viewport_state;
9060 create_info.pMultisampleState = &multisample_state;
9061 create_info.pRasterizationState = &rasterization_state;
9062 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9063 create_info.layout = pipeline_layout;
9064 create_info.renderPass = renderPass();
9065
9066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01411);
9067 VkPipeline pipeline;
9068 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9069 m_errorMonitor->VerifyFound();
9070 }
9071
9072 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9073 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9074}
9075
9076TEST_F(VkLayerTest, VALIDATION_ERROR_01412) {
9077 TEST_DESCRIPTION(
9078 "Test VALIDATION_ERROR_01412: offset must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributeOffset");
9079
9080 ASSERT_NO_FATAL_FAILURE(Init());
9081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9082
9083 VkPipelineCache pipeline_cache;
9084 {
9085 VkPipelineCacheCreateInfo create_info{};
9086 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9087
9088 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
9089 ASSERT_VK_SUCCESS(err);
9090 }
9091
9092 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9093 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9094
9095 VkPipelineShaderStageCreateInfo stages[2]{{}};
9096 stages[0] = vs.GetStageCreateInfo();
9097 stages[1] = fs.GetStageCreateInfo();
9098
9099 // Test when offset is greater than maximum.
9100 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9101 vertex_input_attribute_description.offset = m_device->props.limits.maxVertexInputAttributeOffset + 1;
9102
9103 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9104 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9105 vertex_input_state.pNext = nullptr;
9106 vertex_input_state.vertexBindingDescriptionCount = 0;
9107 vertex_input_state.pVertexBindingDescriptions = nullptr;
9108 vertex_input_state.vertexAttributeDescriptionCount = 1;
9109 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9110
9111 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9112 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9113 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9114
9115 VkViewport viewport{};
9116 VkPipelineViewportStateCreateInfo viewport_state{};
9117 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9118 viewport_state.scissorCount = 1;
9119 viewport_state.viewportCount = 1;
9120 viewport_state.pViewports = &viewport;
9121
9122 VkPipelineMultisampleStateCreateInfo multisample_state{};
9123 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9124 multisample_state.pNext = nullptr;
9125 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9126 multisample_state.sampleShadingEnable = 0;
9127 multisample_state.minSampleShading = 1.0;
9128 multisample_state.pSampleMask = nullptr;
9129
9130 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9131 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9132 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9133 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9134 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9135 rasterization_state.depthClampEnable = VK_FALSE;
9136 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9137 rasterization_state.depthBiasEnable = VK_FALSE;
9138
9139 VkPipelineLayout pipeline_layout;
9140 {
9141 VkPipelineLayoutCreateInfo create_info{};
9142 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9143 create_info.setLayoutCount = 0;
9144 create_info.pSetLayouts = nullptr;
9145
9146 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9147 ASSERT_VK_SUCCESS(err);
9148 }
9149
9150 {
9151 VkGraphicsPipelineCreateInfo create_info{};
9152 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9153 create_info.stageCount = 2;
9154 create_info.pStages = stages;
9155 create_info.pVertexInputState = &vertex_input_state;
9156 create_info.pInputAssemblyState = &input_assembly_state;
9157 create_info.pViewportState = &viewport_state;
9158 create_info.pMultisampleState = &multisample_state;
9159 create_info.pRasterizationState = &rasterization_state;
9160 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9161 create_info.layout = pipeline_layout;
9162 create_info.renderPass = renderPass();
9163
9164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01412);
9165 VkPipeline pipeline;
9166 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9167 m_errorMonitor->VerifyFound();
9168 }
9169
9170 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9171 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9172}
9173
Karl Schultz6addd812016-02-02 17:17:23 -07009174TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009175 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07009177 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009178
Tony Barbour1fa09702017-03-16 12:09:08 -06009179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009181
Tony Barbour552f6c02016-12-21 14:34:07 -07009182 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009183 // Don't care about RenderPass handle b/c error should be flagged before
9184 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009185 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009186
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009187 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009188}
9189
Karl Schultz6addd812016-02-02 17:17:23 -07009190TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009191 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9193 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009194
Tony Barbour1fa09702017-03-16 12:09:08 -06009195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009197
Tony Barbour552f6c02016-12-21 14:34:07 -07009198 m_commandBuffer->BeginCommandBuffer();
9199 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07009200 // Just create a dummy Renderpass that's non-NULL so we can get to the
9201 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009202 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009203
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009204 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009205}
9206
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009207TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009208 TEST_DESCRIPTION(
9209 "Begin a renderPass where clearValueCount is less than"
9210 "the number of renderPass attachments that use loadOp"
9211 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009212
Tony Barbour1fa09702017-03-16 12:09:08 -06009213 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9215
9216 // Create a renderPass with a single attachment that uses loadOp CLEAR
9217 VkAttachmentReference attach = {};
9218 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9219 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009220 subpass.colorAttachmentCount = 1;
9221 subpass.pColorAttachments = &attach;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009222 VkRenderPassCreateInfo rpci = {};
9223 rpci.subpassCount = 1;
9224 rpci.pSubpasses = &subpass;
9225 rpci.attachmentCount = 1;
9226 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07009227 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009228 // Set loadOp to CLEAR
9229 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9230 rpci.pAttachments = &attach_desc;
9231 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9232 VkRenderPass rp;
9233 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9234
9235 VkCommandBufferInheritanceInfo hinfo = {};
9236 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9237 hinfo.renderPass = VK_NULL_HANDLE;
9238 hinfo.subpass = 0;
9239 hinfo.framebuffer = VK_NULL_HANDLE;
9240 hinfo.occlusionQueryEnable = VK_FALSE;
9241 hinfo.queryFlags = 0;
9242 hinfo.pipelineStatistics = 0;
9243 VkCommandBufferBeginInfo info = {};
9244 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9245 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9246 info.pInheritanceInfo = &hinfo;
9247
9248 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9249 VkRenderPassBeginInfo rp_begin = {};
9250 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9251 rp_begin.pNext = NULL;
9252 rp_begin.renderPass = renderPass();
9253 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009254 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009255
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009257
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009258 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009259
9260 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009261
9262 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009263}
9264
Slawomir Cygan0808f392016-11-28 17:53:23 +01009265TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009266 TEST_DESCRIPTION(
9267 "Begin a renderPass where clearValueCount is greater than"
9268 "the number of renderPass attachments that use loadOp"
9269 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009270
Tony Barbour1fa09702017-03-16 12:09:08 -06009271 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01009272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9273
9274 // Create a renderPass with a single attachment that uses loadOp CLEAR
9275 VkAttachmentReference attach = {};
9276 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9277 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009278 subpass.colorAttachmentCount = 1;
9279 subpass.pColorAttachments = &attach;
Slawomir Cygan0808f392016-11-28 17:53:23 +01009280 VkRenderPassCreateInfo rpci = {};
9281 rpci.subpassCount = 1;
9282 rpci.pSubpasses = &subpass;
9283 rpci.attachmentCount = 1;
9284 VkAttachmentDescription attach_desc = {};
9285 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
9286 // Set loadOp to CLEAR
9287 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9288 rpci.pAttachments = &attach_desc;
9289 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9290 VkRenderPass rp;
9291 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9292
9293 VkCommandBufferBeginInfo info = {};
9294 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9295 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9296
9297 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9298 VkRenderPassBeginInfo rp_begin = {};
9299 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9300 rp_begin.pNext = NULL;
9301 rp_begin.renderPass = renderPass();
9302 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009303 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01009304
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
9306 " has a clearValueCount of"
9307 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009308
9309 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
9310
9311 m_errorMonitor->VerifyFound();
9312
9313 vkDestroyRenderPass(m_device->device(), rp, NULL);
9314}
9315
Cody Northrop3bb4d962016-05-09 16:15:57 -06009316TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06009317 TEST_DESCRIPTION("End a command buffer with an active render pass");
9318
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9320 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06009321
Tony Barbour1fa09702017-03-16 12:09:08 -06009322 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009323 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9324
Tony Barbour552f6c02016-12-21 14:34:07 -07009325 m_commandBuffer->BeginCommandBuffer();
9326 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9327 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009328
9329 m_errorMonitor->VerifyFound();
9330
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009331 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9332 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06009333}
9334
Karl Schultz6addd812016-02-02 17:17:23 -07009335TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009336 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9338 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009339
Tony Barbour1fa09702017-03-16 12:09:08 -06009340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009342
Tony Barbour552f6c02016-12-21 14:34:07 -07009343 m_commandBuffer->BeginCommandBuffer();
9344 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009345
9346 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009347 vk_testing::Buffer dstBuffer;
9348 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009349
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009350 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009351
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009352 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009353}
9354
Karl Schultz6addd812016-02-02 17:17:23 -07009355TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009356 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9358 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009359
Tony Barbour1fa09702017-03-16 12:09:08 -06009360 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009362
Tony Barbour552f6c02016-12-21 14:34:07 -07009363 m_commandBuffer->BeginCommandBuffer();
9364 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009365
9366 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009367 vk_testing::Buffer dstBuffer;
9368 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009369
Karl Schultz6addd812016-02-02 17:17:23 -07009370 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07009371 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
9372 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
9373 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009375 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009376}
9377
Karl Schultz6addd812016-02-02 17:17:23 -07009378TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009379 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9381 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009382
Tony Barbour1fa09702017-03-16 12:09:08 -06009383 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009385
Tony Barbour552f6c02016-12-21 14:34:07 -07009386 m_commandBuffer->BeginCommandBuffer();
9387 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009388
Michael Lentine0a369f62016-02-03 16:51:46 -06009389 VkClearColorValue clear_color;
9390 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009391 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9392 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9393 const int32_t tex_width = 32;
9394 const int32_t tex_height = 32;
9395 VkImageCreateInfo image_create_info = {};
9396 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9397 image_create_info.pNext = NULL;
9398 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9399 image_create_info.format = tex_format;
9400 image_create_info.extent.width = tex_width;
9401 image_create_info.extent.height = tex_height;
9402 image_create_info.extent.depth = 1;
9403 image_create_info.mipLevels = 1;
9404 image_create_info.arrayLayers = 1;
9405 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9406 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07009407 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009408
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009409 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009410 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009411
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009412 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009413
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009414 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009415
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009416 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009417}
9418
Karl Schultz6addd812016-02-02 17:17:23 -07009419TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009420 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9422 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009423
Tony Barbour1fa09702017-03-16 12:09:08 -06009424 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009426
Dave Houlton1d2022c2017-03-29 11:43:58 -06009427 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009428 if (!depth_format) {
9429 printf(" No Depth + Stencil format found. Skipped.\n");
9430 return;
9431 }
9432
Tony Barbour552f6c02016-12-21 14:34:07 -07009433 m_commandBuffer->BeginCommandBuffer();
9434 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009435
9436 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009437 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009438 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9439 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07009440 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07009441 image_create_info.extent.width = 64;
9442 image_create_info.extent.height = 64;
9443 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9444 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009445
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009446 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009447 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009449 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009450
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009451 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9452 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009453
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009454 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009455}
9456
Karl Schultz6addd812016-02-02 17:17:23 -07009457TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009458 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009459 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009460
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9462 "vkCmdClearAttachments(): This call "
9463 "must be issued inside an active "
9464 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009465
Tony Barbour1fa09702017-03-16 12:09:08 -06009466 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009468
9469 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009470 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009471 ASSERT_VK_SUCCESS(err);
9472
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009473 VkClearAttachment color_attachment;
9474 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9475 color_attachment.clearValue.color.float32[0] = 0;
9476 color_attachment.clearValue.color.float32[1] = 0;
9477 color_attachment.clearValue.color.float32[2] = 0;
9478 color_attachment.clearValue.color.float32[3] = 0;
9479 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009480 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009481 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009482
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009483 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009484}
9485
Chris Forbes3b97e932016-09-07 11:29:24 +12009486TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009487 TEST_DESCRIPTION(
9488 "Test that an error is produced when CmdNextSubpass is "
9489 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009490
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9492 "vkCmdNextSubpass(): Attempted to advance "
9493 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009494
Tony Barbour1fa09702017-03-16 12:09:08 -06009495 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9497
Tony Barbour552f6c02016-12-21 14:34:07 -07009498 m_commandBuffer->BeginCommandBuffer();
9499 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009500
9501 // error here.
9502 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9503 m_errorMonitor->VerifyFound();
9504
Tony Barbour552f6c02016-12-21 14:34:07 -07009505 m_commandBuffer->EndRenderPass();
9506 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009507}
9508
Chris Forbes6d624702016-09-07 13:57:05 +12009509TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009510 TEST_DESCRIPTION(
9511 "Test that an error is produced when CmdEndRenderPass is "
9512 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009513
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9515 "vkCmdEndRenderPass(): Called before reaching "
9516 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009517
Tony Barbour1fa09702017-03-16 12:09:08 -06009518 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009519 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9520 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009521
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009522 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009523
9524 VkRenderPass rp;
9525 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9526 ASSERT_VK_SUCCESS(err);
9527
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009528 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009529
9530 VkFramebuffer fb;
9531 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9532 ASSERT_VK_SUCCESS(err);
9533
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009534 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009535
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009536 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009537
9538 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9539
9540 // Error here.
9541 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9542 m_errorMonitor->VerifyFound();
9543
9544 // Clean up.
9545 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9546 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9547}
9548
Karl Schultz9e66a292016-04-21 15:57:51 -06009549TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9550 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9552 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009553
Tony Barbour1fa09702017-03-16 12:09:08 -06009554 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009555 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009556
9557 VkBufferMemoryBarrier buf_barrier = {};
9558 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9559 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9560 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9561 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9562 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9563 buf_barrier.buffer = VK_NULL_HANDLE;
9564 buf_barrier.offset = 0;
9565 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009566 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9567 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009568
9569 m_errorMonitor->VerifyFound();
9570}
9571
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009572TEST_F(VkLayerTest, InvalidBarriers) {
9573 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9574
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009576
Tony Barbour1fa09702017-03-16 12:09:08 -06009577 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009578 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009579 if (!depth_format) {
9580 printf(" No Depth + Stencil format found. Skipped.\n");
9581 return;
9582 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009583 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9584
9585 VkMemoryBarrier mem_barrier = {};
9586 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9587 mem_barrier.pNext = NULL;
9588 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9589 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009590 m_commandBuffer->BeginCommandBuffer();
9591 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009592 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009593 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009594 &mem_barrier, 0, nullptr, 0, nullptr);
9595 m_errorMonitor->VerifyFound();
9596
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009598 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009599 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009600 ASSERT_TRUE(image.initialized());
9601 VkImageMemoryBarrier img_barrier = {};
9602 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9603 img_barrier.pNext = NULL;
9604 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9605 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9606 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9607 // New layout can't be UNDEFINED
9608 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9609 img_barrier.image = image.handle();
9610 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9611 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9612 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9613 img_barrier.subresourceRange.baseArrayLayer = 0;
9614 img_barrier.subresourceRange.baseMipLevel = 0;
9615 img_barrier.subresourceRange.layerCount = 1;
9616 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009617 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9618 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009619 m_errorMonitor->VerifyFound();
9620 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9621
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9623 "Subresource must have the sum of the "
9624 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009625 // baseArrayLayer + layerCount must be <= image's arrayLayers
9626 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009627 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9628 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009629 m_errorMonitor->VerifyFound();
9630 img_barrier.subresourceRange.baseArrayLayer = 0;
9631
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009633 // baseMipLevel + levelCount must be <= image's mipLevels
9634 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009635 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9636 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009637 m_errorMonitor->VerifyFound();
9638 img_barrier.subresourceRange.baseMipLevel = 0;
9639
Mike Weiblen7053aa32017-01-25 15:21:10 -07009640 // levelCount must be non-zero.
9641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9642 img_barrier.subresourceRange.levelCount = 0;
9643 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9644 nullptr, 0, nullptr, 1, &img_barrier);
9645 m_errorMonitor->VerifyFound();
9646 img_barrier.subresourceRange.levelCount = 1;
9647
9648 // layerCount must be non-zero.
9649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9650 img_barrier.subresourceRange.layerCount = 0;
9651 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9652 nullptr, 0, nullptr, 1, &img_barrier);
9653 m_errorMonitor->VerifyFound();
9654 img_barrier.subresourceRange.layerCount = 1;
9655
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009656 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 -06009657 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009658 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9659 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009660 VkBufferMemoryBarrier buf_barrier = {};
9661 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9662 buf_barrier.pNext = NULL;
9663 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9664 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9665 buf_barrier.buffer = buffer.handle();
9666 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9667 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9668 buf_barrier.offset = 0;
9669 buf_barrier.size = VK_WHOLE_SIZE;
9670 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009671 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9672 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009673 m_errorMonitor->VerifyFound();
9674 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9675
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009677 buf_barrier.offset = 257;
9678 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009679 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9680 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009681 m_errorMonitor->VerifyFound();
9682 buf_barrier.offset = 0;
9683
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009685 buf_barrier.size = 257;
9686 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009687 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9688 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009689 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009690
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009691 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009694 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009695 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009696 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009697 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9698 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009699 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009700
9701 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009702 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009703 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9704 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009705 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009706
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009707 // Having only one of depth or stencil set for DS image is an error
9708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9709 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9710 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9711 nullptr, 0, nullptr, 1, &img_barrier);
9712 m_errorMonitor->VerifyFound();
9713
9714 // Having anything other than DEPTH and STENCIL is an error
9715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009716 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9717 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9718 nullptr, 0, nullptr, 1, &img_barrier);
9719 m_errorMonitor->VerifyFound();
9720
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009721 // Now test depth-only
9722 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009723 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9724 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009725 VkDepthStencilObj d_image(m_device);
9726 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9727 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009728 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009729 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009730 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009731
9732 // DEPTH bit must be set
9733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9734 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009735 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009736 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9737 0, nullptr, 0, nullptr, 1, &img_barrier);
9738 m_errorMonitor->VerifyFound();
9739
9740 // No bits other than DEPTH may be set
9741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9742 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9743 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009744 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9745 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009746 m_errorMonitor->VerifyFound();
9747 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009748
9749 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009750 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9751 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009752 VkDepthStencilObj s_image(m_device);
9753 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9754 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009755 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009756 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009757 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009758 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9760 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009761 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009762 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9763 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009764 m_errorMonitor->VerifyFound();
9765 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009766
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009767 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009768 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009769 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 -06009770 ASSERT_TRUE(c_image.initialized());
9771 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9772 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9773 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009774
9775 // COLOR bit must be set
9776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9777 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009778 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009779 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9780 nullptr, 0, nullptr, 1, &img_barrier);
9781 m_errorMonitor->VerifyFound();
9782
9783 // No bits other than COLOR may be set
9784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9785 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9786 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009787 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9788 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009789 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009790
Mike Weiblene6e01172017-03-07 22:18:40 -07009791 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9792 {
9793 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009794 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 -07009795 ASSERT_TRUE(img_color.initialized());
9796
9797 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009798 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 -07009799 ASSERT_TRUE(img_ds.initialized());
9800
9801 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009802 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 -07009803 ASSERT_TRUE(img_xfer_src.initialized());
9804
9805 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009806 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 -07009807 ASSERT_TRUE(img_xfer_dst.initialized());
9808
9809 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009810 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 -07009811 ASSERT_TRUE(img_sampled.initialized());
9812
9813 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009814 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 -07009815 ASSERT_TRUE(img_input.initialized());
9816
9817 const struct {
9818 VkImageObj &image_obj;
9819 VkImageLayout bad_layout;
9820 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9821 } bad_buffer_layouts[] = {
9822 // clang-format off
9823 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9824 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9825 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9826 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9827 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9828 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9829 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9830 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9831 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9832 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9833 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9834 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9835 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9836 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9837 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9838 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9839 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9840 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9841 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9842 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9843 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9844 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9845 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9846 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9847 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9848 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9849 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9850 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9851 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9852 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9853 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9854 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9855 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9856 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9857 // clang-format on
9858 };
9859 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9860
9861 for (uint32_t i = 0; i < layout_count; ++i) {
9862 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9863 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9864 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9865 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9866 : VK_IMAGE_ASPECT_COLOR_BIT;
9867
9868 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9869 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9871 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9872 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9873 m_errorMonitor->VerifyFound();
9874
9875 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9876 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9878 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9879 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9880 m_errorMonitor->VerifyFound();
9881 }
9882
9883 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9884 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9885 }
9886
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009887 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9888
9889 // Create command pool with incompatible queueflags
9890 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009891 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009892 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009893 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009894 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009895 }
9896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9897
9898 VkCommandPool command_pool;
9899 VkCommandPoolCreateInfo pool_create_info{};
9900 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9901 pool_create_info.queueFamilyIndex = queue_family_index;
9902 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9903 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9904
9905 // Allocate a command buffer
9906 VkCommandBuffer bad_command_buffer;
9907 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9908 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9909 command_buffer_allocate_info.commandPool = command_pool;
9910 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9911 command_buffer_allocate_info.commandBufferCount = 1;
9912 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9913
9914 VkCommandBufferBeginInfo cbbi = {};
9915 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9916 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9917 buf_barrier.offset = 0;
9918 buf_barrier.size = VK_WHOLE_SIZE;
9919 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9920 &buf_barrier, 0, nullptr);
9921 m_errorMonitor->VerifyFound();
9922
9923 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9924 vkEndCommandBuffer(bad_command_buffer);
9925 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009926 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009927 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009928 }
9929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9930 VkEvent event;
9931 VkEventCreateInfo event_create_info{};
9932 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9933 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9934 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9935 nullptr, 0, nullptr);
9936 m_errorMonitor->VerifyFound();
9937
9938 vkEndCommandBuffer(bad_command_buffer);
9939 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009940}
9941
Chris Forbes50223732017-05-01 09:43:35 -07009942TEST_F(VkPositiveLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9943 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ
9944 // in srcAccessMask.
Tony Barbour18ba25c2016-09-29 13:42:40 -06009945
Chris Forbes50223732017-05-01 09:43:35 -07009946 // The required behavior here was a bit unclear in earlier versions of the
9947 // spec, but there is no memory dependency required here, so this should
9948 // work without warnings.
9949
9950 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -06009951 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009952 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009953 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 -07009954 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009955 ASSERT_TRUE(image.initialized());
9956
9957 VkImageMemoryBarrier barrier = {};
9958 VkImageSubresourceRange range;
9959 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009960 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
Chris Forbes50223732017-05-01 09:43:35 -07009961 barrier.dstAccessMask = 0;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009962 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9963 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9964 barrier.image = image.handle();
9965 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9966 range.baseMipLevel = 0;
9967 range.levelCount = 1;
9968 range.baseArrayLayer = 0;
9969 range.layerCount = 1;
9970 barrier.subresourceRange = range;
9971 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9972 cmdbuf.BeginCommandBuffer();
9973 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9974 &barrier);
9975 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9976 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9977 barrier.srcAccessMask = 0;
9978 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9979 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9980 &barrier);
9981
Chris Forbes50223732017-05-01 09:43:35 -07009982 m_errorMonitor->VerifyNotFound();
Tony Barbour18ba25c2016-09-29 13:42:40 -06009983}
9984
Karl Schultz6addd812016-02-02 17:17:23 -07009985TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009986 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009987 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009989
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009990 uint32_t const indices[] = {0};
9991 VkBufferCreateInfo buf_info = {};
9992 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9993 buf_info.size = 1024;
9994 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9995 buf_info.queueFamilyIndexCount = 1;
9996 buf_info.pQueueFamilyIndices = indices;
9997
9998 VkBuffer buffer;
9999 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
10000 ASSERT_VK_SUCCESS(err);
10001
10002 VkMemoryRequirements requirements;
10003 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
10004
10005 VkMemoryAllocateInfo alloc_info{};
10006 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10007 alloc_info.pNext = NULL;
10008 alloc_info.memoryTypeIndex = 0;
10009 alloc_info.allocationSize = requirements.size;
10010 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
10011 ASSERT_TRUE(pass);
10012
10013 VkDeviceMemory memory;
10014 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
10015 ASSERT_VK_SUCCESS(err);
10016
10017 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010018 ASSERT_VK_SUCCESS(err);
10019
Tony Barbour552f6c02016-12-21 14:34:07 -070010020 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010021 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010022
Karl Schultz6addd812016-02-02 17:17:23 -070010023 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10024 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010025 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10027 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010028 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010029
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010030 vkFreeMemory(m_device->device(), memory, NULL);
10031 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010032}
10033
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010034TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10035 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -060010036 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10038 VkBufferCreateInfo buffCI = {};
10039 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10040 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010041 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010042 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010043 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010044 uint32_t qfi[2];
10045 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010046 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010047
10048 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010049 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010050
10051 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10053 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
10054 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010055 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010056 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010057
10058 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -070010059 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
10061
10062 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
10063 buffCI.queueFamilyIndexCount = 2;
10064 qfi[0] = 1;
10065 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -070010066 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010067 VkDeviceMemory mem;
10068 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -070010069 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010070
10071 VkMemoryAllocateInfo alloc_info = {};
10072 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10073 alloc_info.allocationSize = 1024;
10074 bool pass = false;
10075 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
10076 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -070010077 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010078 return;
10079 }
10080 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -070010081 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010082
10083 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -070010084 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010085 m_commandBuffer->end();
10086 QueueCommandBuffer(false);
10087 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -070010088 vkDestroyBuffer(m_device->device(), ib2, NULL);
10089 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010090 }
10091
Tony Barbourdf4c0042016-06-01 15:55:43 -060010092 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010093}
10094
Karl Schultz6addd812016-02-02 17:17:23 -070010095TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010096 TEST_DESCRIPTION(
10097 "Attempt vkCmdExecuteCommands with a primary command buffer"
10098 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010099
Tony Barbour1fa09702017-03-16 12:09:08 -060010100 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010101 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010102
Chris Forbesf29a84f2016-10-06 18:39:28 +130010103 // An empty primary command buffer
10104 VkCommandBufferObj cb(m_device, m_commandPool);
10105 cb.BeginCommandBuffer();
10106 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010107
Chris Forbesf29a84f2016-10-06 18:39:28 +130010108 m_commandBuffer->BeginCommandBuffer();
10109 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10110 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010111
Chris Forbesf29a84f2016-10-06 18:39:28 +130010112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
10113 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010114 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070010115
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060010116 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010117}
10118
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010119TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010120 TEST_DESCRIPTION(
10121 "Attempt to update descriptor sets for images and buffers "
10122 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010123 VkResult err;
10124
Tony Barbour1fa09702017-03-16 12:09:08 -060010125 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010126 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10127 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10128 ds_type_count[i].type = VkDescriptorType(i);
10129 ds_type_count[i].descriptorCount = 1;
10130 }
10131 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10132 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10133 ds_pool_ci.pNext = NULL;
10134 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10135 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10136 ds_pool_ci.pPoolSizes = ds_type_count;
10137
10138 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010139 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010140 ASSERT_VK_SUCCESS(err);
10141
10142 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010143 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010144 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10145 dsl_binding[i].binding = 0;
10146 dsl_binding[i].descriptorType = VkDescriptorType(i);
10147 dsl_binding[i].descriptorCount = 1;
10148 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10149 dsl_binding[i].pImmutableSamplers = NULL;
10150 }
10151
10152 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10153 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10154 ds_layout_ci.pNext = NULL;
10155 ds_layout_ci.bindingCount = 1;
10156 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10157 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10158 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010159 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010160 ASSERT_VK_SUCCESS(err);
10161 }
10162 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10163 VkDescriptorSetAllocateInfo alloc_info = {};
10164 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10165 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10166 alloc_info.descriptorPool = ds_pool;
10167 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010168 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010169 ASSERT_VK_SUCCESS(err);
10170
10171 // Create a buffer & bufferView to be used for invalid updates
10172 VkBufferCreateInfo buff_ci = {};
10173 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -070010174 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010175 buff_ci.size = 256;
10176 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -070010177 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010178 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10179 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -070010180
10181 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
10182 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
10183 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
10184 ASSERT_VK_SUCCESS(err);
10185
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010186 VkMemoryRequirements mem_reqs;
10187 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10188 VkMemoryAllocateInfo mem_alloc_info = {};
10189 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10190 mem_alloc_info.pNext = NULL;
10191 mem_alloc_info.memoryTypeIndex = 0;
10192 mem_alloc_info.allocationSize = mem_reqs.size;
10193 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10194 if (!pass) {
10195 vkDestroyBuffer(m_device->device(), buffer, NULL);
10196 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10197 return;
10198 }
10199 VkDeviceMemory mem;
10200 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
10201 ASSERT_VK_SUCCESS(err);
10202 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10203 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010204
10205 VkBufferViewCreateInfo buff_view_ci = {};
10206 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10207 buff_view_ci.buffer = buffer;
10208 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10209 buff_view_ci.range = VK_WHOLE_SIZE;
10210 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010211 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010212 ASSERT_VK_SUCCESS(err);
10213
Tony Barbour415497c2017-01-24 10:06:09 -070010214 // Now get resources / view for storage_texel_buffer
10215 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
10216 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10217 if (!pass) {
10218 vkDestroyBuffer(m_device->device(), buffer, NULL);
10219 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10220 vkFreeMemory(m_device->device(), mem, NULL);
10221 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
10222 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10223 return;
10224 }
10225 VkDeviceMemory storage_texel_buffer_mem;
10226 VkBufferView storage_texel_buffer_view;
10227 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
10228 ASSERT_VK_SUCCESS(err);
10229 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
10230 ASSERT_VK_SUCCESS(err);
10231 buff_view_ci.buffer = storage_texel_buffer;
10232 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
10233 ASSERT_VK_SUCCESS(err);
10234
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010235 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -070010236 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010237 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -070010238 image_ci.format = VK_FORMAT_UNDEFINED;
10239 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
10240 VkFormat format = static_cast<VkFormat>(f);
10241 VkFormatProperties fProps = m_device->format_properties(format);
10242 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10243 image_ci.format = format;
10244 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10245 break;
10246 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10247 image_ci.format = format;
10248 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
10249 break;
10250 }
10251 }
10252 if (image_ci.format == VK_FORMAT_UNDEFINED) {
10253 return;
10254 }
10255
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010256 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10257 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010258 image_ci.extent.width = 64;
10259 image_ci.extent.height = 64;
10260 image_ci.extent.depth = 1;
10261 image_ci.mipLevels = 1;
10262 image_ci.arrayLayers = 1;
10263 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010264 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010265 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010266 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10267 VkImage image;
10268 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10269 ASSERT_VK_SUCCESS(err);
10270 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010271 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010272
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010273 VkMemoryAllocateInfo mem_alloc = {};
10274 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10275 mem_alloc.pNext = NULL;
10276 mem_alloc.allocationSize = 0;
10277 mem_alloc.memoryTypeIndex = 0;
10278 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10279 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010280 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010281 ASSERT_TRUE(pass);
10282 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10283 ASSERT_VK_SUCCESS(err);
10284 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10285 ASSERT_VK_SUCCESS(err);
10286 // Now create view for image
10287 VkImageViewCreateInfo image_view_ci = {};
10288 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10289 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010290 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010291 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10292 image_view_ci.subresourceRange.layerCount = 1;
10293 image_view_ci.subresourceRange.baseArrayLayer = 0;
10294 image_view_ci.subresourceRange.levelCount = 1;
10295 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10296 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010297 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010298 ASSERT_VK_SUCCESS(err);
10299
10300 VkDescriptorBufferInfo buff_info = {};
10301 buff_info.buffer = buffer;
10302 VkDescriptorImageInfo img_info = {};
10303 img_info.imageView = image_view;
10304 VkWriteDescriptorSet descriptor_write = {};
10305 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10306 descriptor_write.dstBinding = 0;
10307 descriptor_write.descriptorCount = 1;
10308 descriptor_write.pTexelBufferView = &buff_view;
10309 descriptor_write.pBufferInfo = &buff_info;
10310 descriptor_write.pImageInfo = &img_info;
10311
10312 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010313 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010314 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
10315 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
10316 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
10317 VALIDATION_ERROR_00943, // STORAGE_IMAGE
10318 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
10319 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
10320 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
10321 VALIDATION_ERROR_00947, // STORAGE_BUFFER
10322 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
10323 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
10324 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010325 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010326 // Start loop at 1 as SAMPLER desc type has no usage bit error
10327 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -070010328 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10329 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
10330 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
10331 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010332 descriptor_write.descriptorType = VkDescriptorType(i);
10333 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010335
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010336 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010337
10338 m_errorMonitor->VerifyFound();
10339 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010340 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10341 descriptor_write.pTexelBufferView = &buff_view;
10342 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010343 }
Tony Barbour415497c2017-01-24 10:06:09 -070010344
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010345 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10346 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010347 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010348 vkDestroyImageView(m_device->device(), image_view, NULL);
10349 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010350 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010351 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010352 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010353 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010354 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010355 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10356}
10357
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010358TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010359 TEST_DESCRIPTION(
10360 "Attempt to update buffer descriptor set that has incorrect "
10361 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010362 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010363 "2. range value of 0\n"
10364 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010365 VkResult err;
10366
Tony Barbour1fa09702017-03-16 12:09:08 -060010367 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010368 VkDescriptorPoolSize ds_type_count = {};
10369 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10370 ds_type_count.descriptorCount = 1;
10371
10372 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10373 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10374 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010375 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010376 ds_pool_ci.maxSets = 1;
10377 ds_pool_ci.poolSizeCount = 1;
10378 ds_pool_ci.pPoolSizes = &ds_type_count;
10379
10380 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010381 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010382 ASSERT_VK_SUCCESS(err);
10383
10384 // Create layout with single uniform buffer descriptor
10385 VkDescriptorSetLayoutBinding dsl_binding = {};
10386 dsl_binding.binding = 0;
10387 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10388 dsl_binding.descriptorCount = 1;
10389 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10390 dsl_binding.pImmutableSamplers = NULL;
10391
10392 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10393 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10394 ds_layout_ci.pNext = NULL;
10395 ds_layout_ci.bindingCount = 1;
10396 ds_layout_ci.pBindings = &dsl_binding;
10397 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010398 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010399 ASSERT_VK_SUCCESS(err);
10400
10401 VkDescriptorSet descriptor_set = {};
10402 VkDescriptorSetAllocateInfo alloc_info = {};
10403 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10404 alloc_info.descriptorSetCount = 1;
10405 alloc_info.descriptorPool = ds_pool;
10406 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010407 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010408 ASSERT_VK_SUCCESS(err);
10409
10410 // Create a buffer to be used for invalid updates
10411 VkBufferCreateInfo buff_ci = {};
10412 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10413 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010414 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010415 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10416 VkBuffer buffer;
10417 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10418 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010419
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010420 // Have to bind memory to buffer before descriptor update
10421 VkMemoryAllocateInfo mem_alloc = {};
10422 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10423 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010424 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010425 mem_alloc.memoryTypeIndex = 0;
10426
10427 VkMemoryRequirements mem_reqs;
10428 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010429 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010430 if (!pass) {
10431 vkDestroyBuffer(m_device->device(), buffer, NULL);
10432 return;
10433 }
10434
10435 VkDeviceMemory mem;
10436 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10437 ASSERT_VK_SUCCESS(err);
10438 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10439 ASSERT_VK_SUCCESS(err);
10440
10441 VkDescriptorBufferInfo buff_info = {};
10442 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010443 // Cause error due to offset out of range
10444 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010445 buff_info.range = VK_WHOLE_SIZE;
10446 VkWriteDescriptorSet descriptor_write = {};
10447 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10448 descriptor_write.dstBinding = 0;
10449 descriptor_write.descriptorCount = 1;
10450 descriptor_write.pTexelBufferView = nullptr;
10451 descriptor_write.pBufferInfo = &buff_info;
10452 descriptor_write.pImageInfo = nullptr;
10453
10454 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10455 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010457
10458 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10459
10460 m_errorMonitor->VerifyFound();
10461 // Now cause error due to range of 0
10462 buff_info.offset = 0;
10463 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010465
10466 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10467
10468 m_errorMonitor->VerifyFound();
10469 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010470 buff_info.offset = 0;
10471 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010473
10474 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10475
10476 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010477 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010478 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10479 vkDestroyBuffer(m_device->device(), buffer, NULL);
10480 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10481 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10482}
10483
Tobin Ehlis845887e2017-02-02 19:01:44 -070010484TEST_F(VkLayerTest, DSBufferLimitErrors) {
10485 TEST_DESCRIPTION(
10486 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10487 "Test cases include:\n"
10488 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10489 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10490 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10491 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10492 VkResult err;
10493
Tony Barbour1fa09702017-03-16 12:09:08 -060010494 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010495 VkDescriptorPoolSize ds_type_count[2] = {};
10496 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10497 ds_type_count[0].descriptorCount = 1;
10498 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10499 ds_type_count[1].descriptorCount = 1;
10500
10501 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10502 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10503 ds_pool_ci.pNext = NULL;
10504 ds_pool_ci.maxSets = 1;
10505 ds_pool_ci.poolSizeCount = 2;
10506 ds_pool_ci.pPoolSizes = ds_type_count;
10507
10508 VkDescriptorPool ds_pool;
10509 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10510 ASSERT_VK_SUCCESS(err);
10511
10512 // Create layout with single uniform buffer & single storage buffer descriptor
10513 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10514 dsl_binding[0].binding = 0;
10515 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10516 dsl_binding[0].descriptorCount = 1;
10517 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10518 dsl_binding[0].pImmutableSamplers = NULL;
10519 dsl_binding[1].binding = 1;
10520 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10521 dsl_binding[1].descriptorCount = 1;
10522 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10523 dsl_binding[1].pImmutableSamplers = NULL;
10524
10525 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10526 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10527 ds_layout_ci.pNext = NULL;
10528 ds_layout_ci.bindingCount = 2;
10529 ds_layout_ci.pBindings = dsl_binding;
10530 VkDescriptorSetLayout ds_layout;
10531 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10532 ASSERT_VK_SUCCESS(err);
10533
10534 VkDescriptorSet descriptor_set = {};
10535 VkDescriptorSetAllocateInfo alloc_info = {};
10536 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10537 alloc_info.descriptorSetCount = 1;
10538 alloc_info.descriptorPool = ds_pool;
10539 alloc_info.pSetLayouts = &ds_layout;
10540 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10541 ASSERT_VK_SUCCESS(err);
10542
10543 // Create a buffer to be used for invalid updates
10544 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10545 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10546 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10547 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10548 VkBufferCreateInfo ub_ci = {};
10549 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10550 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10551 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10552 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10553 VkBuffer uniform_buffer;
10554 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10555 ASSERT_VK_SUCCESS(err);
10556 VkBufferCreateInfo sb_ci = {};
10557 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10558 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10559 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10560 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10561 VkBuffer storage_buffer;
10562 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10563 ASSERT_VK_SUCCESS(err);
10564 // Have to bind memory to buffer before descriptor update
10565 VkMemoryAllocateInfo mem_alloc = {};
10566 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10567 mem_alloc.pNext = NULL;
10568 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10569 mem_alloc.memoryTypeIndex = 0;
10570
Cort Stratton77a0d592017-02-17 13:14:13 -080010571 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10572 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10573 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10574 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10575 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010576 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010577 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010578 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010579 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10580 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010581 return;
10582 }
10583
10584 VkDeviceMemory mem;
10585 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010586 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010587 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010588 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10589 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10590 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10591 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10592 return;
10593 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010594 ASSERT_VK_SUCCESS(err);
10595 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10596 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010597 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010598 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10599 ASSERT_VK_SUCCESS(err);
10600
10601 VkDescriptorBufferInfo buff_info = {};
10602 buff_info.buffer = uniform_buffer;
10603 buff_info.range = ub_ci.size; // This will exceed limit
10604 VkWriteDescriptorSet descriptor_write = {};
10605 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10606 descriptor_write.dstBinding = 0;
10607 descriptor_write.descriptorCount = 1;
10608 descriptor_write.pTexelBufferView = nullptr;
10609 descriptor_write.pBufferInfo = &buff_info;
10610 descriptor_write.pImageInfo = nullptr;
10611
10612 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10613 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010614 if (max_ub_range != UINT32_MAX) {
10615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10616 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10617 m_errorMonitor->VerifyFound();
10618 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010619 // Reduce size of range to acceptable limit & cause offset error
10620 buff_info.range = max_ub_range;
10621 buff_info.offset = min_ub_align - 1;
10622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10623 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10624 m_errorMonitor->VerifyFound();
10625
10626 // Now break storage updates
10627 buff_info.buffer = storage_buffer;
10628 buff_info.range = sb_ci.size; // This will exceed limit
10629 buff_info.offset = 0; // Reset offset for this update
10630
10631 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10632 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010633 if (max_ub_range != UINT32_MAX) {
10634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10635 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10636 m_errorMonitor->VerifyFound();
10637 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010638
10639 // Reduce size of range to acceptable limit & cause offset error
10640 buff_info.range = max_sb_range;
10641 buff_info.offset = min_sb_align - 1;
10642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10643 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10644 m_errorMonitor->VerifyFound();
10645
10646 vkFreeMemory(m_device->device(), mem, NULL);
10647 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10648 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10649 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10650 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10651}
10652
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010653TEST_F(VkLayerTest, DSAspectBitsErrors) {
10654 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10655 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010656 TEST_DESCRIPTION(
10657 "Attempt to update descriptor sets for images "
10658 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010659 VkResult err;
10660
Tony Barbour1fa09702017-03-16 12:09:08 -060010661 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010662 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010663 if (!depth_format) {
10664 printf(" No Depth + Stencil format found. Skipped.\n");
10665 return;
10666 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010667 VkDescriptorPoolSize ds_type_count = {};
10668 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10669 ds_type_count.descriptorCount = 1;
10670
10671 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10672 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10673 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010674 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010675 ds_pool_ci.maxSets = 5;
10676 ds_pool_ci.poolSizeCount = 1;
10677 ds_pool_ci.pPoolSizes = &ds_type_count;
10678
10679 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010680 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010681 ASSERT_VK_SUCCESS(err);
10682
10683 VkDescriptorSetLayoutBinding dsl_binding = {};
10684 dsl_binding.binding = 0;
10685 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10686 dsl_binding.descriptorCount = 1;
10687 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10688 dsl_binding.pImmutableSamplers = NULL;
10689
10690 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10691 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10692 ds_layout_ci.pNext = NULL;
10693 ds_layout_ci.bindingCount = 1;
10694 ds_layout_ci.pBindings = &dsl_binding;
10695 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010696 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010697 ASSERT_VK_SUCCESS(err);
10698
10699 VkDescriptorSet descriptor_set = {};
10700 VkDescriptorSetAllocateInfo alloc_info = {};
10701 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10702 alloc_info.descriptorSetCount = 1;
10703 alloc_info.descriptorPool = ds_pool;
10704 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010705 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010706 ASSERT_VK_SUCCESS(err);
10707
10708 // Create an image to be used for invalid updates
10709 VkImageCreateInfo image_ci = {};
10710 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10711 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010712 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010713 image_ci.extent.width = 64;
10714 image_ci.extent.height = 64;
10715 image_ci.extent.depth = 1;
10716 image_ci.mipLevels = 1;
10717 image_ci.arrayLayers = 1;
10718 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010719 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010720 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10721 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10722 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10723 VkImage image;
10724 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10725 ASSERT_VK_SUCCESS(err);
10726 // Bind memory to image
10727 VkMemoryRequirements mem_reqs;
10728 VkDeviceMemory image_mem;
10729 bool pass;
10730 VkMemoryAllocateInfo mem_alloc = {};
10731 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10732 mem_alloc.pNext = NULL;
10733 mem_alloc.allocationSize = 0;
10734 mem_alloc.memoryTypeIndex = 0;
10735 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10736 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010737 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010738 ASSERT_TRUE(pass);
10739 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10740 ASSERT_VK_SUCCESS(err);
10741 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10742 ASSERT_VK_SUCCESS(err);
10743 // Now create view for image
10744 VkImageViewCreateInfo image_view_ci = {};
10745 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10746 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010747 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010748 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10749 image_view_ci.subresourceRange.layerCount = 1;
10750 image_view_ci.subresourceRange.baseArrayLayer = 0;
10751 image_view_ci.subresourceRange.levelCount = 1;
10752 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010753 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010754
10755 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010756 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010757 ASSERT_VK_SUCCESS(err);
10758
10759 VkDescriptorImageInfo img_info = {};
10760 img_info.imageView = image_view;
10761 VkWriteDescriptorSet descriptor_write = {};
10762 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10763 descriptor_write.dstBinding = 0;
10764 descriptor_write.descriptorCount = 1;
10765 descriptor_write.pTexelBufferView = NULL;
10766 descriptor_write.pBufferInfo = NULL;
10767 descriptor_write.pImageInfo = &img_info;
10768 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10769 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010770 const char *error_msg =
10771 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10772 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010774
10775 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10776
10777 m_errorMonitor->VerifyFound();
10778 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10779 vkDestroyImage(m_device->device(), image, NULL);
10780 vkFreeMemory(m_device->device(), image_mem, NULL);
10781 vkDestroyImageView(m_device->device(), image_view, NULL);
10782 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10783 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10784}
10785
Karl Schultz6addd812016-02-02 17:17:23 -070010786TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010787 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010788 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010789
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10791 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10792 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010793
Tony Barbour1fa09702017-03-16 12:09:08 -060010794 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010795 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010796 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010797 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10798 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010799
10800 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010801 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10802 ds_pool_ci.pNext = NULL;
10803 ds_pool_ci.maxSets = 1;
10804 ds_pool_ci.poolSizeCount = 1;
10805 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010806
Tobin Ehlis3b780662015-05-28 12:11:26 -060010807 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010808 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010809 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010810 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010811 dsl_binding.binding = 0;
10812 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10813 dsl_binding.descriptorCount = 1;
10814 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10815 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010816
Tony Barboureb254902015-07-15 12:50:33 -060010817 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010818 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10819 ds_layout_ci.pNext = NULL;
10820 ds_layout_ci.bindingCount = 1;
10821 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010822
Tobin Ehlis3b780662015-05-28 12:11:26 -060010823 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010824 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010825 ASSERT_VK_SUCCESS(err);
10826
10827 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010828 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010829 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010830 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010831 alloc_info.descriptorPool = ds_pool;
10832 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010833 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010834 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010835
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010836 VkSamplerCreateInfo sampler_ci = {};
10837 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10838 sampler_ci.pNext = NULL;
10839 sampler_ci.magFilter = VK_FILTER_NEAREST;
10840 sampler_ci.minFilter = VK_FILTER_NEAREST;
10841 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10842 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10843 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10844 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10845 sampler_ci.mipLodBias = 1.0;
10846 sampler_ci.anisotropyEnable = VK_FALSE;
10847 sampler_ci.maxAnisotropy = 1;
10848 sampler_ci.compareEnable = VK_FALSE;
10849 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10850 sampler_ci.minLod = 1.0;
10851 sampler_ci.maxLod = 1.0;
10852 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10853 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10854 VkSampler sampler;
10855 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10856 ASSERT_VK_SUCCESS(err);
10857
10858 VkDescriptorImageInfo info = {};
10859 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010860
10861 VkWriteDescriptorSet descriptor_write;
10862 memset(&descriptor_write, 0, sizeof(descriptor_write));
10863 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010864 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010865 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010866 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010867 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010868 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010869
10870 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10871
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010872 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010873
Chia-I Wuf7458c52015-10-26 21:10:41 +080010874 vkDestroySampler(m_device->device(), sampler, NULL);
10875 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10876 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010877}
10878
Karl Schultz6addd812016-02-02 17:17:23 -070010879TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010880 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010881 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010882
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010884
Tony Barbour1fa09702017-03-16 12:09:08 -060010885 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010886 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010887 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010888 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10889 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010890
10891 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010892 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10893 ds_pool_ci.pNext = NULL;
10894 ds_pool_ci.maxSets = 1;
10895 ds_pool_ci.poolSizeCount = 1;
10896 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010897
Tobin Ehlis3b780662015-05-28 12:11:26 -060010898 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010899 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010900 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010901
Tony Barboureb254902015-07-15 12:50:33 -060010902 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010903 dsl_binding.binding = 0;
10904 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10905 dsl_binding.descriptorCount = 1;
10906 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10907 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010908
10909 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010910 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10911 ds_layout_ci.pNext = NULL;
10912 ds_layout_ci.bindingCount = 1;
10913 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010914
Tobin Ehlis3b780662015-05-28 12:11:26 -060010915 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010916 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010917 ASSERT_VK_SUCCESS(err);
10918
10919 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010920 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010921 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010922 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010923 alloc_info.descriptorPool = ds_pool;
10924 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010925 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010926 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010927
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010928 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10929
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010930 // Correctly update descriptor to avoid "NOT_UPDATED" error
10931 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010932 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010933 buff_info.offset = 0;
10934 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010935
10936 VkWriteDescriptorSet descriptor_write;
10937 memset(&descriptor_write, 0, sizeof(descriptor_write));
10938 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010939 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010940 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010941 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010942 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10943 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010944
10945 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10946
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010947 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010948
Chia-I Wuf7458c52015-10-26 21:10:41 +080010949 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10950 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010951}
10952
Karl Schultz6addd812016-02-02 17:17:23 -070010953TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010954 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010955 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010956
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010958
Tony Barbour1fa09702017-03-16 12:09:08 -060010959 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010960 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010961 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010962 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10963 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010964
10965 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010966 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10967 ds_pool_ci.pNext = NULL;
10968 ds_pool_ci.maxSets = 1;
10969 ds_pool_ci.poolSizeCount = 1;
10970 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010971
Tobin Ehlis3b780662015-05-28 12:11:26 -060010972 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010973 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010974 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010975
Tony Barboureb254902015-07-15 12:50:33 -060010976 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010977 dsl_binding.binding = 0;
10978 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10979 dsl_binding.descriptorCount = 1;
10980 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10981 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010982
10983 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010984 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10985 ds_layout_ci.pNext = NULL;
10986 ds_layout_ci.bindingCount = 1;
10987 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010988 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010989 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010990 ASSERT_VK_SUCCESS(err);
10991
10992 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010993 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010994 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010995 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010996 alloc_info.descriptorPool = ds_pool;
10997 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010998 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010999 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011000
Tony Barboureb254902015-07-15 12:50:33 -060011001 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011002 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11003 sampler_ci.pNext = NULL;
11004 sampler_ci.magFilter = VK_FILTER_NEAREST;
11005 sampler_ci.minFilter = VK_FILTER_NEAREST;
11006 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11007 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11008 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11009 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11010 sampler_ci.mipLodBias = 1.0;
11011 sampler_ci.anisotropyEnable = VK_FALSE;
11012 sampler_ci.maxAnisotropy = 1;
11013 sampler_ci.compareEnable = VK_FALSE;
11014 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11015 sampler_ci.minLod = 1.0;
11016 sampler_ci.maxLod = 1.0;
11017 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11018 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011019
Tobin Ehlis3b780662015-05-28 12:11:26 -060011020 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011021 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011022 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011023
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011024 VkDescriptorImageInfo info = {};
11025 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011026
11027 VkWriteDescriptorSet descriptor_write;
11028 memset(&descriptor_write, 0, sizeof(descriptor_write));
11029 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011030 descriptor_write.dstSet = descriptorSet;
11031 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011032 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011033 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011034 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011035 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011036
11037 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11038
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011039 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011040
Chia-I Wuf7458c52015-10-26 21:10:41 +080011041 vkDestroySampler(m_device->device(), sampler, NULL);
11042 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11043 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011044}
11045
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011046TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
11047 // Create layout w/ empty binding and attempt to update it
11048 VkResult err;
11049
Tony Barbour1fa09702017-03-16 12:09:08 -060011050 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011051
11052 VkDescriptorPoolSize ds_type_count = {};
11053 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11054 ds_type_count.descriptorCount = 1;
11055
11056 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11057 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11058 ds_pool_ci.pNext = NULL;
11059 ds_pool_ci.maxSets = 1;
11060 ds_pool_ci.poolSizeCount = 1;
11061 ds_pool_ci.pPoolSizes = &ds_type_count;
11062
11063 VkDescriptorPool ds_pool;
11064 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11065 ASSERT_VK_SUCCESS(err);
11066
11067 VkDescriptorSetLayoutBinding dsl_binding = {};
11068 dsl_binding.binding = 0;
11069 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11070 dsl_binding.descriptorCount = 0;
11071 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11072 dsl_binding.pImmutableSamplers = NULL;
11073
11074 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11075 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11076 ds_layout_ci.pNext = NULL;
11077 ds_layout_ci.bindingCount = 1;
11078 ds_layout_ci.pBindings = &dsl_binding;
11079 VkDescriptorSetLayout ds_layout;
11080 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11081 ASSERT_VK_SUCCESS(err);
11082
11083 VkDescriptorSet descriptor_set;
11084 VkDescriptorSetAllocateInfo alloc_info = {};
11085 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11086 alloc_info.descriptorSetCount = 1;
11087 alloc_info.descriptorPool = ds_pool;
11088 alloc_info.pSetLayouts = &ds_layout;
11089 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11090 ASSERT_VK_SUCCESS(err);
11091
11092 VkSamplerCreateInfo sampler_ci = {};
11093 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11094 sampler_ci.magFilter = VK_FILTER_NEAREST;
11095 sampler_ci.minFilter = VK_FILTER_NEAREST;
11096 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11097 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11098 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11099 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11100 sampler_ci.mipLodBias = 1.0;
11101 sampler_ci.maxAnisotropy = 1;
11102 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11103 sampler_ci.minLod = 1.0;
11104 sampler_ci.maxLod = 1.0;
11105 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11106
11107 VkSampler sampler;
11108 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11109 ASSERT_VK_SUCCESS(err);
11110
11111 VkDescriptorImageInfo info = {};
11112 info.sampler = sampler;
11113
11114 VkWriteDescriptorSet descriptor_write;
11115 memset(&descriptor_write, 0, sizeof(descriptor_write));
11116 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11117 descriptor_write.dstSet = descriptor_set;
11118 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011119 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011120 // This is the wrong type, but empty binding error will be flagged first
11121 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11122 descriptor_write.pImageInfo = &info;
11123
11124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
11125 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11126 m_errorMonitor->VerifyFound();
11127
11128 vkDestroySampler(m_device->device(), sampler, NULL);
11129 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11130 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11131}
11132
Karl Schultz6addd812016-02-02 17:17:23 -070011133TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11134 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11135 // types
11136 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011137
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011138 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 -060011139
Tony Barbour1fa09702017-03-16 12:09:08 -060011140 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011141
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011142 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011143 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11144 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011145
11146 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011147 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11148 ds_pool_ci.pNext = NULL;
11149 ds_pool_ci.maxSets = 1;
11150 ds_pool_ci.poolSizeCount = 1;
11151 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011152
Tobin Ehlis3b780662015-05-28 12:11:26 -060011153 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011154 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011155 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011156 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011157 dsl_binding.binding = 0;
11158 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11159 dsl_binding.descriptorCount = 1;
11160 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11161 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011162
Tony Barboureb254902015-07-15 12:50:33 -060011163 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011164 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11165 ds_layout_ci.pNext = NULL;
11166 ds_layout_ci.bindingCount = 1;
11167 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011168
Tobin Ehlis3b780662015-05-28 12:11:26 -060011169 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011170 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011171 ASSERT_VK_SUCCESS(err);
11172
11173 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011174 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011175 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011176 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011177 alloc_info.descriptorPool = ds_pool;
11178 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011179 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011180 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011181
Tony Barboureb254902015-07-15 12:50:33 -060011182 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011183 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11184 sampler_ci.pNext = NULL;
11185 sampler_ci.magFilter = VK_FILTER_NEAREST;
11186 sampler_ci.minFilter = VK_FILTER_NEAREST;
11187 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11188 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11189 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11190 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11191 sampler_ci.mipLodBias = 1.0;
11192 sampler_ci.anisotropyEnable = VK_FALSE;
11193 sampler_ci.maxAnisotropy = 1;
11194 sampler_ci.compareEnable = VK_FALSE;
11195 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11196 sampler_ci.minLod = 1.0;
11197 sampler_ci.maxLod = 1.0;
11198 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11199 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011200 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011201 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011202 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011203
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011204 VkDescriptorImageInfo info = {};
11205 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011206
11207 VkWriteDescriptorSet descriptor_write;
11208 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011209 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011210 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011211 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011212 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011213 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011214 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011215
11216 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11217
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011218 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011219
Chia-I Wuf7458c52015-10-26 21:10:41 +080011220 vkDestroySampler(m_device->device(), sampler, NULL);
11221 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11222 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011223}
11224
Karl Schultz6addd812016-02-02 17:17:23 -070011225TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011226 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011227 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011228
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011230
Tony Barbour1fa09702017-03-16 12:09:08 -060011231 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011232 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11233 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011234 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011235 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11236 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011237
11238 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011239 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11240 ds_pool_ci.pNext = NULL;
11241 ds_pool_ci.maxSets = 1;
11242 ds_pool_ci.poolSizeCount = 1;
11243 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011244
11245 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011246 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011247 ASSERT_VK_SUCCESS(err);
11248
11249 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011250 dsl_binding.binding = 0;
11251 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11252 dsl_binding.descriptorCount = 1;
11253 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11254 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011255
11256 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011257 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11258 ds_layout_ci.pNext = NULL;
11259 ds_layout_ci.bindingCount = 1;
11260 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011261 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011262 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011263 ASSERT_VK_SUCCESS(err);
11264
11265 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011266 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011267 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011268 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011269 alloc_info.descriptorPool = ds_pool;
11270 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011271 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011272 ASSERT_VK_SUCCESS(err);
11273
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011274 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011275
11276 VkDescriptorImageInfo descriptor_info;
11277 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11278 descriptor_info.sampler = sampler;
11279
11280 VkWriteDescriptorSet descriptor_write;
11281 memset(&descriptor_write, 0, sizeof(descriptor_write));
11282 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011283 descriptor_write.dstSet = descriptorSet;
11284 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011285 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011286 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11287 descriptor_write.pImageInfo = &descriptor_info;
11288
11289 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11290
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011291 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011292
Chia-I Wuf7458c52015-10-26 21:10:41 +080011293 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11294 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011295}
11296
Karl Schultz6addd812016-02-02 17:17:23 -070011297TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11298 // Create a single combined Image/Sampler descriptor and send it an invalid
11299 // imageView
11300 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011301
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011303
Tony Barbour1fa09702017-03-16 12:09:08 -060011304 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011305 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011306 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11307 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011308
11309 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011310 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11311 ds_pool_ci.pNext = NULL;
11312 ds_pool_ci.maxSets = 1;
11313 ds_pool_ci.poolSizeCount = 1;
11314 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011315
11316 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011317 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011318 ASSERT_VK_SUCCESS(err);
11319
11320 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011321 dsl_binding.binding = 0;
11322 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11323 dsl_binding.descriptorCount = 1;
11324 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11325 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011326
11327 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011328 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11329 ds_layout_ci.pNext = NULL;
11330 ds_layout_ci.bindingCount = 1;
11331 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011332 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011333 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011334 ASSERT_VK_SUCCESS(err);
11335
11336 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011337 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011338 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011339 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011340 alloc_info.descriptorPool = ds_pool;
11341 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011342 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011343 ASSERT_VK_SUCCESS(err);
11344
11345 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011346 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11347 sampler_ci.pNext = NULL;
11348 sampler_ci.magFilter = VK_FILTER_NEAREST;
11349 sampler_ci.minFilter = VK_FILTER_NEAREST;
11350 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11351 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11352 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11353 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11354 sampler_ci.mipLodBias = 1.0;
11355 sampler_ci.anisotropyEnable = VK_FALSE;
11356 sampler_ci.maxAnisotropy = 1;
11357 sampler_ci.compareEnable = VK_FALSE;
11358 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11359 sampler_ci.minLod = 1.0;
11360 sampler_ci.maxLod = 1.0;
11361 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11362 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011363
11364 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011365 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011366 ASSERT_VK_SUCCESS(err);
11367
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011368 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011369
11370 VkDescriptorImageInfo descriptor_info;
11371 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11372 descriptor_info.sampler = sampler;
11373 descriptor_info.imageView = view;
11374
11375 VkWriteDescriptorSet descriptor_write;
11376 memset(&descriptor_write, 0, sizeof(descriptor_write));
11377 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011378 descriptor_write.dstSet = descriptorSet;
11379 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011380 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011381 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11382 descriptor_write.pImageInfo = &descriptor_info;
11383
11384 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11385
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011386 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011387
Chia-I Wuf7458c52015-10-26 21:10:41 +080011388 vkDestroySampler(m_device->device(), sampler, NULL);
11389 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11390 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011391}
11392
Karl Schultz6addd812016-02-02 17:17:23 -070011393TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11394 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11395 // into the other
11396 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011397
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11399 " binding #1 with type "
11400 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11401 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011402
Tony Barbour1fa09702017-03-16 12:09:08 -060011403 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011404 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011405 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011406 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11407 ds_type_count[0].descriptorCount = 1;
11408 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11409 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011410
11411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11413 ds_pool_ci.pNext = NULL;
11414 ds_pool_ci.maxSets = 1;
11415 ds_pool_ci.poolSizeCount = 2;
11416 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011417
11418 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011419 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011420 ASSERT_VK_SUCCESS(err);
11421 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011422 dsl_binding[0].binding = 0;
11423 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11424 dsl_binding[0].descriptorCount = 1;
11425 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11426 dsl_binding[0].pImmutableSamplers = NULL;
11427 dsl_binding[1].binding = 1;
11428 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11429 dsl_binding[1].descriptorCount = 1;
11430 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11431 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011432
11433 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011434 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11435 ds_layout_ci.pNext = NULL;
11436 ds_layout_ci.bindingCount = 2;
11437 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011438
11439 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011440 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011441 ASSERT_VK_SUCCESS(err);
11442
11443 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011444 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011445 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011446 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011447 alloc_info.descriptorPool = ds_pool;
11448 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011449 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011450 ASSERT_VK_SUCCESS(err);
11451
11452 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011453 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11454 sampler_ci.pNext = NULL;
11455 sampler_ci.magFilter = VK_FILTER_NEAREST;
11456 sampler_ci.minFilter = VK_FILTER_NEAREST;
11457 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11458 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11459 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11460 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11461 sampler_ci.mipLodBias = 1.0;
11462 sampler_ci.anisotropyEnable = VK_FALSE;
11463 sampler_ci.maxAnisotropy = 1;
11464 sampler_ci.compareEnable = VK_FALSE;
11465 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11466 sampler_ci.minLod = 1.0;
11467 sampler_ci.maxLod = 1.0;
11468 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11469 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011470
11471 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011472 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011473 ASSERT_VK_SUCCESS(err);
11474
11475 VkDescriptorImageInfo info = {};
11476 info.sampler = sampler;
11477
11478 VkWriteDescriptorSet descriptor_write;
11479 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11480 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011481 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011482 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011483 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011484 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11485 descriptor_write.pImageInfo = &info;
11486 // This write update should succeed
11487 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11488 // Now perform a copy update that fails due to type mismatch
11489 VkCopyDescriptorSet copy_ds_update;
11490 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11491 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11492 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011493 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011494 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011495 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11496 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011497 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11498
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011499 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011500 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011501 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 -060011502 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11503 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11504 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011505 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011506 copy_ds_update.dstSet = descriptorSet;
11507 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011508 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011509 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11510
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011511 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011512
Tobin Ehlis04356f92015-10-27 16:35:27 -060011513 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11515 " binding#1 with offset index of 1 plus "
11516 "update array offset of 0 and update of "
11517 "5 descriptors oversteps total number "
11518 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011519
Tobin Ehlis04356f92015-10-27 16:35:27 -060011520 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11521 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11522 copy_ds_update.srcSet = descriptorSet;
11523 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011524 copy_ds_update.dstSet = descriptorSet;
11525 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011526 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011527 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11528
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011529 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011530
Chia-I Wuf7458c52015-10-26 21:10:41 +080011531 vkDestroySampler(m_device->device(), sampler, NULL);
11532 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11533 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011534}
11535
Karl Schultz6addd812016-02-02 17:17:23 -070011536TEST_F(VkLayerTest, NumSamplesMismatch) {
11537 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11538 // sampleCount
11539 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011540
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011542
Tony Barbour1fa09702017-03-16 12:09:08 -060011543 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011545 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011546 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011547 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011548
11549 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011550 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11551 ds_pool_ci.pNext = NULL;
11552 ds_pool_ci.maxSets = 1;
11553 ds_pool_ci.poolSizeCount = 1;
11554 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011555
Tobin Ehlis3b780662015-05-28 12:11:26 -060011556 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011557 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011558 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011559
Tony Barboureb254902015-07-15 12:50:33 -060011560 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011561 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011562 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011563 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011564 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11565 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011566
Tony Barboureb254902015-07-15 12:50:33 -060011567 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11568 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11569 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011570 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011571 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011572
Tobin Ehlis3b780662015-05-28 12:11:26 -060011573 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011574 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011575 ASSERT_VK_SUCCESS(err);
11576
11577 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011578 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011579 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011580 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011581 alloc_info.descriptorPool = ds_pool;
11582 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011583 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011584 ASSERT_VK_SUCCESS(err);
11585
Tony Barboureb254902015-07-15 12:50:33 -060011586 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011587 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011588 pipe_ms_state_ci.pNext = NULL;
11589 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11590 pipe_ms_state_ci.sampleShadingEnable = 0;
11591 pipe_ms_state_ci.minSampleShading = 1.0;
11592 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011593
Tony Barboureb254902015-07-15 12:50:33 -060011594 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011595 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11596 pipeline_layout_ci.pNext = NULL;
11597 pipeline_layout_ci.setLayoutCount = 1;
11598 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011599
11600 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011601 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011602 ASSERT_VK_SUCCESS(err);
11603
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011604 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011605 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 -060011606 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011607 VkPipelineObj pipe(m_device);
11608 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011609 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011610 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011611 pipe.SetMSAA(&pipe_ms_state_ci);
11612 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011613
Tony Barbour552f6c02016-12-21 14:34:07 -070011614 m_commandBuffer->BeginCommandBuffer();
11615 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011616 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011617
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011618 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11619 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11620 VkRect2D scissor = {{0, 0}, {16, 16}};
11621 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11622
Mark Young29927482016-05-04 14:38:51 -060011623 // Render triangle (the error should trigger on the attempt to draw).
11624 Draw(3, 1, 0, 0);
11625
11626 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011627 m_commandBuffer->EndRenderPass();
11628 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011629
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011630 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011631
Chia-I Wuf7458c52015-10-26 21:10:41 +080011632 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11633 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11634 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011635}
Mark Young29927482016-05-04 14:38:51 -060011636
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011637TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011638 TEST_DESCRIPTION(
11639 "Hit RenderPass incompatible cases. "
11640 "Initial case is drawing with an active renderpass that's "
11641 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011642 VkResult err;
11643
Tony Barbour1fa09702017-03-16 12:09:08 -060011644 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11646
11647 VkDescriptorSetLayoutBinding dsl_binding = {};
11648 dsl_binding.binding = 0;
11649 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11650 dsl_binding.descriptorCount = 1;
11651 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11652 dsl_binding.pImmutableSamplers = NULL;
11653
11654 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11655 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11656 ds_layout_ci.pNext = NULL;
11657 ds_layout_ci.bindingCount = 1;
11658 ds_layout_ci.pBindings = &dsl_binding;
11659
11660 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011661 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011662 ASSERT_VK_SUCCESS(err);
11663
11664 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11665 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11666 pipeline_layout_ci.pNext = NULL;
11667 pipeline_layout_ci.setLayoutCount = 1;
11668 pipeline_layout_ci.pSetLayouts = &ds_layout;
11669
11670 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011671 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011672 ASSERT_VK_SUCCESS(err);
11673
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011674 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011675 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 -060011676 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011677 // Create a renderpass that will be incompatible with default renderpass
11678 VkAttachmentReference attach = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011679 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011680 VkAttachmentReference color_att = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011681 color_att.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011682 VkSubpassDescription subpass = {};
11683 subpass.inputAttachmentCount = 1;
11684 subpass.pInputAttachments = &attach;
11685 subpass.colorAttachmentCount = 1;
11686 subpass.pColorAttachments = &color_att;
11687 VkRenderPassCreateInfo rpci = {};
11688 rpci.subpassCount = 1;
11689 rpci.pSubpasses = &subpass;
11690 rpci.attachmentCount = 1;
11691 VkAttachmentDescription attach_desc = {};
11692 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011693 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11694 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011695 rpci.pAttachments = &attach_desc;
11696 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11697 VkRenderPass rp;
11698 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11699 VkPipelineObj pipe(m_device);
11700 pipe.AddShader(&vs);
11701 pipe.AddShader(&fs);
11702 pipe.AddColorAttachment();
11703 VkViewport view_port = {};
11704 m_viewports.push_back(view_port);
11705 pipe.SetViewport(m_viewports);
11706 VkRect2D rect = {};
11707 m_scissors.push_back(rect);
11708 pipe.SetScissor(m_scissors);
11709 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11710
11711 VkCommandBufferInheritanceInfo cbii = {};
11712 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11713 cbii.renderPass = rp;
11714 cbii.subpass = 0;
11715 VkCommandBufferBeginInfo cbbi = {};
11716 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11717 cbbi.pInheritanceInfo = &cbii;
11718 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11719 VkRenderPassBeginInfo rpbi = {};
11720 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11721 rpbi.framebuffer = m_framebuffer;
11722 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011723 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11724 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011725
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011727 // Render triangle (the error should trigger on the attempt to draw).
11728 Draw(3, 1, 0, 0);
11729
11730 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011731 m_commandBuffer->EndRenderPass();
11732 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011733
11734 m_errorMonitor->VerifyFound();
11735
11736 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11737 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11738 vkDestroyRenderPass(m_device->device(), rp, NULL);
11739}
11740
Mark Youngc89c6312016-03-31 16:03:20 -060011741TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11742 // Create Pipeline where the number of blend attachments doesn't match the
11743 // number of color attachments. In this case, we don't add any color
11744 // blend attachments even though we have a color attachment.
11745 VkResult err;
11746
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011748
Tony Barbour1fa09702017-03-16 12:09:08 -060011749 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011750 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11751 VkDescriptorPoolSize ds_type_count = {};
11752 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11753 ds_type_count.descriptorCount = 1;
11754
11755 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11756 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11757 ds_pool_ci.pNext = NULL;
11758 ds_pool_ci.maxSets = 1;
11759 ds_pool_ci.poolSizeCount = 1;
11760 ds_pool_ci.pPoolSizes = &ds_type_count;
11761
11762 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011763 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011764 ASSERT_VK_SUCCESS(err);
11765
11766 VkDescriptorSetLayoutBinding dsl_binding = {};
11767 dsl_binding.binding = 0;
11768 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11769 dsl_binding.descriptorCount = 1;
11770 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11771 dsl_binding.pImmutableSamplers = NULL;
11772
11773 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11774 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11775 ds_layout_ci.pNext = NULL;
11776 ds_layout_ci.bindingCount = 1;
11777 ds_layout_ci.pBindings = &dsl_binding;
11778
11779 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011780 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011781 ASSERT_VK_SUCCESS(err);
11782
11783 VkDescriptorSet descriptorSet;
11784 VkDescriptorSetAllocateInfo alloc_info = {};
11785 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11786 alloc_info.descriptorSetCount = 1;
11787 alloc_info.descriptorPool = ds_pool;
11788 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011789 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011790 ASSERT_VK_SUCCESS(err);
11791
11792 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011793 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011794 pipe_ms_state_ci.pNext = NULL;
11795 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11796 pipe_ms_state_ci.sampleShadingEnable = 0;
11797 pipe_ms_state_ci.minSampleShading = 1.0;
11798 pipe_ms_state_ci.pSampleMask = NULL;
11799
11800 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11801 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11802 pipeline_layout_ci.pNext = NULL;
11803 pipeline_layout_ci.setLayoutCount = 1;
11804 pipeline_layout_ci.pSetLayouts = &ds_layout;
11805
11806 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011807 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011808 ASSERT_VK_SUCCESS(err);
11809
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011810 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011811 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 -060011812 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011813 VkPipelineObj pipe(m_device);
11814 pipe.AddShader(&vs);
11815 pipe.AddShader(&fs);
11816 pipe.SetMSAA(&pipe_ms_state_ci);
11817 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011818 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011819
11820 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11821 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11822 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11823}
Mark Young29927482016-05-04 14:38:51 -060011824
Mark Muellerd4914412016-06-13 17:52:06 -060011825TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011826 TEST_DESCRIPTION(
11827 "Points to a wrong colorAttachment index in a VkClearAttachment "
11828 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011829 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011831
11832 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11833 m_errorMonitor->VerifyFound();
11834}
11835
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011836TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011837 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11838 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011839
Tony Barbour1fa09702017-03-16 12:09:08 -060011840 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011841 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011842
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011843 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011844 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11845 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011846
11847 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011848 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11849 ds_pool_ci.pNext = NULL;
11850 ds_pool_ci.maxSets = 1;
11851 ds_pool_ci.poolSizeCount = 1;
11852 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011853
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011854 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011855 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011856 ASSERT_VK_SUCCESS(err);
11857
Tony Barboureb254902015-07-15 12:50:33 -060011858 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011859 dsl_binding.binding = 0;
11860 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11861 dsl_binding.descriptorCount = 1;
11862 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11863 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011864
Tony Barboureb254902015-07-15 12:50:33 -060011865 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011866 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11867 ds_layout_ci.pNext = NULL;
11868 ds_layout_ci.bindingCount = 1;
11869 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011870
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011871 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011872 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011873 ASSERT_VK_SUCCESS(err);
11874
11875 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011876 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011877 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011878 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011879 alloc_info.descriptorPool = ds_pool;
11880 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011881 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011882 ASSERT_VK_SUCCESS(err);
11883
Tony Barboureb254902015-07-15 12:50:33 -060011884 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011885 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011886 pipe_ms_state_ci.pNext = NULL;
11887 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11888 pipe_ms_state_ci.sampleShadingEnable = 0;
11889 pipe_ms_state_ci.minSampleShading = 1.0;
11890 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011891
Tony Barboureb254902015-07-15 12:50:33 -060011892 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011893 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11894 pipeline_layout_ci.pNext = NULL;
11895 pipeline_layout_ci.setLayoutCount = 1;
11896 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011897
11898 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011899 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011900 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011901
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011902 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011903 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011904 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011905 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011906
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011907 VkPipelineObj pipe(m_device);
11908 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011909 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011910 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011911 pipe.SetMSAA(&pipe_ms_state_ci);
11912 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011913
Tony Barbour552f6c02016-12-21 14:34:07 -070011914 m_commandBuffer->BeginCommandBuffer();
11915 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011916
Karl Schultz6addd812016-02-02 17:17:23 -070011917 // Main thing we care about for this test is that the VkImage obj we're
11918 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011919 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011920 VkClearAttachment color_attachment;
11921 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11922 color_attachment.clearValue.color.float32[0] = 1.0;
11923 color_attachment.clearValue.color.float32[1] = 1.0;
11924 color_attachment.clearValue.color.float32[2] = 1.0;
11925 color_attachment.clearValue.color.float32[3] = 1.0;
11926 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011927 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011928
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011929 // Call for full-sized FB Color attachment prior to issuing a Draw
11930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011931 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011932 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011933 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011934
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011935 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11936 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11938 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11939 m_errorMonitor->VerifyFound();
11940
11941 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11942 clear_rect.layerCount = 2;
11943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11944 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011945 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011946
Chia-I Wuf7458c52015-10-26 21:10:41 +080011947 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11948 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11949 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011950}
11951
Karl Schultz6addd812016-02-02 17:17:23 -070011952TEST_F(VkLayerTest, VtxBufferBadIndex) {
11953 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011954
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11956 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011957
Tony Barbour1fa09702017-03-16 12:09:08 -060011958 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011959 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011960 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011961
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011962 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011963 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11964 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011965
11966 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011967 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11968 ds_pool_ci.pNext = NULL;
11969 ds_pool_ci.maxSets = 1;
11970 ds_pool_ci.poolSizeCount = 1;
11971 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011972
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011973 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011974 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011975 ASSERT_VK_SUCCESS(err);
11976
Tony Barboureb254902015-07-15 12:50:33 -060011977 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011978 dsl_binding.binding = 0;
11979 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11980 dsl_binding.descriptorCount = 1;
11981 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11982 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011983
Tony Barboureb254902015-07-15 12:50:33 -060011984 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011985 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11986 ds_layout_ci.pNext = NULL;
11987 ds_layout_ci.bindingCount = 1;
11988 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011989
Tobin Ehlis502480b2015-06-24 15:53:07 -060011990 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011991 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011992 ASSERT_VK_SUCCESS(err);
11993
11994 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011995 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011996 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011997 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011998 alloc_info.descriptorPool = ds_pool;
11999 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012000 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012001 ASSERT_VK_SUCCESS(err);
12002
Tony Barboureb254902015-07-15 12:50:33 -060012003 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012004 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012005 pipe_ms_state_ci.pNext = NULL;
12006 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12007 pipe_ms_state_ci.sampleShadingEnable = 0;
12008 pipe_ms_state_ci.minSampleShading = 1.0;
12009 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012010
Tony Barboureb254902015-07-15 12:50:33 -060012011 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012012 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12013 pipeline_layout_ci.pNext = NULL;
12014 pipeline_layout_ci.setLayoutCount = 1;
12015 pipeline_layout_ci.pSetLayouts = &ds_layout;
12016 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012017
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012018 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012019 ASSERT_VK_SUCCESS(err);
12020
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012021 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012022 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 -060012023 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012024 VkPipelineObj pipe(m_device);
12025 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012026 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012027 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012028 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012029 pipe.SetViewport(m_viewports);
12030 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012031 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012032
Tony Barbour552f6c02016-12-21 14:34:07 -070012033 m_commandBuffer->BeginCommandBuffer();
12034 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012035 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012036 // Don't care about actual data, just need to get to draw to flag error
12037 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012038 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012039 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012040 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012041
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012042 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012043
Chia-I Wuf7458c52015-10-26 21:10:41 +080012044 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12045 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12046 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012047}
Mark Muellerdfe37552016-07-07 14:47:42 -060012048
Mark Mueller2ee294f2016-08-04 12:59:48 -060012049TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012050 TEST_DESCRIPTION(
12051 "Use an invalid count in a vkEnumeratePhysicalDevices call."
12052 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060012053 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012054
Mark Mueller880fce52016-08-17 15:23:23 -060012055 // The following test fails with recent NVidia drivers.
12056 // By the time core_validation is reached, the NVidia
12057 // driver has sanitized the invalid condition and core_validation
12058 // is not introduced to the failure condition. This is not the case
12059 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012060 // uint32_t count = static_cast<uint32_t>(~0);
12061 // VkPhysicalDevice physical_device;
12062 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12063 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012064
Mark Mueller2ee294f2016-08-04 12:59:48 -060012065 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012066 VkDeviceQueueCreateInfo queue_create_info = {};
12067 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12068 queue_create_info.queueCount = 1;
12069 queue_create_info.pQueuePriorities = &queue_priority;
12070 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12071
12072 VkPhysicalDeviceFeatures features = m_device->phy().features();
12073 VkDevice testDevice;
12074 VkDeviceCreateInfo device_create_info = {};
12075 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12076 device_create_info.queueCreateInfoCount = 1;
12077 device_create_info.pQueueCreateInfos = &queue_create_info;
12078 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012079
12080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12081 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012082 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
12083 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12084 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012085 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12086 m_errorMonitor->VerifyFound();
12087
12088 queue_create_info.queueFamilyIndex = 1;
12089
12090 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12091 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12092 for (unsigned i = 0; i < feature_count; i++) {
12093 if (VK_FALSE == feature_array[i]) {
12094 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012095 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12097 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012098 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
12099 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12100 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12102 "You requested features that are unavailable on this device. You should first "
12103 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012104 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12105 m_errorMonitor->VerifyFound();
12106 break;
12107 }
12108 }
12109}
12110
Tobin Ehlis16edf082016-11-21 12:33:49 -070012111TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
12112 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
12113
Tony Barbour1fa09702017-03-16 12:09:08 -060012114 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070012115
12116 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
12117 std::vector<VkDeviceQueueCreateInfo> queue_info;
12118 queue_info.reserve(queue_props.size());
12119 std::vector<std::vector<float>> queue_priorities;
12120 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
12121 VkDeviceQueueCreateInfo qi{};
12122 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12123 qi.queueFamilyIndex = i;
12124 qi.queueCount = queue_props[i].queueCount;
12125 queue_priorities.emplace_back(qi.queueCount, 0.0f);
12126 qi.pQueuePriorities = queue_priorities[i].data();
12127 queue_info.push_back(qi);
12128 }
12129
12130 std::vector<const char *> device_extension_names;
12131
12132 VkDevice local_device;
12133 VkDeviceCreateInfo device_create_info = {};
12134 auto features = m_device->phy().features();
12135 // Intentionally disable pipeline stats
12136 features.pipelineStatisticsQuery = VK_FALSE;
12137 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12138 device_create_info.pNext = NULL;
12139 device_create_info.queueCreateInfoCount = queue_info.size();
12140 device_create_info.pQueueCreateInfos = queue_info.data();
12141 device_create_info.enabledLayerCount = 0;
12142 device_create_info.ppEnabledLayerNames = NULL;
12143 device_create_info.pEnabledFeatures = &features;
12144 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
12145 ASSERT_VK_SUCCESS(err);
12146
12147 VkQueryPoolCreateInfo qpci{};
12148 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12149 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
12150 qpci.queryCount = 1;
12151 VkQueryPool query_pool;
12152
12153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
12154 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
12155 m_errorMonitor->VerifyFound();
12156
12157 vkDestroyDevice(local_device, nullptr);
12158}
12159
Mark Mueller2ee294f2016-08-04 12:59:48 -060012160TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012161 TEST_DESCRIPTION(
12162 "Use an invalid queue index in a vkCmdWaitEvents call."
12163 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012164
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012165 const char *invalid_queue_index =
12166 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12167 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12168 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012169
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012170 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012171
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012173
Tony Barbour1fa09702017-03-16 12:09:08 -060012174 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012175
12176 VkEvent event;
12177 VkEventCreateInfo event_create_info{};
12178 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12179 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12180
Mark Mueller2ee294f2016-08-04 12:59:48 -060012181 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012182 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012183
Tony Barbour552f6c02016-12-21 14:34:07 -070012184 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012185
12186 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012187 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 -060012188 ASSERT_TRUE(image.initialized());
12189 VkImageMemoryBarrier img_barrier = {};
12190 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12191 img_barrier.pNext = NULL;
12192 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12193 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12194 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12195 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12196 img_barrier.image = image.handle();
12197 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012198
12199 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12200 // that layer validation catches the case when it is not.
12201 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012202 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12203 img_barrier.subresourceRange.baseArrayLayer = 0;
12204 img_barrier.subresourceRange.baseMipLevel = 0;
12205 img_barrier.subresourceRange.layerCount = 1;
12206 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012207 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
12208 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012209 m_errorMonitor->VerifyFound();
12210
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012212
12213 VkQueryPool query_pool;
12214 VkQueryPoolCreateInfo query_pool_create_info = {};
12215 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12216 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12217 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012218 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012219
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012220 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012221 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12222
12223 vkEndCommandBuffer(m_commandBuffer->handle());
12224 m_errorMonitor->VerifyFound();
12225
12226 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12227 vkDestroyEvent(m_device->device(), event, nullptr);
12228}
12229
Mark Muellerdfe37552016-07-07 14:47:42 -060012230TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012231 TEST_DESCRIPTION(
12232 "Submit a command buffer using deleted vertex buffer, "
12233 "delete a buffer twice, use an invalid offset for each "
12234 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060012235
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012236 const char *deleted_buffer_in_command_buffer =
12237 "Cannot submit cmd buffer "
12238 "using deleted buffer ";
12239 const char *invalid_offset_message =
12240 "vkBindBufferMemory(): "
12241 "memoryOffset is 0x";
12242 const char *invalid_storage_buffer_offset_message =
12243 "vkBindBufferMemory(): "
12244 "storage memoryOffset "
12245 "is 0x";
12246 const char *invalid_texel_buffer_offset_message =
12247 "vkBindBufferMemory(): "
12248 "texel memoryOffset "
12249 "is 0x";
12250 const char *invalid_uniform_buffer_offset_message =
12251 "vkBindBufferMemory(): "
12252 "uniform memoryOffset "
12253 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060012254
Tony Barbour1fa09702017-03-16 12:09:08 -060012255 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060012256 ASSERT_NO_FATAL_FAILURE(InitViewport());
12257 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12258
12259 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012260 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060012261 pipe_ms_state_ci.pNext = NULL;
12262 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12263 pipe_ms_state_ci.sampleShadingEnable = 0;
12264 pipe_ms_state_ci.minSampleShading = 1.0;
12265 pipe_ms_state_ci.pSampleMask = nullptr;
12266
12267 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12268 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12269 VkPipelineLayout pipeline_layout;
12270
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012271 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060012272 ASSERT_VK_SUCCESS(err);
12273
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012274 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12275 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060012276 VkPipelineObj pipe(m_device);
12277 pipe.AddShader(&vs);
12278 pipe.AddShader(&fs);
12279 pipe.AddColorAttachment();
12280 pipe.SetMSAA(&pipe_ms_state_ci);
12281 pipe.SetViewport(m_viewports);
12282 pipe.SetScissor(m_scissors);
12283 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12284
Tony Barbour552f6c02016-12-21 14:34:07 -070012285 m_commandBuffer->BeginCommandBuffer();
12286 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012287 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060012288
12289 {
12290 // Create and bind a vertex buffer in a reduced scope, which will cause
12291 // it to be deleted upon leaving this scope
12292 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012293 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060012294 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12295 draw_verticies.AddVertexInputToPipe(pipe);
12296 }
12297
12298 Draw(1, 0, 0, 0);
12299
Tony Barbour552f6c02016-12-21 14:34:07 -070012300 m_commandBuffer->EndRenderPass();
12301 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060012302
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060012304 QueueCommandBuffer(false);
12305 m_errorMonitor->VerifyFound();
12306
12307 {
12308 // Create and bind a vertex buffer in a reduced scope, and delete it
12309 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012310 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060012312 buffer_test.TestDoubleDestroy();
12313 }
12314 m_errorMonitor->VerifyFound();
12315
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012316 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012317 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012318 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012320 m_errorMonitor->SetUnexpectedError(
12321 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
12322 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012323 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
12324 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012325 m_errorMonitor->VerifyFound();
12326 }
12327
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012328 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
12329 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012330 // Create and bind a memory buffer with an invalid offset again,
12331 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012333 m_errorMonitor->SetUnexpectedError(
12334 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12335 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012336 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12337 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012338 m_errorMonitor->VerifyFound();
12339 }
12340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012341 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012342 // Create and bind a memory buffer with an invalid offset again, but
12343 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012345 m_errorMonitor->SetUnexpectedError(
12346 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12347 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012348 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12349 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012350 m_errorMonitor->VerifyFound();
12351 }
12352
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012353 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012354 // Create and bind a memory buffer with an invalid offset again, but
12355 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012357 m_errorMonitor->SetUnexpectedError(
12358 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12359 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012360 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12361 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012362 m_errorMonitor->VerifyFound();
12363 }
12364
12365 {
12366 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012368 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
12369 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012370 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
12371 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012372 m_errorMonitor->VerifyFound();
12373 }
12374
12375 {
12376 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012378 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
12379 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012380 }
12381 m_errorMonitor->VerifyFound();
12382
12383 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12384}
12385
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012386// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12387TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012388 TEST_DESCRIPTION(
12389 "Hit all possible validation checks associated with the "
12390 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12391 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012392 // 3 in ValidateCmdBufImageLayouts
12393 // * -1 Attempt to submit cmd buf w/ deleted image
12394 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12395 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012396
Tony Barbour1fa09702017-03-16 12:09:08 -060012397 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060012398 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070012399 if (!depth_format) {
12400 printf(" No Depth + Stencil format found. Skipped.\n");
12401 return;
12402 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012403 // Create src & dst images to use for copy operations
12404 VkImage src_image;
12405 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080012406 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012407
12408 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12409 const int32_t tex_width = 32;
12410 const int32_t tex_height = 32;
12411
12412 VkImageCreateInfo image_create_info = {};
12413 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12414 image_create_info.pNext = NULL;
12415 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12416 image_create_info.format = tex_format;
12417 image_create_info.extent.width = tex_width;
12418 image_create_info.extent.height = tex_height;
12419 image_create_info.extent.depth = 1;
12420 image_create_info.mipLevels = 1;
12421 image_create_info.arrayLayers = 4;
12422 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12423 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12424 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080012425 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012426 image_create_info.flags = 0;
12427
12428 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12429 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012430 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012431 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12432 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012433 image_create_info.format = VK_FORMAT_D32_SFLOAT;
12434 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
12435 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
12436 ASSERT_VK_SUCCESS(err);
12437
12438 // Allocate memory
12439 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080012440 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080012441 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080012442 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12443 mem_alloc.pNext = NULL;
12444 mem_alloc.allocationSize = 0;
12445 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080012446
12447 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012448 mem_alloc.allocationSize = img_mem_reqs.size;
12449 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012450 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080012451 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080012452 ASSERT_VK_SUCCESS(err);
12453
12454 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012455 mem_alloc.allocationSize = img_mem_reqs.size;
12456 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012457 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012458 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012459 ASSERT_VK_SUCCESS(err);
12460
12461 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012462 mem_alloc.allocationSize = img_mem_reqs.size;
12463 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012464 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012465 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012466 ASSERT_VK_SUCCESS(err);
12467
12468 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12469 ASSERT_VK_SUCCESS(err);
12470 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12471 ASSERT_VK_SUCCESS(err);
12472 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12473 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012474
Tony Barbour552f6c02016-12-21 14:34:07 -070012475 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012476 VkImageCopy copy_region;
12477 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12478 copy_region.srcSubresource.mipLevel = 0;
12479 copy_region.srcSubresource.baseArrayLayer = 0;
12480 copy_region.srcSubresource.layerCount = 1;
12481 copy_region.srcOffset.x = 0;
12482 copy_region.srcOffset.y = 0;
12483 copy_region.srcOffset.z = 0;
12484 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12485 copy_region.dstSubresource.mipLevel = 0;
12486 copy_region.dstSubresource.baseArrayLayer = 0;
12487 copy_region.dstSubresource.layerCount = 1;
12488 copy_region.dstOffset.x = 0;
12489 copy_region.dstOffset.y = 0;
12490 copy_region.dstOffset.z = 0;
12491 copy_region.extent.width = 1;
12492 copy_region.extent.height = 1;
12493 copy_region.extent.depth = 1;
12494
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12496 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12497 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012498
Cort530cf382016-12-08 09:59:47 -080012499 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 -060012500 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012501 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12502 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012503 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12504 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012505 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 -060012506 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012508 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12509 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012510 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080012511 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 -060012512 m_errorMonitor->VerifyFound();
12513 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012515 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012516 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012517 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012518 "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 -080012519 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 -060012520 m_errorMonitor->VerifyFound();
12521 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12523 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12524 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012525 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 -060012526 m_errorMonitor->VerifyFound();
12527 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012529 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012530 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012531 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012532 "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 -080012533 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 -060012534 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012536 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12537 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012538 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012539 "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 -080012540 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 -060012541 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012542
Cort3b021012016-12-07 12:00:57 -080012543 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12544 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12545 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12546 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12547 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12548 transfer_dst_image_barrier[0].srcAccessMask = 0;
12549 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12550 transfer_dst_image_barrier[0].image = dst_image;
12551 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12552 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12553 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12554 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12555 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12556 transfer_dst_image_barrier[0].image = depth_image;
12557 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12558 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12559 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12560
12561 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012562 VkClearColorValue color_clear_value = {};
12563 VkImageSubresourceRange clear_range;
12564 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12565 clear_range.baseMipLevel = 0;
12566 clear_range.baseArrayLayer = 0;
12567 clear_range.layerCount = 1;
12568 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012569
Cort3b021012016-12-07 12:00:57 -080012570 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12571 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012574 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012575 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012576 // Fail due to provided layout not matching actual current layout for color clear.
12577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012578 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012579 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012580
Cort530cf382016-12-08 09:59:47 -080012581 VkClearDepthStencilValue depth_clear_value = {};
12582 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012583
12584 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12585 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012588 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012589 m_errorMonitor->VerifyFound();
12590 // Fail due to provided layout not matching actual current layout for depth clear.
12591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012592 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012593 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012594
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012595 // Now cause error due to bad image layout transition in PipelineBarrier
12596 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012597 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012598 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012599 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012600 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012601 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12602 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012603 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012605 "you cannot transition the layout of aspect 1 from "
12606 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12607 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012609 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12610 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012611 m_errorMonitor->VerifyFound();
12612
12613 // Finally some layout errors at RenderPass create time
12614 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12615 VkAttachmentReference attach = {};
12616 // perf warning for GENERAL layout w/ non-DS input attachment
12617 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12618 VkSubpassDescription subpass = {};
12619 subpass.inputAttachmentCount = 1;
12620 subpass.pInputAttachments = &attach;
12621 VkRenderPassCreateInfo rpci = {};
12622 rpci.subpassCount = 1;
12623 rpci.pSubpasses = &subpass;
12624 rpci.attachmentCount = 1;
12625 VkAttachmentDescription attach_desc = {};
12626 attach_desc.format = VK_FORMAT_UNDEFINED;
12627 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012628 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012629 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12631 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012632 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12633 m_errorMonitor->VerifyFound();
12634 // error w/ non-general layout
12635 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12636
12637 m_errorMonitor->SetDesiredFailureMsg(
12638 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12639 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12640 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12641 m_errorMonitor->VerifyFound();
12642 subpass.inputAttachmentCount = 0;
12643 subpass.colorAttachmentCount = 1;
12644 subpass.pColorAttachments = &attach;
12645 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12646 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12648 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012649 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12650 m_errorMonitor->VerifyFound();
12651 // error w/ non-color opt or GENERAL layout for color attachment
12652 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12653 m_errorMonitor->SetDesiredFailureMsg(
12654 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12655 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12656 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12657 m_errorMonitor->VerifyFound();
12658 subpass.colorAttachmentCount = 0;
12659 subpass.pDepthStencilAttachment = &attach;
12660 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12661 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12663 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012664 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12665 m_errorMonitor->VerifyFound();
12666 // error w/ non-ds opt or GENERAL layout for color attachment
12667 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12669 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12670 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012671 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12672 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012673 // For this error we need a valid renderpass so create default one
12674 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12675 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012676 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012677 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12678 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12679 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12680 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12681 // Can't do a CLEAR load on READ_ONLY initialLayout
12682 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12683 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12684 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012686 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012687 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12688 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012689
Cort3b021012016-12-07 12:00:57 -080012690 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12691 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12692 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012693 vkDestroyImage(m_device->device(), src_image, NULL);
12694 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012695 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012696}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012697
Tobin Ehlise0936662016-10-11 08:10:51 -060012698TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12699 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12700 VkResult err;
12701
Tony Barbour1fa09702017-03-16 12:09:08 -060012702 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012703
12704 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12705 VkImageTiling tiling;
12706 VkFormatProperties format_properties;
12707 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12708 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12709 tiling = VK_IMAGE_TILING_LINEAR;
12710 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12711 tiling = VK_IMAGE_TILING_OPTIMAL;
12712 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012713 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012714 return;
12715 }
12716
12717 VkDescriptorPoolSize ds_type = {};
12718 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12719 ds_type.descriptorCount = 1;
12720
12721 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12722 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12723 ds_pool_ci.maxSets = 1;
12724 ds_pool_ci.poolSizeCount = 1;
12725 ds_pool_ci.pPoolSizes = &ds_type;
12726 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12727
12728 VkDescriptorPool ds_pool;
12729 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12730 ASSERT_VK_SUCCESS(err);
12731
12732 VkDescriptorSetLayoutBinding dsl_binding = {};
12733 dsl_binding.binding = 0;
12734 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12735 dsl_binding.descriptorCount = 1;
12736 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12737 dsl_binding.pImmutableSamplers = NULL;
12738
12739 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12740 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12741 ds_layout_ci.pNext = NULL;
12742 ds_layout_ci.bindingCount = 1;
12743 ds_layout_ci.pBindings = &dsl_binding;
12744
12745 VkDescriptorSetLayout ds_layout;
12746 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12747 ASSERT_VK_SUCCESS(err);
12748
12749 VkDescriptorSetAllocateInfo alloc_info = {};
12750 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12751 alloc_info.descriptorSetCount = 1;
12752 alloc_info.descriptorPool = ds_pool;
12753 alloc_info.pSetLayouts = &ds_layout;
12754 VkDescriptorSet descriptor_set;
12755 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12756 ASSERT_VK_SUCCESS(err);
12757
12758 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12759 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12760 pipeline_layout_ci.pNext = NULL;
12761 pipeline_layout_ci.setLayoutCount = 1;
12762 pipeline_layout_ci.pSetLayouts = &ds_layout;
12763 VkPipelineLayout pipeline_layout;
12764 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12765 ASSERT_VK_SUCCESS(err);
12766
12767 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012768 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012769 ASSERT_TRUE(image.initialized());
12770 VkImageView view = image.targetView(tex_format);
12771
12772 VkDescriptorImageInfo image_info = {};
12773 image_info.imageView = view;
12774 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12775
12776 VkWriteDescriptorSet descriptor_write = {};
12777 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12778 descriptor_write.dstSet = descriptor_set;
12779 descriptor_write.dstBinding = 0;
12780 descriptor_write.descriptorCount = 1;
12781 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12782 descriptor_write.pImageInfo = &image_info;
12783
12784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12785 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12786 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12787 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12788 m_errorMonitor->VerifyFound();
12789
12790 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12791 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12792 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12793 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12794}
12795
Mark Mueller93b938f2016-08-18 10:27:40 -060012796TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012797 TEST_DESCRIPTION(
12798 "Use vkCmdExecuteCommands with invalid state "
12799 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012800
Tony Barbour1fa09702017-03-16 12:09:08 -060012801 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012802 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12803
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012804 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012805 const char *simultaneous_use_message2 =
12806 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12807 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012808
12809 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012810 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012811 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012812 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12813 command_buffer_allocate_info.commandBufferCount = 1;
12814
12815 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012816 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012817 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12818 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012819 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012820 command_buffer_inheritance_info.renderPass = m_renderPass;
12821 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012822
Mark Mueller93b938f2016-08-18 10:27:40 -060012823 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012824 command_buffer_begin_info.flags =
12825 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012826 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12827
12828 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12829 vkEndCommandBuffer(secondary_command_buffer);
12830
Mark Mueller93b938f2016-08-18 10:27:40 -060012831 VkSubmitInfo submit_info = {};
12832 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12833 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012834 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012835
Mark Mueller4042b652016-09-05 22:52:21 -060012836 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012837 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12839 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012840 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012841 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012842 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12843 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012844
Dave Houltonfbf52152017-01-06 12:55:29 -070012845 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012846 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012847 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012848
Mark Mueller4042b652016-09-05 22:52:21 -060012849 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012850 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012851 m_errorMonitor->SetUnexpectedError(
12852 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12853 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012854 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012855 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012856
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12858 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012859 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012860 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12861 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012862
12863 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012864
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012865 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012866}
12867
Tony Barbour626994c2017-02-08 15:29:37 -070012868TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12869 TEST_DESCRIPTION(
12870 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12871 "errors");
12872 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12873 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 -060012874 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012875
12876 VkCommandBuffer cmd_bufs[2];
12877 VkCommandBufferAllocateInfo alloc_info;
12878 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12879 alloc_info.pNext = NULL;
12880 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012881 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012882 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12883 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12884
12885 VkCommandBufferBeginInfo cb_binfo;
12886 cb_binfo.pNext = NULL;
12887 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12888 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12889 cb_binfo.flags = 0;
12890 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12891 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12892 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12893 vkEndCommandBuffer(cmd_bufs[0]);
12894 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12895
12896 VkSubmitInfo submit_info = {};
12897 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12898 submit_info.commandBufferCount = 2;
12899 submit_info.pCommandBuffers = duplicates;
12900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12901 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12902 m_errorMonitor->VerifyFound();
12903 vkQueueWaitIdle(m_device->m_queue);
12904
12905 // Set one time use and now look for one time submit
12906 duplicates[0] = duplicates[1] = cmd_bufs[1];
12907 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12908 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12909 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12910 vkEndCommandBuffer(cmd_bufs[1]);
12911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12912 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12913 m_errorMonitor->VerifyFound();
12914 vkQueueWaitIdle(m_device->m_queue);
12915}
12916
Tobin Ehlisb093da82017-01-19 12:05:27 -070012917TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012918 TEST_DESCRIPTION(
12919 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12920 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012921
Tony Barbour1fa09702017-03-16 12:09:08 -060012922 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012923 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12924
12925 std::vector<const char *> device_extension_names;
12926 auto features = m_device->phy().features();
12927 // Make sure gs & ts are disabled
12928 features.geometryShader = false;
12929 features.tessellationShader = false;
12930 // The sacrificial device object
12931 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12932
12933 VkCommandPoolCreateInfo pool_create_info{};
12934 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12935 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12936
12937 VkCommandPool command_pool;
12938 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12939
12940 VkCommandBufferAllocateInfo cmd = {};
12941 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12942 cmd.pNext = NULL;
12943 cmd.commandPool = command_pool;
12944 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12945 cmd.commandBufferCount = 1;
12946
12947 VkCommandBuffer cmd_buffer;
12948 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12949 ASSERT_VK_SUCCESS(err);
12950
12951 VkEvent event;
12952 VkEventCreateInfo evci = {};
12953 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12954 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12955 ASSERT_VK_SUCCESS(result);
12956
12957 VkCommandBufferBeginInfo cbbi = {};
12958 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12959 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12961 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12962 m_errorMonitor->VerifyFound();
12963
12964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12965 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12966 m_errorMonitor->VerifyFound();
12967
12968 vkDestroyEvent(test_device.handle(), event, NULL);
12969 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12970}
12971
Chris Forbesd70103a2017-04-13 11:34:09 -070012972TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012973 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12975
Tony Barbour552f6c02016-12-21 14:34:07 -070012976 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012977
12978 VkEvent event;
12979 VkEventCreateInfo event_create_info = {};
12980 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12981 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012982 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012983
Tony Barbour552f6c02016-12-21 14:34:07 -070012984 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012985 vkDestroyEvent(m_device->device(), event, nullptr);
12986
12987 VkSubmitInfo submit_info = {};
12988 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12989 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012990 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012992 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12993 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070012994}
Mark Muellerc8d441e2016-08-23 17:36:00 -060012995
Chris Forbesd70103a2017-04-13 11:34:09 -070012996TEST_F(VkLayerTest, InUseDestroyedSignaled) {
12997 TEST_DESCRIPTION(
12998 "Use vkCmdExecuteCommands with invalid state "
12999 "in primary and secondary command buffers. "
13000 "Delete objects that are inuse. Call VkQueueSubmit "
13001 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013002
Chris Forbesd70103a2017-04-13 11:34:09 -070013003 ASSERT_NO_FATAL_FAILURE(Init());
13004 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13005
13006 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013007
Mark Mueller917f6bc2016-08-30 10:57:19 -060013008 VkSemaphoreCreateInfo semaphore_create_info = {};
13009 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13010 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013011 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013012 VkFenceCreateInfo fence_create_info = {};
13013 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13014 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013015 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013016
13017 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013018 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013019 descriptor_pool_type_count.descriptorCount = 1;
13020
13021 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13022 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13023 descriptor_pool_create_info.maxSets = 1;
13024 descriptor_pool_create_info.poolSizeCount = 1;
13025 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013026 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013027
13028 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013029 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013030
13031 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013032 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013033 descriptorset_layout_binding.descriptorCount = 1;
13034 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13035
13036 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013037 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013038 descriptorset_layout_create_info.bindingCount = 1;
13039 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13040
13041 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013042 ASSERT_VK_SUCCESS(
13043 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013044
13045 VkDescriptorSet descriptorset;
13046 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013047 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013048 descriptorset_allocate_info.descriptorSetCount = 1;
13049 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13050 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013051 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013052
Mark Mueller4042b652016-09-05 22:52:21 -060013053 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13054
13055 VkDescriptorBufferInfo buffer_info = {};
13056 buffer_info.buffer = buffer_test.GetBuffer();
13057 buffer_info.offset = 0;
13058 buffer_info.range = 1024;
13059
13060 VkWriteDescriptorSet write_descriptor_set = {};
13061 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13062 write_descriptor_set.dstSet = descriptorset;
13063 write_descriptor_set.descriptorCount = 1;
13064 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13065 write_descriptor_set.pBufferInfo = &buffer_info;
13066
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013067 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060013068
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013069 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13070 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013071
13072 VkPipelineObj pipe(m_device);
13073 pipe.AddColorAttachment();
13074 pipe.AddShader(&vs);
13075 pipe.AddShader(&fs);
13076
13077 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013078 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013079 pipeline_layout_create_info.setLayoutCount = 1;
13080 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13081
13082 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013083 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013084
13085 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
13086
Chris Forbesd70103a2017-04-13 11:34:09 -070013087 VkEvent event;
13088 VkEventCreateInfo event_create_info = {};
13089 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13090 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
13091
Tony Barbour552f6c02016-12-21 14:34:07 -070013092 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070013093
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013094 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013095
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013096 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13097 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13098 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013099
Tony Barbour552f6c02016-12-21 14:34:07 -070013100 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013101
Chris Forbesd70103a2017-04-13 11:34:09 -070013102 VkSubmitInfo submit_info = {};
13103 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13104 submit_info.commandBufferCount = 1;
13105 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013106 submit_info.signalSemaphoreCount = 1;
13107 submit_info.pSignalSemaphores = &semaphore;
13108 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013109 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060013110
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013112 vkDestroyEvent(m_device->device(), event, nullptr);
13113 m_errorMonitor->VerifyFound();
13114
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013116 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13117 m_errorMonitor->VerifyFound();
13118
Jeremy Hayes08369882017-02-02 10:31:06 -070013119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013120 vkDestroyFence(m_device->device(), fence, nullptr);
13121 m_errorMonitor->VerifyFound();
13122
Tobin Ehlis122207b2016-09-01 08:50:06 -070013123 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013124 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
13125 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013126 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013127 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
13128 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013129 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013130 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
13131 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013132 vkDestroyEvent(m_device->device(), event, nullptr);
13133 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013134 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013135 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13136}
13137
Tobin Ehlis2adda372016-09-01 08:51:06 -070013138TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
13139 TEST_DESCRIPTION("Delete in-use query pool.");
13140
Tony Barbour1fa09702017-03-16 12:09:08 -060013141 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070013142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13143
13144 VkQueryPool query_pool;
13145 VkQueryPoolCreateInfo query_pool_ci{};
13146 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
13147 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
13148 query_pool_ci.queryCount = 1;
13149 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070013150 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013151 // Reset query pool to create binding with cmd buffer
13152 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
13153
Tony Barbour552f6c02016-12-21 14:34:07 -070013154 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013155
13156 VkSubmitInfo submit_info = {};
13157 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13158 submit_info.commandBufferCount = 1;
13159 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13160 // Submit cmd buffer and then destroy query pool while in-flight
13161 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13162
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070013164 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13165 m_errorMonitor->VerifyFound();
13166
13167 vkQueueWaitIdle(m_device->m_queue);
13168 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013169 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013170 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070013171 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13172}
13173
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013174TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
13175 TEST_DESCRIPTION("Delete in-use pipeline.");
13176
Tony Barbour1fa09702017-03-16 12:09:08 -060013177 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13179
13180 // Empty pipeline layout used for binding PSO
13181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13183 pipeline_layout_ci.setLayoutCount = 0;
13184 pipeline_layout_ci.pSetLayouts = NULL;
13185
13186 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013187 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013188 ASSERT_VK_SUCCESS(err);
13189
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013191 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013192 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13193 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013194 // Store pipeline handle so we can actually delete it before test finishes
13195 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013196 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013197 VkPipelineObj pipe(m_device);
13198 pipe.AddShader(&vs);
13199 pipe.AddShader(&fs);
13200 pipe.AddColorAttachment();
13201 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13202 delete_this_pipeline = pipe.handle();
13203
Tony Barbour552f6c02016-12-21 14:34:07 -070013204 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013205 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013206 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013207
Tony Barbour552f6c02016-12-21 14:34:07 -070013208 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013209
13210 VkSubmitInfo submit_info = {};
13211 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13212 submit_info.commandBufferCount = 1;
13213 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13214 // Submit cmd buffer and then pipeline destroyed while in-flight
13215 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013216 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013217 m_errorMonitor->VerifyFound();
13218 // Make sure queue finished and then actually delete pipeline
13219 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013220 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
13221 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013222 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
13223 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
13224}
13225
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013226TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
13227 TEST_DESCRIPTION("Delete in-use imageView.");
13228
Tony Barbour1fa09702017-03-16 12:09:08 -060013229 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13231
13232 VkDescriptorPoolSize ds_type_count;
13233 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13234 ds_type_count.descriptorCount = 1;
13235
13236 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13237 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13238 ds_pool_ci.maxSets = 1;
13239 ds_pool_ci.poolSizeCount = 1;
13240 ds_pool_ci.pPoolSizes = &ds_type_count;
13241
13242 VkDescriptorPool ds_pool;
13243 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13244 ASSERT_VK_SUCCESS(err);
13245
13246 VkSamplerCreateInfo sampler_ci = {};
13247 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13248 sampler_ci.pNext = NULL;
13249 sampler_ci.magFilter = VK_FILTER_NEAREST;
13250 sampler_ci.minFilter = VK_FILTER_NEAREST;
13251 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13252 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13253 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13254 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13255 sampler_ci.mipLodBias = 1.0;
13256 sampler_ci.anisotropyEnable = VK_FALSE;
13257 sampler_ci.maxAnisotropy = 1;
13258 sampler_ci.compareEnable = VK_FALSE;
13259 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13260 sampler_ci.minLod = 1.0;
13261 sampler_ci.maxLod = 1.0;
13262 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13263 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13264 VkSampler sampler;
13265
13266 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13267 ASSERT_VK_SUCCESS(err);
13268
13269 VkDescriptorSetLayoutBinding layout_binding;
13270 layout_binding.binding = 0;
13271 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13272 layout_binding.descriptorCount = 1;
13273 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13274 layout_binding.pImmutableSamplers = NULL;
13275
13276 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13277 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13278 ds_layout_ci.bindingCount = 1;
13279 ds_layout_ci.pBindings = &layout_binding;
13280 VkDescriptorSetLayout ds_layout;
13281 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13282 ASSERT_VK_SUCCESS(err);
13283
13284 VkDescriptorSetAllocateInfo alloc_info = {};
13285 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13286 alloc_info.descriptorSetCount = 1;
13287 alloc_info.descriptorPool = ds_pool;
13288 alloc_info.pSetLayouts = &ds_layout;
13289 VkDescriptorSet descriptor_set;
13290 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13291 ASSERT_VK_SUCCESS(err);
13292
13293 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13294 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13295 pipeline_layout_ci.pNext = NULL;
13296 pipeline_layout_ci.setLayoutCount = 1;
13297 pipeline_layout_ci.pSetLayouts = &ds_layout;
13298
13299 VkPipelineLayout pipeline_layout;
13300 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13301 ASSERT_VK_SUCCESS(err);
13302
13303 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013304 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 -060013305 ASSERT_TRUE(image.initialized());
13306
13307 VkImageView view;
13308 VkImageViewCreateInfo ivci = {};
13309 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13310 ivci.image = image.handle();
13311 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13312 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13313 ivci.subresourceRange.layerCount = 1;
13314 ivci.subresourceRange.baseMipLevel = 0;
13315 ivci.subresourceRange.levelCount = 1;
13316 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13317
13318 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13319 ASSERT_VK_SUCCESS(err);
13320
13321 VkDescriptorImageInfo image_info{};
13322 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13323 image_info.imageView = view;
13324 image_info.sampler = sampler;
13325
13326 VkWriteDescriptorSet descriptor_write = {};
13327 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13328 descriptor_write.dstSet = descriptor_set;
13329 descriptor_write.dstBinding = 0;
13330 descriptor_write.descriptorCount = 1;
13331 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13332 descriptor_write.pImageInfo = &image_info;
13333
13334 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13335
13336 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013337 char const *vsSource =
13338 "#version 450\n"
13339 "\n"
13340 "out gl_PerVertex { \n"
13341 " vec4 gl_Position;\n"
13342 "};\n"
13343 "void main(){\n"
13344 " gl_Position = vec4(1);\n"
13345 "}\n";
13346 char const *fsSource =
13347 "#version 450\n"
13348 "\n"
13349 "layout(set=0, binding=0) uniform sampler2D s;\n"
13350 "layout(location=0) out vec4 x;\n"
13351 "void main(){\n"
13352 " x = texture(s, vec2(1));\n"
13353 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013354 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13355 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13356 VkPipelineObj pipe(m_device);
13357 pipe.AddShader(&vs);
13358 pipe.AddShader(&fs);
13359 pipe.AddColorAttachment();
13360 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13361
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013363
Tony Barbour552f6c02016-12-21 14:34:07 -070013364 m_commandBuffer->BeginCommandBuffer();
13365 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013366 // Bind pipeline to cmd buffer
13367 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13368 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13369 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070013370
13371 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13372 VkRect2D scissor = {{0, 0}, {16, 16}};
13373 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13374 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13375
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013376 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013377 m_commandBuffer->EndRenderPass();
13378 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013379 // Submit cmd buffer then destroy sampler
13380 VkSubmitInfo submit_info = {};
13381 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13382 submit_info.commandBufferCount = 1;
13383 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13384 // Submit cmd buffer and then destroy imageView while in-flight
13385 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13386
13387 vkDestroyImageView(m_device->device(), view, nullptr);
13388 m_errorMonitor->VerifyFound();
13389 vkQueueWaitIdle(m_device->m_queue);
13390 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013391 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013392 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013393 vkDestroyImageView(m_device->device(), view, NULL);
13394 vkDestroySampler(m_device->device(), sampler, nullptr);
13395 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13396 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13397 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13398}
13399
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013400TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
13401 TEST_DESCRIPTION("Delete in-use bufferView.");
13402
Tony Barbour1fa09702017-03-16 12:09:08 -060013403 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013404 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13405
13406 VkDescriptorPoolSize ds_type_count;
13407 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13408 ds_type_count.descriptorCount = 1;
13409
13410 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13411 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13412 ds_pool_ci.maxSets = 1;
13413 ds_pool_ci.poolSizeCount = 1;
13414 ds_pool_ci.pPoolSizes = &ds_type_count;
13415
13416 VkDescriptorPool ds_pool;
13417 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13418 ASSERT_VK_SUCCESS(err);
13419
13420 VkDescriptorSetLayoutBinding layout_binding;
13421 layout_binding.binding = 0;
13422 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13423 layout_binding.descriptorCount = 1;
13424 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13425 layout_binding.pImmutableSamplers = NULL;
13426
13427 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13428 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13429 ds_layout_ci.bindingCount = 1;
13430 ds_layout_ci.pBindings = &layout_binding;
13431 VkDescriptorSetLayout ds_layout;
13432 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13433 ASSERT_VK_SUCCESS(err);
13434
13435 VkDescriptorSetAllocateInfo alloc_info = {};
13436 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13437 alloc_info.descriptorSetCount = 1;
13438 alloc_info.descriptorPool = ds_pool;
13439 alloc_info.pSetLayouts = &ds_layout;
13440 VkDescriptorSet descriptor_set;
13441 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13442 ASSERT_VK_SUCCESS(err);
13443
13444 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13445 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13446 pipeline_layout_ci.pNext = NULL;
13447 pipeline_layout_ci.setLayoutCount = 1;
13448 pipeline_layout_ci.pSetLayouts = &ds_layout;
13449
13450 VkPipelineLayout pipeline_layout;
13451 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13452 ASSERT_VK_SUCCESS(err);
13453
13454 VkBuffer buffer;
13455 uint32_t queue_family_index = 0;
13456 VkBufferCreateInfo buffer_create_info = {};
13457 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13458 buffer_create_info.size = 1024;
13459 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13460 buffer_create_info.queueFamilyIndexCount = 1;
13461 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13462
13463 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13464 ASSERT_VK_SUCCESS(err);
13465
13466 VkMemoryRequirements memory_reqs;
13467 VkDeviceMemory buffer_memory;
13468
13469 VkMemoryAllocateInfo memory_info = {};
13470 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13471 memory_info.allocationSize = 0;
13472 memory_info.memoryTypeIndex = 0;
13473
13474 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13475 memory_info.allocationSize = memory_reqs.size;
13476 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13477 ASSERT_TRUE(pass);
13478
13479 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13480 ASSERT_VK_SUCCESS(err);
13481 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13482 ASSERT_VK_SUCCESS(err);
13483
13484 VkBufferView view;
13485 VkBufferViewCreateInfo bvci = {};
13486 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13487 bvci.buffer = buffer;
13488 bvci.format = VK_FORMAT_R8_UNORM;
13489 bvci.range = VK_WHOLE_SIZE;
13490
13491 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13492 ASSERT_VK_SUCCESS(err);
13493
13494 VkWriteDescriptorSet descriptor_write = {};
13495 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13496 descriptor_write.dstSet = descriptor_set;
13497 descriptor_write.dstBinding = 0;
13498 descriptor_write.descriptorCount = 1;
13499 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13500 descriptor_write.pTexelBufferView = &view;
13501
13502 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13503
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013504 char const *vsSource =
13505 "#version 450\n"
13506 "\n"
13507 "out gl_PerVertex { \n"
13508 " vec4 gl_Position;\n"
13509 "};\n"
13510 "void main(){\n"
13511 " gl_Position = vec4(1);\n"
13512 "}\n";
13513 char const *fsSource =
13514 "#version 450\n"
13515 "\n"
13516 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13517 "layout(location=0) out vec4 x;\n"
13518 "void main(){\n"
13519 " x = imageLoad(s, 0);\n"
13520 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013521 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13522 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13523 VkPipelineObj pipe(m_device);
13524 pipe.AddShader(&vs);
13525 pipe.AddShader(&fs);
13526 pipe.AddColorAttachment();
13527 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13528
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013530
Tony Barbour552f6c02016-12-21 14:34:07 -070013531 m_commandBuffer->BeginCommandBuffer();
13532 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013533 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13534 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13535 VkRect2D scissor = {{0, 0}, {16, 16}};
13536 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13537 // Bind pipeline to cmd buffer
13538 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13539 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13540 &descriptor_set, 0, nullptr);
13541 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013542 m_commandBuffer->EndRenderPass();
13543 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013544
13545 VkSubmitInfo submit_info = {};
13546 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13547 submit_info.commandBufferCount = 1;
13548 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13549 // Submit cmd buffer and then destroy bufferView while in-flight
13550 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13551
13552 vkDestroyBufferView(m_device->device(), view, nullptr);
13553 m_errorMonitor->VerifyFound();
13554 vkQueueWaitIdle(m_device->m_queue);
13555 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013556 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013557 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013558 vkDestroyBufferView(m_device->device(), view, NULL);
13559 vkDestroyBuffer(m_device->device(), buffer, NULL);
13560 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13561 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13562 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13563 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13564}
13565
Tobin Ehlis209532e2016-09-07 13:52:18 -060013566TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13567 TEST_DESCRIPTION("Delete in-use sampler.");
13568
Tony Barbour1fa09702017-03-16 12:09:08 -060013569 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013570 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13571
13572 VkDescriptorPoolSize ds_type_count;
13573 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13574 ds_type_count.descriptorCount = 1;
13575
13576 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13577 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13578 ds_pool_ci.maxSets = 1;
13579 ds_pool_ci.poolSizeCount = 1;
13580 ds_pool_ci.pPoolSizes = &ds_type_count;
13581
13582 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013583 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013584 ASSERT_VK_SUCCESS(err);
13585
13586 VkSamplerCreateInfo sampler_ci = {};
13587 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13588 sampler_ci.pNext = NULL;
13589 sampler_ci.magFilter = VK_FILTER_NEAREST;
13590 sampler_ci.minFilter = VK_FILTER_NEAREST;
13591 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13592 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13593 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13594 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13595 sampler_ci.mipLodBias = 1.0;
13596 sampler_ci.anisotropyEnable = VK_FALSE;
13597 sampler_ci.maxAnisotropy = 1;
13598 sampler_ci.compareEnable = VK_FALSE;
13599 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13600 sampler_ci.minLod = 1.0;
13601 sampler_ci.maxLod = 1.0;
13602 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13603 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13604 VkSampler sampler;
13605
13606 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13607 ASSERT_VK_SUCCESS(err);
13608
13609 VkDescriptorSetLayoutBinding layout_binding;
13610 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013611 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013612 layout_binding.descriptorCount = 1;
13613 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13614 layout_binding.pImmutableSamplers = NULL;
13615
13616 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13617 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13618 ds_layout_ci.bindingCount = 1;
13619 ds_layout_ci.pBindings = &layout_binding;
13620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013622 ASSERT_VK_SUCCESS(err);
13623
13624 VkDescriptorSetAllocateInfo alloc_info = {};
13625 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13626 alloc_info.descriptorSetCount = 1;
13627 alloc_info.descriptorPool = ds_pool;
13628 alloc_info.pSetLayouts = &ds_layout;
13629 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013631 ASSERT_VK_SUCCESS(err);
13632
13633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13635 pipeline_layout_ci.pNext = NULL;
13636 pipeline_layout_ci.setLayoutCount = 1;
13637 pipeline_layout_ci.pSetLayouts = &ds_layout;
13638
13639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013641 ASSERT_VK_SUCCESS(err);
13642
13643 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013644 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 -060013645 ASSERT_TRUE(image.initialized());
13646
13647 VkImageView view;
13648 VkImageViewCreateInfo ivci = {};
13649 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13650 ivci.image = image.handle();
13651 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13652 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13653 ivci.subresourceRange.layerCount = 1;
13654 ivci.subresourceRange.baseMipLevel = 0;
13655 ivci.subresourceRange.levelCount = 1;
13656 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13657
13658 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13659 ASSERT_VK_SUCCESS(err);
13660
13661 VkDescriptorImageInfo image_info{};
13662 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13663 image_info.imageView = view;
13664 image_info.sampler = sampler;
13665
13666 VkWriteDescriptorSet descriptor_write = {};
13667 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13668 descriptor_write.dstSet = descriptor_set;
13669 descriptor_write.dstBinding = 0;
13670 descriptor_write.descriptorCount = 1;
13671 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13672 descriptor_write.pImageInfo = &image_info;
13673
13674 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13675
13676 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013677 char const *vsSource =
13678 "#version 450\n"
13679 "\n"
13680 "out gl_PerVertex { \n"
13681 " vec4 gl_Position;\n"
13682 "};\n"
13683 "void main(){\n"
13684 " gl_Position = vec4(1);\n"
13685 "}\n";
13686 char const *fsSource =
13687 "#version 450\n"
13688 "\n"
13689 "layout(set=0, binding=0) uniform sampler2D s;\n"
13690 "layout(location=0) out vec4 x;\n"
13691 "void main(){\n"
13692 " x = texture(s, vec2(1));\n"
13693 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013694 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13695 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13696 VkPipelineObj pipe(m_device);
13697 pipe.AddShader(&vs);
13698 pipe.AddShader(&fs);
13699 pipe.AddColorAttachment();
13700 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13701
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013703
Tony Barbour552f6c02016-12-21 14:34:07 -070013704 m_commandBuffer->BeginCommandBuffer();
13705 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013706 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013707 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13708 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13709 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013710
13711 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13712 VkRect2D scissor = {{0, 0}, {16, 16}};
13713 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13714 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13715
Tobin Ehlis209532e2016-09-07 13:52:18 -060013716 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013717 m_commandBuffer->EndRenderPass();
13718 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013719 // Submit cmd buffer then destroy sampler
13720 VkSubmitInfo submit_info = {};
13721 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13722 submit_info.commandBufferCount = 1;
13723 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13724 // Submit cmd buffer and then destroy sampler while in-flight
13725 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13726
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013727 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013728 m_errorMonitor->VerifyFound();
13729 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013730
Tobin Ehlis209532e2016-09-07 13:52:18 -060013731 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013732 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13733 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013734 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013735 vkDestroyImageView(m_device->device(), view, NULL);
13736 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13737 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13738 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13739}
13740
Mark Mueller1cd9f412016-08-25 13:23:52 -060013741TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013742 TEST_DESCRIPTION(
13743 "Call VkQueueSubmit with a semaphore that is already "
13744 "signaled but not waited on by the queue. Wait on a "
13745 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013746
Tony Barbour1fa09702017-03-16 12:09:08 -060013747 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013748 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13749
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013750 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 -070013751 const char *invalid_fence_wait_message =
13752 " which has not been submitted on a Queue or during "
13753 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013754
Tony Barbour552f6c02016-12-21 14:34:07 -070013755 m_commandBuffer->BeginCommandBuffer();
13756 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013757
13758 VkSemaphoreCreateInfo semaphore_create_info = {};
13759 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13760 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013761 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013762 VkSubmitInfo submit_info = {};
13763 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13764 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013765 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013766 submit_info.signalSemaphoreCount = 1;
13767 submit_info.pSignalSemaphores = &semaphore;
13768 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013769 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013770 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013771 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013772 m_commandBuffer->BeginCommandBuffer();
13773 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013775 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13776 m_errorMonitor->VerifyFound();
13777
Mark Mueller1cd9f412016-08-25 13:23:52 -060013778 VkFenceCreateInfo fence_create_info = {};
13779 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13780 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013781 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013782
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013784 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13785 m_errorMonitor->VerifyFound();
13786
Mark Mueller4042b652016-09-05 22:52:21 -060013787 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013788 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013789 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13790}
13791
Tobin Ehlis4af23302016-07-19 10:50:30 -060013792TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013793 TEST_DESCRIPTION(
13794 "Bind a secondary command buffer with with a framebuffer "
13795 "that does not match the framebuffer for the active "
13796 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013797 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013798 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13799
13800 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013801 VkAttachmentDescription attachment = {0,
13802 VK_FORMAT_B8G8R8A8_UNORM,
13803 VK_SAMPLE_COUNT_1_BIT,
13804 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13805 VK_ATTACHMENT_STORE_OP_STORE,
13806 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13807 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13808 VK_IMAGE_LAYOUT_UNDEFINED,
13809 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013810
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013811 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013812
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013813 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013815 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013816
13817 VkRenderPass rp;
13818 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13819 ASSERT_VK_SUCCESS(err);
13820
13821 // A compatible framebuffer.
13822 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013823 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 -060013824 ASSERT_TRUE(image.initialized());
13825
13826 VkImageViewCreateInfo ivci = {
13827 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13828 nullptr,
13829 0,
13830 image.handle(),
13831 VK_IMAGE_VIEW_TYPE_2D,
13832 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013833 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13834 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013835 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13836 };
13837 VkImageView view;
13838 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13839 ASSERT_VK_SUCCESS(err);
13840
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013841 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013842 VkFramebuffer fb;
13843 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13844 ASSERT_VK_SUCCESS(err);
13845
13846 VkCommandBufferAllocateInfo cbai = {};
13847 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013848 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013849 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13850 cbai.commandBufferCount = 1;
13851
13852 VkCommandBuffer sec_cb;
13853 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13854 ASSERT_VK_SUCCESS(err);
13855 VkCommandBufferBeginInfo cbbi = {};
13856 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013857 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013858 cbii.renderPass = renderPass();
13859 cbii.framebuffer = fb;
13860 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13861 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013862 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 -060013863 cbbi.pInheritanceInfo = &cbii;
13864 vkBeginCommandBuffer(sec_cb, &cbbi);
13865 vkEndCommandBuffer(sec_cb);
13866
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013867 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013868 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13869 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013870
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013872 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013873 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13874 m_errorMonitor->VerifyFound();
13875 // Cleanup
13876 vkDestroyImageView(m_device->device(), view, NULL);
13877 vkDestroyRenderPass(m_device->device(), rp, NULL);
13878 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13879}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013880
13881TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013882 TEST_DESCRIPTION(
13883 "If logicOp is available on the device, set it to an "
13884 "invalid value. If logicOp is not available, attempt to "
13885 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013886 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13888
13889 auto features = m_device->phy().features();
13890 // Set the expected error depending on whether or not logicOp available
13891 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13893 "If logic operations feature not "
13894 "enabled, logicOpEnable must be "
13895 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013896 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013898 }
13899 // Create a pipeline using logicOp
13900 VkResult err;
13901
13902 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13903 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13904
13905 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013906 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013907 ASSERT_VK_SUCCESS(err);
13908
13909 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13910 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13911 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013912 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013913 vp_state_ci.pViewports = &vp;
13914 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013915 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013916 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013917
13918 VkPipelineShaderStageCreateInfo shaderStages[2];
13919 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13920
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013921 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13922 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013923 shaderStages[0] = vs.GetStageCreateInfo();
13924 shaderStages[1] = fs.GetStageCreateInfo();
13925
13926 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13927 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13928
13929 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13930 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13931 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13932
13933 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13934 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013935 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013936
13937 VkPipelineColorBlendAttachmentState att = {};
13938 att.blendEnable = VK_FALSE;
13939 att.colorWriteMask = 0xf;
13940
13941 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13942 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13943 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13944 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013945 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013946 cb_ci.attachmentCount = 1;
13947 cb_ci.pAttachments = &att;
13948
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013949 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13950 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13951 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13952
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013953 VkGraphicsPipelineCreateInfo gp_ci = {};
13954 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13955 gp_ci.stageCount = 2;
13956 gp_ci.pStages = shaderStages;
13957 gp_ci.pVertexInputState = &vi_ci;
13958 gp_ci.pInputAssemblyState = &ia_ci;
13959 gp_ci.pViewportState = &vp_state_ci;
13960 gp_ci.pRasterizationState = &rs_ci;
13961 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013962 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013963 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13964 gp_ci.layout = pipeline_layout;
13965 gp_ci.renderPass = renderPass();
13966
13967 VkPipelineCacheCreateInfo pc_ci = {};
13968 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13969
13970 VkPipeline pipeline;
13971 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013972 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013973 ASSERT_VK_SUCCESS(err);
13974
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013975 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013976 m_errorMonitor->VerifyFound();
13977 if (VK_SUCCESS == err) {
13978 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13979 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013980 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13981 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13982}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013983
Mike Stroyanaccf7692015-05-12 16:00:45 -060013984#if GTEST_IS_THREADSAFE
13985struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013986 VkCommandBuffer commandBuffer;
Mike Stroyanca855662017-05-02 11:06:27 -060013987 VkDevice device;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013988 VkEvent event;
13989 bool bailout;
13990};
13991
Karl Schultz6addd812016-02-02 17:17:23 -070013992extern "C" void *AddToCommandBuffer(void *arg) {
13993 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013994
Mike Stroyana6d14942016-07-13 15:10:05 -060013995 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013996 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013997 if (data->bailout) {
13998 break;
13999 }
14000 }
14001 return NULL;
14002}
14003
Karl Schultz6addd812016-02-02 17:17:23 -070014004TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014005 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014006
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014008
Tony Barbour1fa09702017-03-16 12:09:08 -060014009 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060014010 ASSERT_NO_FATAL_FAILURE(InitViewport());
14011 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14012
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014013 // Calls AllocateCommandBuffers
14014 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014015
14016 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014017 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014018
14019 VkEventCreateInfo event_info;
14020 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014021 VkResult err;
14022
14023 memset(&event_info, 0, sizeof(event_info));
14024 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
14025
Chia-I Wuf7458c52015-10-26 21:10:41 +080014026 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014027 ASSERT_VK_SUCCESS(err);
14028
Mike Stroyanaccf7692015-05-12 16:00:45 -060014029 err = vkResetEvent(device(), event);
14030 ASSERT_VK_SUCCESS(err);
14031
14032 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014033 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014034 data.event = event;
14035 data.bailout = false;
14036 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060014037
14038 // First do some correct operations using multiple threads.
14039 // Add many entries to command buffer from another thread.
14040 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
14041 // Make non-conflicting calls from this thread at the same time.
14042 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060014043 uint32_t count;
14044 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060014045 }
14046 test_platform_thread_join(thread, NULL);
14047
14048 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060014049 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014050 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014051 // Add many entries to command buffer from this thread at the same time.
14052 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014053
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014054 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014055 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014056
Mike Stroyan10b8cb72016-01-22 15:22:03 -070014057 m_errorMonitor->SetBailout(NULL);
14058
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014059 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014060
Chia-I Wuf7458c52015-10-26 21:10:41 +080014061 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014062}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014063#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014064
Karl Schultz6addd812016-02-02 17:17:23 -070014065TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014066 TEST_DESCRIPTION(
14067 "Test that an error is produced for a spirv module "
14068 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120014069
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014071
Tony Barbour1fa09702017-03-16 12:09:08 -060014072 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14074
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014075 VkShaderModule module;
14076 VkShaderModuleCreateInfo moduleCreateInfo;
14077 struct icd_spv_header spv;
14078
14079 spv.magic = ICD_SPV_MAGIC;
14080 spv.version = ICD_SPV_VERSION;
14081 spv.gen_magic = 0;
14082
14083 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14084 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014085 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014086 moduleCreateInfo.codeSize = 4;
14087 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014088 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014089
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014090 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014091}
14092
Karl Schultz6addd812016-02-02 17:17:23 -070014093TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014094 TEST_DESCRIPTION(
14095 "Test that an error is produced for a spirv module "
14096 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120014097
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014099
Tony Barbour1fa09702017-03-16 12:09:08 -060014100 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014101 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14102
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014103 VkShaderModule module;
14104 VkShaderModuleCreateInfo moduleCreateInfo;
14105 struct icd_spv_header spv;
14106
14107 spv.magic = ~ICD_SPV_MAGIC;
14108 spv.version = ICD_SPV_VERSION;
14109 spv.gen_magic = 0;
14110
14111 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14112 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014113 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014114 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14115 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014116 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014117
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014118 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014119}
14120
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014121#if 0
14122// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070014123TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014125 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014126
Tony Barbour1fa09702017-03-16 12:09:08 -060014127 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14129
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014130 VkShaderModule module;
14131 VkShaderModuleCreateInfo moduleCreateInfo;
14132 struct icd_spv_header spv;
14133
14134 spv.magic = ICD_SPV_MAGIC;
14135 spv.version = ~ICD_SPV_VERSION;
14136 spv.gen_magic = 0;
14137
14138 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14139 moduleCreateInfo.pNext = NULL;
14140
Karl Schultz6addd812016-02-02 17:17:23 -070014141 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014142 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14143 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014144 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014145
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014146 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014147}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014148#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014149
Karl Schultz6addd812016-02-02 17:17:23 -070014150TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014151 TEST_DESCRIPTION(
14152 "Test that a warning is produced for a vertex output that "
14153 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014155
Tony Barbour1fa09702017-03-16 12:09:08 -060014156 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014157 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014158
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014159 char const *vsSource =
14160 "#version 450\n"
14161 "\n"
14162 "layout(location=0) out float x;\n"
14163 "out gl_PerVertex {\n"
14164 " vec4 gl_Position;\n"
14165 "};\n"
14166 "void main(){\n"
14167 " gl_Position = vec4(1);\n"
14168 " x = 0;\n"
14169 "}\n";
14170 char const *fsSource =
14171 "#version 450\n"
14172 "\n"
14173 "layout(location=0) out vec4 color;\n"
14174 "void main(){\n"
14175 " color = vec4(1);\n"
14176 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120014177
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014178 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14179 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014180
14181 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014182 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014183 pipe.AddShader(&vs);
14184 pipe.AddShader(&fs);
14185
Chris Forbes9f7ff632015-05-25 11:13:08 +120014186 VkDescriptorSetObj descriptorSet(m_device);
14187 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014188 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014189
Tony Barbour5781e8f2015-08-04 16:23:11 -060014190 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014191
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014192 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014193}
Chris Forbes9f7ff632015-05-25 11:13:08 +120014194
Mark Mueller098c9cb2016-09-08 09:01:57 -060014195TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
14196 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14197
Tony Barbour1fa09702017-03-16 12:09:08 -060014198 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014199 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14200
14201 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014202 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014203
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014204 char const *vsSource =
14205 "#version 450\n"
14206 "\n"
14207 "out gl_PerVertex {\n"
14208 " vec4 gl_Position;\n"
14209 "};\n"
14210 "void main(){\n"
14211 " gl_Position = vec4(1);\n"
14212 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014213
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014214 char const *fsSource =
14215 "#version 450\n"
14216 "\n"
14217 "layout (constant_id = 0) const float r = 0.0f;\n"
14218 "layout(location = 0) out vec4 uFragColor;\n"
14219 "void main(){\n"
14220 " uFragColor = vec4(r,1,0,1);\n"
14221 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014222
14223 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14224 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14225
14226 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14227 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14228
14229 VkPipelineLayout pipeline_layout;
14230 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14231
14232 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
14233 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14234 vp_state_create_info.viewportCount = 1;
14235 VkViewport viewport = {};
14236 vp_state_create_info.pViewports = &viewport;
14237 vp_state_create_info.scissorCount = 1;
14238 VkRect2D scissors = {};
14239 vp_state_create_info.pScissors = &scissors;
14240
14241 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
14242
14243 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
14244 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
14245 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
14246 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
14247
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014248 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060014249
14250 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
14251 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14252
14253 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
14254 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14255 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14256
14257 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
14258 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
14259 rasterization_state_create_info.pNext = nullptr;
14260 rasterization_state_create_info.lineWidth = 1.0f;
14261 rasterization_state_create_info.rasterizerDiscardEnable = true;
14262
14263 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
14264 color_blend_attachment_state.blendEnable = VK_FALSE;
14265 color_blend_attachment_state.colorWriteMask = 0xf;
14266
14267 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
14268 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14269 color_blend_state_create_info.attachmentCount = 1;
14270 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
14271
14272 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
14273 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14274 graphicspipe_create_info.stageCount = 2;
14275 graphicspipe_create_info.pStages = shader_stage_create_info;
14276 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
14277 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
14278 graphicspipe_create_info.pViewportState = &vp_state_create_info;
14279 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
14280 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
14281 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
14282 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14283 graphicspipe_create_info.layout = pipeline_layout;
14284 graphicspipe_create_info.renderPass = renderPass();
14285
14286 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
14287 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14288
14289 VkPipelineCache pipelineCache;
14290 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
14291
14292 // This structure maps constant ids to data locations.
14293 const VkSpecializationMapEntry entry =
14294 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014295 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014296
14297 uint32_t data = 1;
14298
14299 // Set up the info describing spec map and data
14300 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014301 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060014302 };
14303 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
14304
14305 VkPipeline pipeline;
14306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
14307 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
14308 m_errorMonitor->VerifyFound();
14309
14310 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
14311 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14312}
14313
14314TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
14315 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14316
Tony Barbour1fa09702017-03-16 12:09:08 -060014317 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014318 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14319
14320 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
14321
14322 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
14323 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14324 descriptor_pool_type_count[0].descriptorCount = 1;
14325 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14326 descriptor_pool_type_count[1].descriptorCount = 1;
14327
14328 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14329 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14330 descriptor_pool_create_info.maxSets = 1;
14331 descriptor_pool_create_info.poolSizeCount = 2;
14332 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
14333 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14334
14335 VkDescriptorPool descriptorset_pool;
14336 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14337
14338 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14339 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14340 descriptorset_layout_binding.descriptorCount = 1;
14341 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070014342 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014343
14344 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14345 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14346 descriptorset_layout_create_info.bindingCount = 1;
14347 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14348
14349 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014350 ASSERT_VK_SUCCESS(
14351 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014352
14353 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14354 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14355 descriptorset_allocate_info.descriptorSetCount = 1;
14356 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14357 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14358 VkDescriptorSet descriptorset;
14359 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14360
14361 // Challenge core_validation with a non uniform buffer type.
14362 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
14363
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014364 char const *vsSource =
14365 "#version 450\n"
14366 "\n"
14367 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14368 " mat4 mvp;\n"
14369 "} ubuf;\n"
14370 "out gl_PerVertex {\n"
14371 " vec4 gl_Position;\n"
14372 "};\n"
14373 "void main(){\n"
14374 " gl_Position = ubuf.mvp * vec4(1);\n"
14375 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014376
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014377 char const *fsSource =
14378 "#version 450\n"
14379 "\n"
14380 "layout(location = 0) out vec4 uFragColor;\n"
14381 "void main(){\n"
14382 " uFragColor = vec4(0,1,0,1);\n"
14383 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014384
14385 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14386 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14387
14388 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14389 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14390 pipeline_layout_create_info.setLayoutCount = 1;
14391 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14392
14393 VkPipelineLayout pipeline_layout;
14394 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14395
14396 VkPipelineObj pipe(m_device);
14397 pipe.AddColorAttachment();
14398 pipe.AddShader(&vs);
14399 pipe.AddShader(&fs);
14400
14401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
14402 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14403 m_errorMonitor->VerifyFound();
14404
14405 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14406 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14407 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14408}
14409
14410TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
14411 TEST_DESCRIPTION(
14412 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
14413
Tony Barbour1fa09702017-03-16 12:09:08 -060014414 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14416
14417 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
14418
14419 VkDescriptorPoolSize descriptor_pool_type_count = {};
14420 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14421 descriptor_pool_type_count.descriptorCount = 1;
14422
14423 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14424 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14425 descriptor_pool_create_info.maxSets = 1;
14426 descriptor_pool_create_info.poolSizeCount = 1;
14427 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
14428 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14429
14430 VkDescriptorPool descriptorset_pool;
14431 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14432
14433 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14434 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14435 descriptorset_layout_binding.descriptorCount = 1;
14436 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
14437 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070014438 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014439
14440 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14441 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14442 descriptorset_layout_create_info.bindingCount = 1;
14443 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14444
14445 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014446 ASSERT_VK_SUCCESS(
14447 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014448
14449 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14450 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14451 descriptorset_allocate_info.descriptorSetCount = 1;
14452 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14453 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14454 VkDescriptorSet descriptorset;
14455 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14456
14457 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14458
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014459 char const *vsSource =
14460 "#version 450\n"
14461 "\n"
14462 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14463 " mat4 mvp;\n"
14464 "} ubuf;\n"
14465 "out gl_PerVertex {\n"
14466 " vec4 gl_Position;\n"
14467 "};\n"
14468 "void main(){\n"
14469 " gl_Position = ubuf.mvp * vec4(1);\n"
14470 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014471
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014472 char const *fsSource =
14473 "#version 450\n"
14474 "\n"
14475 "layout(location = 0) out vec4 uFragColor;\n"
14476 "void main(){\n"
14477 " uFragColor = vec4(0,1,0,1);\n"
14478 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014479
14480 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14481 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14482
14483 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14484 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14485 pipeline_layout_create_info.setLayoutCount = 1;
14486 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14487
14488 VkPipelineLayout pipeline_layout;
14489 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14490
14491 VkPipelineObj pipe(m_device);
14492 pipe.AddColorAttachment();
14493 pipe.AddShader(&vs);
14494 pipe.AddShader(&fs);
14495
14496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14497 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14498 m_errorMonitor->VerifyFound();
14499
14500 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14501 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14502 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14503}
14504
14505TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014506 TEST_DESCRIPTION(
14507 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14508 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014509
Tony Barbour1fa09702017-03-16 12:09:08 -060014510 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14512
14513 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014514 "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 -060014515
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014516 char const *vsSource =
14517 "#version 450\n"
14518 "\n"
14519 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14520 "out gl_PerVertex {\n"
14521 " vec4 gl_Position;\n"
14522 "};\n"
14523 "void main(){\n"
14524 " gl_Position = vec4(consts.x);\n"
14525 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014526
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014527 char const *fsSource =
14528 "#version 450\n"
14529 "\n"
14530 "layout(location = 0) out vec4 uFragColor;\n"
14531 "void main(){\n"
14532 " uFragColor = vec4(0,1,0,1);\n"
14533 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014534
14535 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14536 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14537
14538 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14539 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14540
14541 // Set up a push constant range
14542 VkPushConstantRange push_constant_ranges = {};
14543 // Set to the wrong stage to challenge core_validation
14544 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14545 push_constant_ranges.size = 4;
14546
14547 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14548 pipeline_layout_create_info.pushConstantRangeCount = 1;
14549
14550 VkPipelineLayout pipeline_layout;
14551 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14552
14553 VkPipelineObj pipe(m_device);
14554 pipe.AddColorAttachment();
14555 pipe.AddShader(&vs);
14556 pipe.AddShader(&fs);
14557
14558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14559 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14560 m_errorMonitor->VerifyFound();
14561
14562 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14563}
14564
14565TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14566 TEST_DESCRIPTION(
14567 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14568
Tony Barbour1fa09702017-03-16 12:09:08 -060014569 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014570 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14571
14572 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014573 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014574
14575 // Some awkward steps are required to test with custom device features.
14576 std::vector<const char *> device_extension_names;
14577 auto features = m_device->phy().features();
14578 // Disable support for 64 bit floats
14579 features.shaderFloat64 = false;
14580 // The sacrificial device object
14581 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14582
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014583 char const *vsSource =
14584 "#version 450\n"
14585 "\n"
14586 "out gl_PerVertex {\n"
14587 " vec4 gl_Position;\n"
14588 "};\n"
14589 "void main(){\n"
14590 " gl_Position = vec4(1);\n"
14591 "}\n";
14592 char const *fsSource =
14593 "#version 450\n"
14594 "\n"
14595 "layout(location=0) out vec4 color;\n"
14596 "void main(){\n"
14597 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14598 " color = vec4(green);\n"
14599 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014600
14601 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14602 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14603
14604 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014605
14606 VkPipelineObj pipe(&test_device);
14607 pipe.AddColorAttachment();
14608 pipe.AddShader(&vs);
14609 pipe.AddShader(&fs);
14610
14611 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14612 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14613 VkPipelineLayout pipeline_layout;
14614 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14615
14616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14617 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14618 m_errorMonitor->VerifyFound();
14619
14620 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14621}
14622
Mark Lobodzinski20832822017-03-24 14:49:45 -060014623TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14624 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14625 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014626
Tony Barbour1fa09702017-03-16 12:09:08 -060014627 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14629
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014630 char const *vsSource =
14631 "#version 450\n"
14632 "\n"
14633 "out gl_PerVertex {\n"
14634 " vec4 gl_Position;\n"
14635 "};\n"
14636 "layout(xfb_buffer = 1) out;"
14637 "void main(){\n"
14638 " gl_Position = vec4(1);\n"
14639 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014640
Mark Lobodzinski20832822017-03-24 14:49:45 -060014641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014642
Mark Lobodzinski20832822017-03-24 14:49:45 -060014643 std::vector<unsigned int> spv;
14644 VkShaderModuleCreateInfo module_create_info;
14645 VkShaderModule shader_module;
14646 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14647 module_create_info.pNext = NULL;
14648 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14649 module_create_info.pCode = spv.data();
14650 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14651 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014652
Mark Lobodzinski20832822017-03-24 14:49:45 -060014653 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014654
Mark Lobodzinski20832822017-03-24 14:49:45 -060014655 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014656}
14657
Karl Schultz6addd812016-02-02 17:17:23 -070014658TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014659 TEST_DESCRIPTION(
14660 "Test that an error is produced for a fragment shader input "
14661 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014662
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014664
Tony Barbour1fa09702017-03-16 12:09:08 -060014665 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014667
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014668 char const *vsSource =
14669 "#version 450\n"
14670 "\n"
14671 "out gl_PerVertex {\n"
14672 " vec4 gl_Position;\n"
14673 "};\n"
14674 "void main(){\n"
14675 " gl_Position = vec4(1);\n"
14676 "}\n";
14677 char const *fsSource =
14678 "#version 450\n"
14679 "\n"
14680 "layout(location=0) in float x;\n"
14681 "layout(location=0) out vec4 color;\n"
14682 "void main(){\n"
14683 " color = vec4(x);\n"
14684 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014685
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014686 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14687 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014688
14689 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014690 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014691 pipe.AddShader(&vs);
14692 pipe.AddShader(&fs);
14693
Chris Forbes59cb88d2015-05-25 11:13:13 +120014694 VkDescriptorSetObj descriptorSet(m_device);
14695 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014696 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014697
Tony Barbour5781e8f2015-08-04 16:23:11 -060014698 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014699
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014700 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014701}
14702
Karl Schultz6addd812016-02-02 17:17:23 -070014703TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014704 TEST_DESCRIPTION(
14705 "Test that an error is produced for a fragment shader input "
14706 "within an interace block, which is not present in the outputs "
14707 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014709
Tony Barbour1fa09702017-03-16 12:09:08 -060014710 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014713 char const *vsSource =
14714 "#version 450\n"
14715 "\n"
14716 "out gl_PerVertex {\n"
14717 " vec4 gl_Position;\n"
14718 "};\n"
14719 "void main(){\n"
14720 " gl_Position = vec4(1);\n"
14721 "}\n";
14722 char const *fsSource =
14723 "#version 450\n"
14724 "\n"
14725 "in block { layout(location=0) float x; } ins;\n"
14726 "layout(location=0) out vec4 color;\n"
14727 "void main(){\n"
14728 " color = vec4(ins.x);\n"
14729 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014730
14731 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14732 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14733
14734 VkPipelineObj pipe(m_device);
14735 pipe.AddColorAttachment();
14736 pipe.AddShader(&vs);
14737 pipe.AddShader(&fs);
14738
14739 VkDescriptorSetObj descriptorSet(m_device);
14740 descriptorSet.AppendDummy();
14741 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14742
14743 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14744
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014745 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014746}
14747
Karl Schultz6addd812016-02-02 17:17:23 -070014748TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014749 TEST_DESCRIPTION(
14750 "Test that an error is produced for mismatched array sizes "
14751 "across the vertex->fragment shader interface");
14752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14753 "Type mismatch on location 0.0: 'ptr to "
14754 "output arr[2] of float32' vs 'ptr to "
14755 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014756
Tony Barbour1fa09702017-03-16 12:09:08 -060014757 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14759
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014760 char const *vsSource =
14761 "#version 450\n"
14762 "\n"
14763 "layout(location=0) out float x[2];\n"
14764 "out gl_PerVertex {\n"
14765 " vec4 gl_Position;\n"
14766 "};\n"
14767 "void main(){\n"
14768 " x[0] = 0; x[1] = 0;\n"
14769 " gl_Position = vec4(1);\n"
14770 "}\n";
14771 char const *fsSource =
14772 "#version 450\n"
14773 "\n"
14774 "layout(location=0) in float x[1];\n"
14775 "layout(location=0) out vec4 color;\n"
14776 "void main(){\n"
14777 " color = vec4(x[0]);\n"
14778 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014779
14780 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14781 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14782
14783 VkPipelineObj pipe(m_device);
14784 pipe.AddColorAttachment();
14785 pipe.AddShader(&vs);
14786 pipe.AddShader(&fs);
14787
14788 VkDescriptorSetObj descriptorSet(m_device);
14789 descriptorSet.AppendDummy();
14790 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14791
14792 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14793
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014794 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014795}
14796
Karl Schultz6addd812016-02-02 17:17:23 -070014797TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014798 TEST_DESCRIPTION(
14799 "Test that an error is produced for mismatched types across "
14800 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014801 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014802
Tony Barbour1fa09702017-03-16 12:09:08 -060014803 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014805
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014806 char const *vsSource =
14807 "#version 450\n"
14808 "\n"
14809 "layout(location=0) out int x;\n"
14810 "out gl_PerVertex {\n"
14811 " vec4 gl_Position;\n"
14812 "};\n"
14813 "void main(){\n"
14814 " x = 0;\n"
14815 " gl_Position = vec4(1);\n"
14816 "}\n";
14817 char const *fsSource =
14818 "#version 450\n"
14819 "\n"
14820 "layout(location=0) in float x;\n" /* VS writes int */
14821 "layout(location=0) out vec4 color;\n"
14822 "void main(){\n"
14823 " color = vec4(x);\n"
14824 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014825
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014826 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14827 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014828
14829 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014830 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014831 pipe.AddShader(&vs);
14832 pipe.AddShader(&fs);
14833
Chris Forbesb56af562015-05-25 11:13:17 +120014834 VkDescriptorSetObj descriptorSet(m_device);
14835 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014836 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014837
Tony Barbour5781e8f2015-08-04 16:23:11 -060014838 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014839
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014840 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014841}
14842
Karl Schultz6addd812016-02-02 17:17:23 -070014843TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014844 TEST_DESCRIPTION(
14845 "Test that an error is produced for mismatched types across "
14846 "the vertex->fragment shader interface, when the variable is contained within "
14847 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014849
Tony Barbour1fa09702017-03-16 12:09:08 -060014850 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14852
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014853 char const *vsSource =
14854 "#version 450\n"
14855 "\n"
14856 "out block { layout(location=0) int x; } outs;\n"
14857 "out gl_PerVertex {\n"
14858 " vec4 gl_Position;\n"
14859 "};\n"
14860 "void main(){\n"
14861 " outs.x = 0;\n"
14862 " gl_Position = vec4(1);\n"
14863 "}\n";
14864 char const *fsSource =
14865 "#version 450\n"
14866 "\n"
14867 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14868 "layout(location=0) out vec4 color;\n"
14869 "void main(){\n"
14870 " color = vec4(ins.x);\n"
14871 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014872
14873 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14874 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14875
14876 VkPipelineObj pipe(m_device);
14877 pipe.AddColorAttachment();
14878 pipe.AddShader(&vs);
14879 pipe.AddShader(&fs);
14880
14881 VkDescriptorSetObj descriptorSet(m_device);
14882 descriptorSet.AppendDummy();
14883 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14884
14885 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14886
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014887 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014888}
14889
14890TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014891 TEST_DESCRIPTION(
14892 "Test that an error is produced for location mismatches across "
14893 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14894 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014895 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 +130014896
Tony Barbour1fa09702017-03-16 12:09:08 -060014897 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014898 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14899
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014900 char const *vsSource =
14901 "#version 450\n"
14902 "\n"
14903 "out block { layout(location=1) float x; } outs;\n"
14904 "out gl_PerVertex {\n"
14905 " vec4 gl_Position;\n"
14906 "};\n"
14907 "void main(){\n"
14908 " outs.x = 0;\n"
14909 " gl_Position = vec4(1);\n"
14910 "}\n";
14911 char const *fsSource =
14912 "#version 450\n"
14913 "\n"
14914 "in block { layout(location=0) float x; } ins;\n"
14915 "layout(location=0) out vec4 color;\n"
14916 "void main(){\n"
14917 " color = vec4(ins.x);\n"
14918 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014919
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 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14933
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014934 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014935}
14936
14937TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014938 TEST_DESCRIPTION(
14939 "Test that an error is produced for component mismatches across the "
14940 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14941 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014942 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 +130014943
Tony Barbour1fa09702017-03-16 12:09:08 -060014944 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14946
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014947 char const *vsSource =
14948 "#version 450\n"
14949 "\n"
14950 "out block { layout(location=0, component=0) float x; } outs;\n"
14951 "out gl_PerVertex {\n"
14952 " vec4 gl_Position;\n"
14953 "};\n"
14954 "void main(){\n"
14955 " outs.x = 0;\n"
14956 " gl_Position = vec4(1);\n"
14957 "}\n";
14958 char const *fsSource =
14959 "#version 450\n"
14960 "\n"
14961 "in block { layout(location=0, component=1) float x; } ins;\n"
14962 "layout(location=0) out vec4 color;\n"
14963 "void main(){\n"
14964 " color = vec4(ins.x);\n"
14965 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014966
14967 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14968 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14969
14970 VkPipelineObj pipe(m_device);
14971 pipe.AddColorAttachment();
14972 pipe.AddShader(&vs);
14973 pipe.AddShader(&fs);
14974
14975 VkDescriptorSetObj descriptorSet(m_device);
14976 descriptorSet.AppendDummy();
14977 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14978
14979 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14980
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014981 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014982}
14983
Chris Forbes1f3b0152016-11-30 12:48:40 +130014984TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14985 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14986
Tony Barbour1fa09702017-03-16 12:09:08 -060014987 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14989
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014990 char const *vsSource =
14991 "#version 450\n"
14992 "layout(location=0) out mediump float x;\n"
14993 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14994 char const *fsSource =
14995 "#version 450\n"
14996 "layout(location=0) in highp float x;\n"
14997 "layout(location=0) out vec4 color;\n"
14998 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014999
15000 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15001 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15002
15003 VkPipelineObj pipe(m_device);
15004 pipe.AddColorAttachment();
15005 pipe.AddShader(&vs);
15006 pipe.AddShader(&fs);
15007
15008 VkDescriptorSetObj descriptorSet(m_device);
15009 descriptorSet.AppendDummy();
15010 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15011
15012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15013
15014 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15015
15016 m_errorMonitor->VerifyFound();
15017}
15018
Chris Forbes870a39e2016-11-30 12:55:56 +130015019TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
15020 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15021
Tony Barbour1fa09702017-03-16 12:09:08 -060015022 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130015023 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15024
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015025 char const *vsSource =
15026 "#version 450\n"
15027 "out block { layout(location=0) mediump float x; };\n"
15028 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15029 char const *fsSource =
15030 "#version 450\n"
15031 "in block { layout(location=0) highp float x; };\n"
15032 "layout(location=0) out vec4 color;\n"
15033 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130015034
15035 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15036 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15037
15038 VkPipelineObj pipe(m_device);
15039 pipe.AddColorAttachment();
15040 pipe.AddShader(&vs);
15041 pipe.AddShader(&fs);
15042
15043 VkDescriptorSetObj descriptorSet(m_device);
15044 descriptorSet.AppendDummy();
15045 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15046
15047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15048
15049 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15050
15051 m_errorMonitor->VerifyFound();
15052}
15053
Karl Schultz6addd812016-02-02 17:17:23 -070015054TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015055 TEST_DESCRIPTION(
15056 "Test that a warning is produced for a vertex attribute which is "
15057 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015059
Tony Barbour1fa09702017-03-16 12:09:08 -060015060 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120015062
15063 VkVertexInputBindingDescription input_binding;
15064 memset(&input_binding, 0, sizeof(input_binding));
15065
15066 VkVertexInputAttributeDescription input_attrib;
15067 memset(&input_attrib, 0, sizeof(input_attrib));
15068 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15069
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015070 char const *vsSource =
15071 "#version 450\n"
15072 "\n"
15073 "out gl_PerVertex {\n"
15074 " vec4 gl_Position;\n"
15075 "};\n"
15076 "void main(){\n"
15077 " gl_Position = vec4(1);\n"
15078 "}\n";
15079 char const *fsSource =
15080 "#version 450\n"
15081 "\n"
15082 "layout(location=0) out vec4 color;\n"
15083 "void main(){\n"
15084 " color = vec4(1);\n"
15085 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120015086
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015087 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15088 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120015089
15090 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015091 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120015092 pipe.AddShader(&vs);
15093 pipe.AddShader(&fs);
15094
15095 pipe.AddVertexInputBindings(&input_binding, 1);
15096 pipe.AddVertexInputAttribs(&input_attrib, 1);
15097
Chris Forbesde136e02015-05-25 11:13:28 +120015098 VkDescriptorSetObj descriptorSet(m_device);
15099 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015100 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120015101
Tony Barbour5781e8f2015-08-04 16:23:11 -060015102 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120015103
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015104 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120015105}
15106
Karl Schultz6addd812016-02-02 17:17:23 -070015107TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015108 TEST_DESCRIPTION(
15109 "Test that a warning is produced for a location mismatch on "
15110 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015112
Tony Barbour1fa09702017-03-16 12:09:08 -060015113 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130015114 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15115
15116 VkVertexInputBindingDescription input_binding;
15117 memset(&input_binding, 0, sizeof(input_binding));
15118
15119 VkVertexInputAttributeDescription input_attrib;
15120 memset(&input_attrib, 0, sizeof(input_attrib));
15121 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15122
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015123 char const *vsSource =
15124 "#version 450\n"
15125 "\n"
15126 "layout(location=1) in float x;\n"
15127 "out gl_PerVertex {\n"
15128 " vec4 gl_Position;\n"
15129 "};\n"
15130 "void main(){\n"
15131 " gl_Position = vec4(x);\n"
15132 "}\n";
15133 char const *fsSource =
15134 "#version 450\n"
15135 "\n"
15136 "layout(location=0) out vec4 color;\n"
15137 "void main(){\n"
15138 " color = vec4(1);\n"
15139 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130015140
15141 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15142 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15143
15144 VkPipelineObj pipe(m_device);
15145 pipe.AddColorAttachment();
15146 pipe.AddShader(&vs);
15147 pipe.AddShader(&fs);
15148
15149 pipe.AddVertexInputBindings(&input_binding, 1);
15150 pipe.AddVertexInputAttribs(&input_attrib, 1);
15151
15152 VkDescriptorSetObj descriptorSet(m_device);
15153 descriptorSet.AppendDummy();
15154 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15155
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015156 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015157 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15158
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015159 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130015160}
15161
Karl Schultz6addd812016-02-02 17:17:23 -070015162TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015163 TEST_DESCRIPTION(
15164 "Test that an error is produced for a vertex shader input which is not "
15165 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15167 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015168
Tony Barbour1fa09702017-03-16 12:09:08 -060015169 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015170 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120015171
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015172 char const *vsSource =
15173 "#version 450\n"
15174 "\n"
15175 "layout(location=0) in vec4 x;\n" /* not provided */
15176 "out gl_PerVertex {\n"
15177 " vec4 gl_Position;\n"
15178 "};\n"
15179 "void main(){\n"
15180 " gl_Position = x;\n"
15181 "}\n";
15182 char const *fsSource =
15183 "#version 450\n"
15184 "\n"
15185 "layout(location=0) out vec4 color;\n"
15186 "void main(){\n"
15187 " color = vec4(1);\n"
15188 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120015189
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015190 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15191 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120015192
15193 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015194 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120015195 pipe.AddShader(&vs);
15196 pipe.AddShader(&fs);
15197
Chris Forbes62e8e502015-05-25 11:13:29 +120015198 VkDescriptorSetObj descriptorSet(m_device);
15199 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015200 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120015201
Tony Barbour5781e8f2015-08-04 16:23:11 -060015202 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120015203
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015204 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120015205}
15206
Karl Schultz6addd812016-02-02 17:17:23 -070015207TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015208 TEST_DESCRIPTION(
15209 "Test that an error is produced for a mismatch between the "
15210 "fundamental type (float/int/uint) of an attribute and the "
15211 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015212 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 -060015213
Tony Barbour1fa09702017-03-16 12:09:08 -060015214 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015215 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015216
15217 VkVertexInputBindingDescription input_binding;
15218 memset(&input_binding, 0, sizeof(input_binding));
15219
15220 VkVertexInputAttributeDescription input_attrib;
15221 memset(&input_attrib, 0, sizeof(input_attrib));
15222 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15223
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015224 char const *vsSource =
15225 "#version 450\n"
15226 "\n"
15227 "layout(location=0) in int x;\n" /* attrib provided float */
15228 "out gl_PerVertex {\n"
15229 " vec4 gl_Position;\n"
15230 "};\n"
15231 "void main(){\n"
15232 " gl_Position = vec4(x);\n"
15233 "}\n";
15234 char const *fsSource =
15235 "#version 450\n"
15236 "\n"
15237 "layout(location=0) out vec4 color;\n"
15238 "void main(){\n"
15239 " color = vec4(1);\n"
15240 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120015241
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015242 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15243 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015244
15245 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015246 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015247 pipe.AddShader(&vs);
15248 pipe.AddShader(&fs);
15249
15250 pipe.AddVertexInputBindings(&input_binding, 1);
15251 pipe.AddVertexInputAttribs(&input_attrib, 1);
15252
Chris Forbesc97d98e2015-05-25 11:13:31 +120015253 VkDescriptorSetObj descriptorSet(m_device);
15254 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015255 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015256
Tony Barbour5781e8f2015-08-04 16:23:11 -060015257 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015258
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015259 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015260}
15261
Chris Forbesc68b43c2016-04-06 11:18:47 +120015262TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015263 TEST_DESCRIPTION(
15264 "Test that an error is produced for a pipeline containing multiple "
15265 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15267 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120015268
Tony Barbour1fa09702017-03-16 12:09:08 -060015269 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120015270 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15271
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015272 char const *vsSource =
15273 "#version 450\n"
15274 "\n"
15275 "out gl_PerVertex {\n"
15276 " vec4 gl_Position;\n"
15277 "};\n"
15278 "void main(){\n"
15279 " gl_Position = vec4(1);\n"
15280 "}\n";
15281 char const *fsSource =
15282 "#version 450\n"
15283 "\n"
15284 "layout(location=0) out vec4 color;\n"
15285 "void main(){\n"
15286 " color = vec4(1);\n"
15287 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120015288
15289 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15290 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15291
15292 VkPipelineObj pipe(m_device);
15293 pipe.AddColorAttachment();
15294 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015295 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120015296 pipe.AddShader(&fs);
15297
15298 VkDescriptorSetObj descriptorSet(m_device);
15299 descriptorSet.AppendDummy();
15300 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15301
15302 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15303
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015304 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120015305}
15306
Chris Forbes82ff92a2016-09-09 10:50:24 +120015307TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120015309
Tony Barbour1fa09702017-03-16 12:09:08 -060015310 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120015311 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15312
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015313 char const *vsSource =
15314 "#version 450\n"
15315 "out gl_PerVertex {\n"
15316 " vec4 gl_Position;\n"
15317 "};\n"
15318 "void main(){\n"
15319 " gl_Position = vec4(0);\n"
15320 "}\n";
15321 char const *fsSource =
15322 "#version 450\n"
15323 "\n"
15324 "layout(location=0) out vec4 color;\n"
15325 "void main(){\n"
15326 " color = vec4(1);\n"
15327 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120015328
15329 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15330 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
15331
15332 VkPipelineObj pipe(m_device);
15333 pipe.AddColorAttachment();
15334 pipe.AddShader(&vs);
15335 pipe.AddShader(&fs);
15336
15337 VkDescriptorSetObj descriptorSet(m_device);
15338 descriptorSet.AppendDummy();
15339 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15340
15341 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15342
15343 m_errorMonitor->VerifyFound();
15344}
15345
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015346TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15348 "pDepthStencilState is NULL when rasterization is enabled and subpass "
15349 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015350
Tony Barbour1fa09702017-03-16 12:09:08 -060015351 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15353
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015354 char const *vsSource =
15355 "#version 450\n"
15356 "void main(){ gl_Position = vec4(0); }\n";
15357 char const *fsSource =
15358 "#version 450\n"
15359 "\n"
15360 "layout(location=0) out vec4 color;\n"
15361 "void main(){\n"
15362 " color = vec4(1);\n"
15363 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015364
15365 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15366 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15367
15368 VkPipelineObj pipe(m_device);
15369 pipe.AddColorAttachment();
15370 pipe.AddShader(&vs);
15371 pipe.AddShader(&fs);
15372
15373 VkDescriptorSetObj descriptorSet(m_device);
15374 descriptorSet.AppendDummy();
15375 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15376
15377 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015378 {
15379 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15380 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15381 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015382 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015383 {
15384 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15385 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15386 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015387 },
15388 };
15389 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015390 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015391 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015392 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
15393 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015394 VkRenderPass rp;
15395 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15396 ASSERT_VK_SUCCESS(err);
15397
15398 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
15399
15400 m_errorMonitor->VerifyFound();
15401
15402 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15403}
15404
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015405TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015406 TEST_DESCRIPTION(
15407 "Test that an error is produced for a variable output from "
15408 "the TCS without the patch decoration, but consumed in the TES "
15409 "with the decoration.");
15410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15411 "is per-vertex in tessellation control shader stage "
15412 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120015413
Tony Barbour1fa09702017-03-16 12:09:08 -060015414 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120015415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15416
Chris Forbesc1e852d2016-04-04 19:26:42 +120015417 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070015418 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120015419 return;
15420 }
15421
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015422 char const *vsSource =
15423 "#version 450\n"
15424 "void main(){}\n";
15425 char const *tcsSource =
15426 "#version 450\n"
15427 "layout(location=0) out int x[];\n"
15428 "layout(vertices=3) out;\n"
15429 "void main(){\n"
15430 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15431 " gl_TessLevelInner[0] = 1;\n"
15432 " x[gl_InvocationID] = gl_InvocationID;\n"
15433 "}\n";
15434 char const *tesSource =
15435 "#version 450\n"
15436 "layout(triangles, equal_spacing, cw) in;\n"
15437 "layout(location=0) patch in int x;\n"
15438 "out gl_PerVertex { vec4 gl_Position; };\n"
15439 "void main(){\n"
15440 " gl_Position.xyz = gl_TessCoord;\n"
15441 " gl_Position.w = x;\n"
15442 "}\n";
15443 char const *fsSource =
15444 "#version 450\n"
15445 "layout(location=0) out vec4 color;\n"
15446 "void main(){\n"
15447 " color = vec4(1);\n"
15448 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015449
15450 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15451 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15452 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15453 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015455 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15456 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015457
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015458 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015459
15460 VkPipelineObj pipe(m_device);
15461 pipe.SetInputAssembly(&iasci);
15462 pipe.SetTessellation(&tsci);
15463 pipe.AddColorAttachment();
15464 pipe.AddShader(&vs);
15465 pipe.AddShader(&tcs);
15466 pipe.AddShader(&tes);
15467 pipe.AddShader(&fs);
15468
15469 VkDescriptorSetObj descriptorSet(m_device);
15470 descriptorSet.AppendDummy();
15471 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15472
15473 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15474
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015475 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015476}
15477
Cort Stratton2bcca1b2017-05-05 16:02:35 -070015478TEST_F(VkLayerTest, CreatePipelineTessErrors) {
15479 TEST_DESCRIPTION("Test various errors when creating a graphics pipeline with tessellation stages active.");
15480
15481 ASSERT_NO_FATAL_FAILURE(Init());
15482 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15483
15484 if (!m_device->phy().features().tessellationShader) {
15485 printf(" Device does not support tessellation shaders; skipped.\n");
15486 return;
15487 }
15488
15489 char const *vsSource =
15490 "#version 450\n"
15491 "void main(){}\n";
15492 char const *tcsSource =
15493 "#version 450\n"
15494 "layout(vertices=3) out;\n"
15495 "void main(){\n"
15496 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15497 " gl_TessLevelInner[0] = 1;\n"
15498 "}\n";
15499 char const *tesSource =
15500 "#version 450\n"
15501 "layout(triangles, equal_spacing, cw) in;\n"
15502 "out gl_PerVertex { vec4 gl_Position; };\n"
15503 "void main(){\n"
15504 " gl_Position.xyz = gl_TessCoord;\n"
15505 " gl_Position.w = 0;\n"
15506 "}\n";
15507 char const *fsSource =
15508 "#version 450\n"
15509 "layout(location=0) out vec4 color;\n"
15510 "void main(){\n"
15511 " color = vec4(1);\n"
15512 "}\n";
15513
15514 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15515 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15516 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15517 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15518
15519 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15520 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
15521
15522 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
15523
15524 VkDescriptorSetObj descriptorSet(m_device);
15525 descriptorSet.AppendDummy();
15526 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15527
15528 {
15529 VkPipelineObj pipe(m_device);
15530 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15531 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15532 pipe.SetInputAssembly(&iasci_bad);
15533 pipe.AddColorAttachment();
15534 pipe.AddShader(&vs);
15535 pipe.AddShader(&fs);
15536
15537 // Pass a tess control shader without a tess eval shader
15538 pipe.AddShader(&tcs);
15539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00534);
15540 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15541 m_errorMonitor->VerifyFound();
15542 }
15543
15544 {
15545 VkPipelineObj pipe(m_device);
15546 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15547 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15548 pipe.SetInputAssembly(&iasci_bad);
15549 pipe.AddColorAttachment();
15550 pipe.AddShader(&vs);
15551 pipe.AddShader(&fs);
15552
15553 // Pass a tess eval shader without a tess control shader
15554 pipe.AddShader(&tes);
15555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00535);
15556 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15557 m_errorMonitor->VerifyFound();
15558 }
15559
15560 {
15561 VkPipelineObj pipe(m_device);
15562 pipe.SetInputAssembly(&iasci);
15563 pipe.AddColorAttachment();
15564 pipe.AddShader(&vs);
15565 pipe.AddShader(&fs);
15566
15567 // Pass patch topology without tessellation shaders
15568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02100);
15569 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15570 m_errorMonitor->VerifyFound();
15571
15572 pipe.AddShader(&tcs);
15573 pipe.AddShader(&tes);
15574 // Pass a NULL pTessellationState (with active tessellation shader stages)
15575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00536);
15576 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15577 m_errorMonitor->VerifyFound();
15578
15579 // Pass an invalid pTessellationState (bad sType)
15580 VkPipelineTessellationStateCreateInfo tsci_bad = tsci;
15581 tsci_bad.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
15582 pipe.SetTessellation(&tsci_bad);
15583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01427);
15584 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15585 m_errorMonitor->VerifyFound();
15586 // Pass out-of-range patchControlPoints
15587 tsci_bad = tsci;
15588 tsci_bad.patchControlPoints = 0;
15589 pipe.SetTessellation(&tsci);
15590 pipe.SetTessellation(&tsci_bad);
15591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15592 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15593 m_errorMonitor->VerifyFound();
15594 tsci_bad.patchControlPoints = m_device->props.limits.maxTessellationPatchSize + 1;
15595 pipe.SetTessellation(&tsci_bad);
15596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15597 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15598 m_errorMonitor->VerifyFound();
15599 pipe.SetTessellation(&tsci);
15600
15601 // Pass an invalid primitive topology
15602 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15603 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
15604 pipe.SetInputAssembly(&iasci_bad);
15605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02099);
15606 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15607 m_errorMonitor->VerifyFound();
15608 pipe.SetInputAssembly(&iasci);
15609 }
15610}
15611
Karl Schultz6addd812016-02-02 17:17:23 -070015612TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015613 TEST_DESCRIPTION(
15614 "Test that an error is produced for a vertex attribute setup where multiple "
15615 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15617 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015618
Tony Barbour1fa09702017-03-16 12:09:08 -060015619 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015620 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015621
15622 /* Two binding descriptions for binding 0 */
15623 VkVertexInputBindingDescription input_bindings[2];
15624 memset(input_bindings, 0, sizeof(input_bindings));
15625
15626 VkVertexInputAttributeDescription input_attrib;
15627 memset(&input_attrib, 0, sizeof(input_attrib));
15628 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15629
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015630 char const *vsSource =
15631 "#version 450\n"
15632 "\n"
15633 "layout(location=0) in float x;\n" /* attrib provided float */
15634 "out gl_PerVertex {\n"
15635 " vec4 gl_Position;\n"
15636 "};\n"
15637 "void main(){\n"
15638 " gl_Position = vec4(x);\n"
15639 "}\n";
15640 char const *fsSource =
15641 "#version 450\n"
15642 "\n"
15643 "layout(location=0) out vec4 color;\n"
15644 "void main(){\n"
15645 " color = vec4(1);\n"
15646 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015647
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015648 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15649 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015650
15651 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015652 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015653 pipe.AddShader(&vs);
15654 pipe.AddShader(&fs);
15655
15656 pipe.AddVertexInputBindings(input_bindings, 2);
15657 pipe.AddVertexInputAttribs(&input_attrib, 1);
15658
Chris Forbes280ba2c2015-06-12 11:16:41 +120015659 VkDescriptorSetObj descriptorSet(m_device);
15660 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015661 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015662
Tony Barbour5781e8f2015-08-04 16:23:11 -060015663 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015664
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015665 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015666}
Chris Forbes8f68b562015-05-25 11:13:32 +120015667
Karl Schultz6addd812016-02-02 17:17:23 -070015668TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015669 TEST_DESCRIPTION(
15670 "Test that an error is produced for a fragment shader which does not "
15671 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015673
Tony Barbour1fa09702017-03-16 12:09:08 -060015674 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015675
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015676 char const *vsSource =
15677 "#version 450\n"
15678 "\n"
15679 "out gl_PerVertex {\n"
15680 " vec4 gl_Position;\n"
15681 "};\n"
15682 "void main(){\n"
15683 " gl_Position = vec4(1);\n"
15684 "}\n";
15685 char const *fsSource =
15686 "#version 450\n"
15687 "\n"
15688 "void main(){\n"
15689 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015690
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015691 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15692 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015693
15694 VkPipelineObj pipe(m_device);
15695 pipe.AddShader(&vs);
15696 pipe.AddShader(&fs);
15697
Chia-I Wu08accc62015-07-07 11:50:03 +080015698 /* set up CB 0, not written */
15699 pipe.AddColorAttachment();
15700 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015701
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015702 VkDescriptorSetObj descriptorSet(m_device);
15703 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015704 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015705
Tony Barbour5781e8f2015-08-04 16:23:11 -060015706 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015707
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015708 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015709}
15710
Karl Schultz6addd812016-02-02 17:17:23 -070015711TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015712 TEST_DESCRIPTION(
15713 "Test that a warning is produced for a fragment shader which provides a spurious "
15714 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015716 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015717
Tony Barbour1fa09702017-03-16 12:09:08 -060015718 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015719
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015720 char const *vsSource =
15721 "#version 450\n"
15722 "\n"
15723 "out gl_PerVertex {\n"
15724 " vec4 gl_Position;\n"
15725 "};\n"
15726 "void main(){\n"
15727 " gl_Position = vec4(1);\n"
15728 "}\n";
15729 char const *fsSource =
15730 "#version 450\n"
15731 "\n"
15732 "layout(location=0) out vec4 x;\n"
15733 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15734 "void main(){\n"
15735 " x = vec4(1);\n"
15736 " y = vec4(1);\n"
15737 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015738
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015739 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15740 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015741
15742 VkPipelineObj pipe(m_device);
15743 pipe.AddShader(&vs);
15744 pipe.AddShader(&fs);
15745
Chia-I Wu08accc62015-07-07 11:50:03 +080015746 /* set up CB 0, not written */
15747 pipe.AddColorAttachment();
15748 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015749 /* FS writes CB 1, but we don't configure it */
15750
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015751 VkDescriptorSetObj descriptorSet(m_device);
15752 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015753 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015754
Tony Barbour5781e8f2015-08-04 16:23:11 -060015755 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015756
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015757 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015758}
15759
Karl Schultz6addd812016-02-02 17:17:23 -070015760TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015761 TEST_DESCRIPTION(
15762 "Test that an error is produced for a mismatch between the fundamental "
15763 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015765
Tony Barbour1fa09702017-03-16 12:09:08 -060015766 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015767
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015768 char const *vsSource =
15769 "#version 450\n"
15770 "\n"
15771 "out gl_PerVertex {\n"
15772 " vec4 gl_Position;\n"
15773 "};\n"
15774 "void main(){\n"
15775 " gl_Position = vec4(1);\n"
15776 "}\n";
15777 char const *fsSource =
15778 "#version 450\n"
15779 "\n"
15780 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15781 "void main(){\n"
15782 " x = ivec4(1);\n"
15783 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015784
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015785 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15786 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015787
15788 VkPipelineObj pipe(m_device);
15789 pipe.AddShader(&vs);
15790 pipe.AddShader(&fs);
15791
Chia-I Wu08accc62015-07-07 11:50:03 +080015792 /* set up CB 0; type is UNORM by default */
15793 pipe.AddColorAttachment();
15794 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015795
Chris Forbesa36d69e2015-05-25 11:13:44 +120015796 VkDescriptorSetObj descriptorSet(m_device);
15797 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015798 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015799
Tony Barbour5781e8f2015-08-04 16:23:11 -060015800 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015801
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015802 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015803}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015804
Karl Schultz6addd812016-02-02 17:17:23 -070015805TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015806 TEST_DESCRIPTION(
15807 "Test that an error is produced for a shader consuming a uniform "
15808 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015810
Tony Barbour1fa09702017-03-16 12:09:08 -060015811 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015812
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015813 char const *vsSource =
15814 "#version 450\n"
15815 "\n"
15816 "out gl_PerVertex {\n"
15817 " vec4 gl_Position;\n"
15818 "};\n"
15819 "void main(){\n"
15820 " gl_Position = vec4(1);\n"
15821 "}\n";
15822 char const *fsSource =
15823 "#version 450\n"
15824 "\n"
15825 "layout(location=0) out vec4 x;\n"
15826 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15827 "void main(){\n"
15828 " x = vec4(bar.y);\n"
15829 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015830
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015831 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15832 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015833
Chris Forbes556c76c2015-08-14 12:04:59 +120015834 VkPipelineObj pipe(m_device);
15835 pipe.AddShader(&vs);
15836 pipe.AddShader(&fs);
15837
15838 /* set up CB 0; type is UNORM by default */
15839 pipe.AddColorAttachment();
15840 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15841
15842 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015843 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015844
15845 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15846
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015847 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015848}
15849
Chris Forbes5c59e902016-02-26 16:56:09 +130015850TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015851 TEST_DESCRIPTION(
15852 "Test that an error is produced for a shader consuming push constants "
15853 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015855
Tony Barbour1fa09702017-03-16 12:09:08 -060015856 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015857
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015858 char const *vsSource =
15859 "#version 450\n"
15860 "\n"
15861 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15862 "out gl_PerVertex {\n"
15863 " vec4 gl_Position;\n"
15864 "};\n"
15865 "void main(){\n"
15866 " gl_Position = vec4(consts.x);\n"
15867 "}\n";
15868 char const *fsSource =
15869 "#version 450\n"
15870 "\n"
15871 "layout(location=0) out vec4 x;\n"
15872 "void main(){\n"
15873 " x = vec4(1);\n"
15874 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015875
15876 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15877 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15878
15879 VkPipelineObj pipe(m_device);
15880 pipe.AddShader(&vs);
15881 pipe.AddShader(&fs);
15882
15883 /* set up CB 0; type is UNORM by default */
15884 pipe.AddColorAttachment();
15885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15886
15887 VkDescriptorSetObj descriptorSet(m_device);
15888 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15889
15890 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15891
15892 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015893 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015894}
15895
Chris Forbes3fb17902016-08-22 14:57:55 +120015896TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015897 TEST_DESCRIPTION(
15898 "Test that an error is produced for a shader consuming an input attachment "
15899 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15901 "consumes input attachment index 0 but not provided in subpass");
15902
Tony Barbour1fa09702017-03-16 12:09:08 -060015903 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015904
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015905 char const *vsSource =
15906 "#version 450\n"
15907 "\n"
15908 "out gl_PerVertex {\n"
15909 " vec4 gl_Position;\n"
15910 "};\n"
15911 "void main(){\n"
15912 " gl_Position = vec4(1);\n"
15913 "}\n";
15914 char const *fsSource =
15915 "#version 450\n"
15916 "\n"
15917 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15918 "layout(location=0) out vec4 color;\n"
15919 "void main() {\n"
15920 " color = subpassLoad(x);\n"
15921 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015922
15923 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15924 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15925
15926 VkPipelineObj pipe(m_device);
15927 pipe.AddShader(&vs);
15928 pipe.AddShader(&fs);
15929 pipe.AddColorAttachment();
15930 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15931
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015932 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15933 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015934 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015935 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015936 ASSERT_VK_SUCCESS(err);
15937
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015938 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015939 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015940 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015941 ASSERT_VK_SUCCESS(err);
15942
15943 // error here.
15944 pipe.CreateVKPipeline(pl, renderPass());
15945
15946 m_errorMonitor->VerifyFound();
15947
15948 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15949 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15950}
15951
Chris Forbes5a9a0472016-08-22 16:02:09 +120015952TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015953 TEST_DESCRIPTION(
15954 "Test that an error is produced for a shader consuming an input attachment "
15955 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15957 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15958
Tony Barbour1fa09702017-03-16 12:09:08 -060015959 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015960
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015961 char const *vsSource =
15962 "#version 450\n"
15963 "\n"
15964 "out gl_PerVertex {\n"
15965 " vec4 gl_Position;\n"
15966 "};\n"
15967 "void main(){\n"
15968 " gl_Position = vec4(1);\n"
15969 "}\n";
15970 char const *fsSource =
15971 "#version 450\n"
15972 "\n"
15973 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15974 "layout(location=0) out vec4 color;\n"
15975 "void main() {\n"
15976 " color = subpassLoad(x);\n"
15977 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015978
15979 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15980 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15981
15982 VkPipelineObj pipe(m_device);
15983 pipe.AddShader(&vs);
15984 pipe.AddShader(&fs);
15985 pipe.AddColorAttachment();
15986 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15987
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015988 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15989 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015990 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015991 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015992 ASSERT_VK_SUCCESS(err);
15993
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015994 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015995 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015996 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015997 ASSERT_VK_SUCCESS(err);
15998
15999 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016000 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16001 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16002 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
16003 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16004 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 +120016005 };
16006 VkAttachmentReference color = {
16007 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16008 };
16009 VkAttachmentReference input = {
16010 1, VK_IMAGE_LAYOUT_GENERAL,
16011 };
16012
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016013 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016014
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016015 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016016 VkRenderPass rp;
16017 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
16018 ASSERT_VK_SUCCESS(err);
16019
16020 // error here.
16021 pipe.CreateVKPipeline(pl, rp);
16022
16023 m_errorMonitor->VerifyFound();
16024
16025 vkDestroyRenderPass(m_device->device(), rp, nullptr);
16026 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16027 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16028}
16029
Chris Forbes541f7b02016-08-22 15:30:27 +120016030TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016031 TEST_DESCRIPTION(
16032 "Test that an error is produced for a shader consuming an input attachment "
16033 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120016034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070016035 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120016036
Tony Barbour1fa09702017-03-16 12:09:08 -060016037 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120016038
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016039 char const *vsSource =
16040 "#version 450\n"
16041 "\n"
16042 "out gl_PerVertex {\n"
16043 " vec4 gl_Position;\n"
16044 "};\n"
16045 "void main(){\n"
16046 " gl_Position = vec4(1);\n"
16047 "}\n";
16048 char const *fsSource =
16049 "#version 450\n"
16050 "\n"
16051 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
16052 "layout(location=0) out vec4 color;\n"
16053 "void main() {\n"
16054 " color = subpassLoad(xs[0]);\n"
16055 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120016056
16057 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16058 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16059
16060 VkPipelineObj pipe(m_device);
16061 pipe.AddShader(&vs);
16062 pipe.AddShader(&fs);
16063 pipe.AddColorAttachment();
16064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16065
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016066 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16067 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120016068 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016069 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016070 ASSERT_VK_SUCCESS(err);
16071
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016072 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120016073 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016074 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016075 ASSERT_VK_SUCCESS(err);
16076
16077 // error here.
16078 pipe.CreateVKPipeline(pl, renderPass());
16079
16080 m_errorMonitor->VerifyFound();
16081
16082 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16083 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16084}
16085
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016086TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016087 TEST_DESCRIPTION(
16088 "Test that an error is produced for a compute pipeline consuming a "
16089 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016091
Tony Barbour1fa09702017-03-16 12:09:08 -060016092 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016093
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016094 char const *csSource =
16095 "#version 450\n"
16096 "\n"
16097 "layout(local_size_x=1) in;\n"
16098 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16099 "void main(){\n"
16100 " x = vec4(1);\n"
16101 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016102
16103 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16104
16105 VkDescriptorSetObj descriptorSet(m_device);
16106 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016108 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16109 nullptr,
16110 0,
16111 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16112 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16113 descriptorSet.GetPipelineLayout(),
16114 VK_NULL_HANDLE,
16115 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016116
16117 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016118 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016119
16120 m_errorMonitor->VerifyFound();
16121
16122 if (err == VK_SUCCESS) {
16123 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16124 }
16125}
16126
Chris Forbes22a9b092016-07-19 14:34:05 +120016127TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016128 TEST_DESCRIPTION(
16129 "Test that an error is produced for a pipeline consuming a "
16130 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16132 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120016133
Tony Barbour1fa09702017-03-16 12:09:08 -060016134 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120016135
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016136 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
16137 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120016138 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016139 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016140 ASSERT_VK_SUCCESS(err);
16141
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016142 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120016143 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016144 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016145 ASSERT_VK_SUCCESS(err);
16146
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016147 char const *csSource =
16148 "#version 450\n"
16149 "\n"
16150 "layout(local_size_x=1) in;\n"
16151 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16152 "void main() {\n"
16153 " x.x = 1.0f;\n"
16154 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120016155 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16156
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016157 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16158 nullptr,
16159 0,
16160 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16161 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16162 pl,
16163 VK_NULL_HANDLE,
16164 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120016165
16166 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016167 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120016168
16169 m_errorMonitor->VerifyFound();
16170
16171 if (err == VK_SUCCESS) {
16172 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16173 }
16174
16175 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16176 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16177}
16178
Chris Forbes50020592016-07-27 13:52:41 +120016179TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016180 TEST_DESCRIPTION(
16181 "Test that an error is produced when an image view type "
16182 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120016183
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016184 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 +120016185
Tony Barbour1fa09702017-03-16 12:09:08 -060016186 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120016187 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16188
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016189 char const *vsSource =
16190 "#version 450\n"
16191 "\n"
16192 "out gl_PerVertex { vec4 gl_Position; };\n"
16193 "void main() { gl_Position = vec4(0); }\n";
16194 char const *fsSource =
16195 "#version 450\n"
16196 "\n"
16197 "layout(set=0, binding=0) uniform sampler3D s;\n"
16198 "layout(location=0) out vec4 color;\n"
16199 "void main() {\n"
16200 " color = texture(s, vec3(0));\n"
16201 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120016202 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16203 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16204
16205 VkPipelineObj pipe(m_device);
16206 pipe.AddShader(&vs);
16207 pipe.AddShader(&fs);
16208 pipe.AddColorAttachment();
16209
16210 VkTextureObj texture(m_device, nullptr);
16211 VkSamplerObj sampler(m_device);
16212
16213 VkDescriptorSetObj descriptorSet(m_device);
16214 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16215 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16216
16217 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16218 ASSERT_VK_SUCCESS(err);
16219
Tony Barbour552f6c02016-12-21 14:34:07 -070016220 m_commandBuffer->BeginCommandBuffer();
16221 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120016222
16223 m_commandBuffer->BindPipeline(pipe);
16224 m_commandBuffer->BindDescriptorSet(descriptorSet);
16225
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016226 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120016227 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016228 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120016229 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16230
16231 // error produced here.
16232 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16233
16234 m_errorMonitor->VerifyFound();
16235
Tony Barbour552f6c02016-12-21 14:34:07 -070016236 m_commandBuffer->EndRenderPass();
16237 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120016238}
16239
Chris Forbes5533bfc2016-07-27 14:12:34 +120016240TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016241 TEST_DESCRIPTION(
16242 "Test that an error is produced when a multisampled images "
16243 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016244
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016246
Tony Barbour1fa09702017-03-16 12:09:08 -060016247 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120016248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16249
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016250 char const *vsSource =
16251 "#version 450\n"
16252 "\n"
16253 "out gl_PerVertex { vec4 gl_Position; };\n"
16254 "void main() { gl_Position = vec4(0); }\n";
16255 char const *fsSource =
16256 "#version 450\n"
16257 "\n"
16258 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
16259 "layout(location=0) out vec4 color;\n"
16260 "void main() {\n"
16261 " color = texelFetch(s, ivec2(0), 0);\n"
16262 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120016263 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16264 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16265
16266 VkPipelineObj pipe(m_device);
16267 pipe.AddShader(&vs);
16268 pipe.AddShader(&fs);
16269 pipe.AddColorAttachment();
16270
16271 VkTextureObj texture(m_device, nullptr);
16272 VkSamplerObj sampler(m_device);
16273
16274 VkDescriptorSetObj descriptorSet(m_device);
16275 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16276 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16277
16278 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16279 ASSERT_VK_SUCCESS(err);
16280
Tony Barbour552f6c02016-12-21 14:34:07 -070016281 m_commandBuffer->BeginCommandBuffer();
16282 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120016283
16284 m_commandBuffer->BindPipeline(pipe);
16285 m_commandBuffer->BindDescriptorSet(descriptorSet);
16286
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016287 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016288 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016289 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016290 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16291
16292 // error produced here.
16293 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16294
16295 m_errorMonitor->VerifyFound();
16296
Tony Barbour552f6c02016-12-21 14:34:07 -070016297 m_commandBuffer->EndRenderPass();
16298 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120016299}
16300
Mark Youngc48c4c12016-04-11 14:26:49 -060016301TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016302 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016303
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016304 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16305 {
16306 VkFormatProperties properties;
16307 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16308 if (properties.optimalTilingFeatures == 0) {
16309 printf(" Image format not supported; skipped.\n");
16310 return;
16311 }
16312 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016313
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016314 VkImageCreateInfo info = {};
16315 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16316 info.pNext = NULL;
16317 info.imageType = VK_IMAGE_TYPE_2D;
16318 info.format = format;
16319 info.extent.height = 32;
16320 info.extent.depth = 1;
16321 info.mipLevels = 1;
16322 info.arrayLayers = 1;
16323 info.samples = VK_SAMPLE_COUNT_1_BIT;
16324 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16325 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16326 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016327
16328 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016329 {
16330 VkImageFormatProperties properties;
16331 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
16332 info.tiling, info.usage, info.flags, &properties);
16333 ASSERT_VK_SUCCESS(result);
16334 info.extent.width = properties.maxExtent.width + 1;
16335 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016336
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016337 VkImage image;
16338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
16339 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016340 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016341}
16342
Mark Youngc48c4c12016-04-11 14:26:49 -060016343TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016344 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060016345
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016346 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16347 {
16348 VkFormatProperties properties;
16349 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16350 if (properties.optimalTilingFeatures == 0) {
16351 printf(" Image format not supported; skipped.\n");
16352 return;
16353 }
16354 }
Mark Youngc48c4c12016-04-11 14:26:49 -060016355
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016356 VkImageCreateInfo info = {};
16357 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16358 info.pNext = NULL;
16359 info.imageType = VK_IMAGE_TYPE_2D;
16360 info.format = format;
16361 info.extent.height = 32;
16362 info.extent.depth = 1;
16363 info.mipLevels = 1;
16364 info.arrayLayers = 1;
16365 info.samples = VK_SAMPLE_COUNT_1_BIT;
16366 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16367 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16368 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016369
16370 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016371 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016372
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016373 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060016374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016375 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
16376 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060016377 m_errorMonitor->VerifyFound();
16378}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070016379
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016380TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016381 TEST_DESCRIPTION(
16382 "Create a render pass with an attachment description "
16383 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016384
Tony Barbour1fa09702017-03-16 12:09:08 -060016385 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16387
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070016388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016389
16390 VkAttachmentReference color_attach = {};
16391 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
16392 color_attach.attachment = 0;
16393 VkSubpassDescription subpass = {};
16394 subpass.colorAttachmentCount = 1;
16395 subpass.pColorAttachments = &color_attach;
16396
16397 VkRenderPassCreateInfo rpci = {};
16398 rpci.subpassCount = 1;
16399 rpci.pSubpasses = &subpass;
16400 rpci.attachmentCount = 1;
16401 VkAttachmentDescription attach_desc = {};
16402 attach_desc.format = VK_FORMAT_UNDEFINED;
16403 rpci.pAttachments = &attach_desc;
16404 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
16405 VkRenderPass rp;
16406 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
16407
16408 m_errorMonitor->VerifyFound();
16409
16410 if (result == VK_SUCCESS) {
16411 vkDestroyRenderPass(m_device->device(), rp, NULL);
16412 }
16413}
16414
Karl Schultz6addd812016-02-02 17:17:23 -070016415TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016416 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060016417
Mike Stroyana3082432015-09-25 13:39:21 -060016418 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070016419 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16420 const int32_t tex_width = 32;
16421 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060016422
16423 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016424 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16425 image_create_info.pNext = NULL;
16426 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16427 image_create_info.format = tex_format;
16428 image_create_info.extent.width = tex_width;
16429 image_create_info.extent.height = tex_height;
16430 image_create_info.extent.depth = 1;
16431 image_create_info.mipLevels = 1;
16432 image_create_info.arrayLayers = 1;
16433 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16434 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16435 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16436 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060016437
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016438 VkImage image;
16439 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060016440 ASSERT_VK_SUCCESS(err);
16441
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016442 VkMemoryRequirements requirements;
16443 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
16444
16445 VkMemoryAllocateInfo alloc_info{};
16446 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16447 alloc_info.pNext = NULL;
16448 alloc_info.memoryTypeIndex = 0;
16449 alloc_info.allocationSize = requirements.size;
16450 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16451 ASSERT_TRUE(pass);
16452
16453 VkDeviceMemory memory;
16454 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16455 ASSERT_VK_SUCCESS(err);
16456
16457 err = vkBindImageMemory(m_device->device(), image, memory, 0);
16458
Tobin Ehliscde08892015-09-22 10:11:37 -060016459 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016460 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070016461 image_view_create_info.image = image;
16462 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16463 image_view_create_info.format = tex_format;
16464 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016465 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070016466 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016467 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060016468
16469 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016471 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016472 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016473
16474 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060016475 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060016476}
Mike Stroyana3082432015-09-25 13:39:21 -060016477
Mark Youngd339ba32016-05-30 13:28:35 -060016478TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
16479 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060016480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060016481 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060016482
Tony Barbour1fa09702017-03-16 12:09:08 -060016483 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060016484
16485 // Create an image and try to create a view with no memory backing the image
16486 VkImage image;
16487
16488 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16489 const int32_t tex_width = 32;
16490 const int32_t tex_height = 32;
16491
16492 VkImageCreateInfo image_create_info = {};
16493 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16494 image_create_info.pNext = NULL;
16495 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16496 image_create_info.format = tex_format;
16497 image_create_info.extent.width = tex_width;
16498 image_create_info.extent.height = tex_height;
16499 image_create_info.extent.depth = 1;
16500 image_create_info.mipLevels = 1;
16501 image_create_info.arrayLayers = 1;
16502 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16503 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16504 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16505 image_create_info.flags = 0;
16506
16507 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16508 ASSERT_VK_SUCCESS(err);
16509
16510 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016511 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060016512 image_view_create_info.image = image;
16513 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16514 image_view_create_info.format = tex_format;
16515 image_view_create_info.subresourceRange.layerCount = 1;
16516 image_view_create_info.subresourceRange.baseMipLevel = 0;
16517 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016518 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060016519
16520 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016521 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060016522
16523 m_errorMonitor->VerifyFound();
16524 vkDestroyImage(m_device->device(), image, NULL);
16525 // If last error is success, it still created the view, so delete it.
16526 if (err == VK_SUCCESS) {
16527 vkDestroyImageView(m_device->device(), view, NULL);
16528 }
Mark Youngd339ba32016-05-30 13:28:35 -060016529}
16530
Karl Schultz6addd812016-02-02 17:17:23 -070016531TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016532 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016534
Tony Barbour1fa09702017-03-16 12:09:08 -060016535 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016536
Karl Schultz6addd812016-02-02 17:17:23 -070016537 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016538 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016539 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016540 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016541
16542 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016543 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016544 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070016545 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16546 image_view_create_info.format = tex_format;
16547 image_view_create_info.subresourceRange.baseMipLevel = 0;
16548 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016549 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016550 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016551 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016552
16553 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016554 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016555
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016556 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016557}
16558
Mike Weiblena1e13f42017-02-09 21:25:59 -070016559TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
16560 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
16561
Tony Barbour1fa09702017-03-16 12:09:08 -060016562 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070016563 VkSubresourceLayout subres_layout = {};
16564
16565 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
16566 {
16567 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
16568 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016569 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016570 ASSERT_TRUE(img.initialized());
16571
16572 VkImageSubresource subres = {};
16573 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16574 subres.mipLevel = 0;
16575 subres.arrayLayer = 0;
16576
16577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
16578 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16579 m_errorMonitor->VerifyFound();
16580 }
16581
16582 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
16583 {
16584 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016585 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016586 ASSERT_TRUE(img.initialized());
16587
16588 VkImageSubresource subres = {};
16589 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16590 subres.mipLevel = 0;
16591 subres.arrayLayer = 0;
16592
16593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16595 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16596 m_errorMonitor->VerifyFound();
16597 }
16598
16599 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16600 {
16601 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016602 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016603 ASSERT_TRUE(img.initialized());
16604
16605 VkImageSubresource subres = {};
16606 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16607 subres.mipLevel = 1; // ERROR: triggers VU 00739
16608 subres.arrayLayer = 0;
16609
16610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16611 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16612 m_errorMonitor->VerifyFound();
16613 }
16614
16615 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16616 {
16617 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016618 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016619 ASSERT_TRUE(img.initialized());
16620
16621 VkImageSubresource subres = {};
16622 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16623 subres.mipLevel = 0;
16624 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16625
16626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16627 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16628 m_errorMonitor->VerifyFound();
16629 }
16630}
16631
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016632TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016633 VkResult err;
16634 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016635
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016637
Tony Barbour1fa09702017-03-16 12:09:08 -060016638 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016639
16640 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016641 VkImage srcImage;
16642 VkImage dstImage;
16643 VkDeviceMemory srcMem;
16644 VkDeviceMemory destMem;
16645 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016646
16647 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016648 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16649 image_create_info.pNext = NULL;
16650 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16651 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16652 image_create_info.extent.width = 32;
16653 image_create_info.extent.height = 32;
16654 image_create_info.extent.depth = 1;
16655 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016656 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016657 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16658 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16659 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16660 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016661
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016662 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016663 ASSERT_VK_SUCCESS(err);
16664
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016665 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016666 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016667 ASSERT_VK_SUCCESS(err);
16668
16669 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016670 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016671 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16672 memAlloc.pNext = NULL;
16673 memAlloc.allocationSize = 0;
16674 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016675
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016676 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016677 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016678 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016679 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016680 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016681 ASSERT_VK_SUCCESS(err);
16682
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016683 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016684 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016685 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016686 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016687 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016688 ASSERT_VK_SUCCESS(err);
16689
16690 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16691 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016692 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016693 ASSERT_VK_SUCCESS(err);
16694
Tony Barbour552f6c02016-12-21 14:34:07 -070016695 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016696 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016697 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016698 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016699 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016700 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016701 copyRegion.srcOffset.x = 0;
16702 copyRegion.srcOffset.y = 0;
16703 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016704 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016705 copyRegion.dstSubresource.mipLevel = 0;
16706 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016707 // Introduce failure by forcing the dst layerCount to differ from src
16708 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016709 copyRegion.dstOffset.x = 0;
16710 copyRegion.dstOffset.y = 0;
16711 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016712 copyRegion.extent.width = 1;
16713 copyRegion.extent.height = 1;
16714 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016715 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016716 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016717
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016718 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016719
Chia-I Wuf7458c52015-10-26 21:10:41 +080016720 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016721 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016722 vkFreeMemory(m_device->device(), srcMem, NULL);
16723 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016724}
16725
Tony Barbourd6673642016-05-05 14:46:39 -060016726TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016727 TEST_DESCRIPTION("Creating images with unsuported formats ");
16728
Tony Barbour1fa09702017-03-16 12:09:08 -060016729 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016731
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016732 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016733 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016734 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016735 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16736 image_create_info.format = VK_FORMAT_UNDEFINED;
16737 image_create_info.extent.width = 32;
16738 image_create_info.extent.height = 32;
16739 image_create_info.extent.depth = 1;
16740 image_create_info.mipLevels = 1;
16741 image_create_info.arrayLayers = 1;
16742 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16743 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16744 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016745
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16747 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016748
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016749 VkImage image;
16750 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016751 m_errorMonitor->VerifyFound();
16752
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016753 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016754 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016755 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16756 VkFormat format = static_cast<VkFormat>(f);
16757 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016758 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016759 unsupported = format;
16760 break;
16761 }
16762 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016763
Tony Barbourd6673642016-05-05 14:46:39 -060016764 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016765 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016767
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016768 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016769 m_errorMonitor->VerifyFound();
16770 }
16771}
16772
16773TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016774 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16775
Tony Barbour1fa09702017-03-16 12:09:08 -060016776 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016777 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016778 if (!depth_format) {
16779 return;
16780 }
Tony Barbourd6673642016-05-05 14:46:39 -060016781
16782 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016783 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 -060016784 VK_IMAGE_TILING_OPTIMAL, 0);
16785 ASSERT_TRUE(image.initialized());
16786
16787 VkImageView imgView;
16788 VkImageViewCreateInfo imgViewInfo = {};
16789 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16790 imgViewInfo.image = image.handle();
16791 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16792 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16793 imgViewInfo.subresourceRange.layerCount = 1;
16794 imgViewInfo.subresourceRange.baseMipLevel = 0;
16795 imgViewInfo.subresourceRange.levelCount = 1;
16796 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16797
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016798 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016799 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016801 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16802 m_errorMonitor->VerifyFound();
16803 imgViewInfo.subresourceRange.baseMipLevel = 0;
16804
Tony Barbourd6673642016-05-05 14:46:39 -060016805 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16806 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016808 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16809 m_errorMonitor->VerifyFound();
16810 imgViewInfo.subresourceRange.levelCount = 1;
16811
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016812 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16813 imgViewInfo.subresourceRange.levelCount = 2;
16814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16815 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16816 m_errorMonitor->VerifyFound();
16817 imgViewInfo.subresourceRange.levelCount = 1;
16818
16819 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16820 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16822 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16823 m_errorMonitor->VerifyFound();
16824 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16825
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016826 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16827 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016828 m_errorMonitor->SetDesiredFailureMsg(
16829 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16830 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016831 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16832 m_errorMonitor->VerifyFound();
16833 imgViewInfo.subresourceRange.layerCount = 1;
16834
Tony Barbourd6673642016-05-05 14:46:39 -060016835 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016836 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016837 m_errorMonitor->SetDesiredFailureMsg(
16838 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16839 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016840 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16841 m_errorMonitor->VerifyFound();
16842 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16843
Tony Barbourd6673642016-05-05 14:46:39 -060016844 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16845 // VIEW_CREATE_ERROR
16846 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016848 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16849 m_errorMonitor->VerifyFound();
16850 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16851
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016852 // TODO: Update framework to easily passing mutable flag into ImageObj init
16853 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016854 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16855 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16856 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016857 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16858 // VIEW_CREATE_ERROR
16859 VkImageCreateInfo mutImgInfo = image.create_info();
16860 VkImage mutImage;
16861 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016862 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016863 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16864 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016865 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016866 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016867
16868 VkMemoryRequirements requirements;
16869 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16870
16871 VkMemoryAllocateInfo alloc_info{};
16872 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16873 alloc_info.pNext = NULL;
16874 alloc_info.memoryTypeIndex = 0;
16875 alloc_info.allocationSize = requirements.size;
16876 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16877 ASSERT_TRUE(pass);
16878
16879 VkDeviceMemory memory;
16880 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16881 ASSERT_VK_SUCCESS(ret);
16882
16883 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16884 ASSERT_VK_SUCCESS(ret);
16885
Tony Barbourd6673642016-05-05 14:46:39 -060016886 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016888 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16889 m_errorMonitor->VerifyFound();
16890 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016891
16892 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016893 vkDestroyImage(m_device->handle(), mutImage, NULL);
16894}
16895
Dave Houlton75967fc2017-03-06 17:21:16 -070016896TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16897 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16898
Tony Barbour1fa09702017-03-16 12:09:08 -060016899 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016900
Jamie Madill35127872017-03-15 16:17:46 -040016901 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016902 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16903 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16904 if (device_features.textureCompressionBC) {
16905 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16906 } else if (device_features.textureCompressionETC2) {
16907 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16908 } else if (device_features.textureCompressionASTC_LDR) {
16909 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16910 } else {
16911 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16912 return;
16913 }
16914
16915 VkImageCreateInfo ci;
16916 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16917 ci.pNext = NULL;
16918 ci.flags = 0;
16919 ci.imageType = VK_IMAGE_TYPE_2D;
16920 ci.format = compressed_format;
16921 ci.extent = {32, 32, 1};
16922 ci.mipLevels = 6;
16923 ci.arrayLayers = 1;
16924 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16925 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16926 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16927 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16928 ci.queueFamilyIndexCount = 0;
16929 ci.pQueueFamilyIndices = NULL;
16930 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16931
16932 VkImageObj image(m_device);
16933 image.init(&ci);
16934 ASSERT_TRUE(image.initialized());
16935
16936 VkImageObj odd_image(m_device);
16937 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16938 odd_image.init(&ci);
16939 ASSERT_TRUE(odd_image.initialized());
16940
16941 // Allocate buffers
16942 VkMemoryPropertyFlags reqs = 0;
16943 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16944 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16945 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16946 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16947 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16948
16949 VkBufferImageCopy region = {};
16950 region.bufferRowLength = 0;
16951 region.bufferImageHeight = 0;
16952 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16953 region.imageSubresource.layerCount = 1;
16954 region.imageOffset = {0, 0, 0};
16955 region.bufferOffset = 0;
16956
16957 // start recording
16958 m_commandBuffer->BeginCommandBuffer();
16959
16960 // Mip level copies that work - 5 levels
16961 m_errorMonitor->ExpectSuccess();
16962
16963 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16964 region.imageExtent = {32, 32, 1};
16965 region.imageSubresource.mipLevel = 0;
16966 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16967 &region);
16968 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16969 &region);
16970
16971 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16972 region.imageExtent = {8, 8, 1};
16973 region.imageSubresource.mipLevel = 2;
16974 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16975 &region);
16976 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16977 &region);
16978
16979 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16980 region.imageExtent = {4, 4, 1};
16981 region.imageSubresource.mipLevel = 3;
16982 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16983 &region);
16984 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16985 &region);
16986
16987 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16988 region.imageExtent = {2, 2, 1};
16989 region.imageSubresource.mipLevel = 4;
16990 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16991 &region);
16992 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16993 &region);
16994
16995 region.imageExtent = {1, 1, 1};
16996 region.imageSubresource.mipLevel = 5;
16997 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16998 &region);
16999 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17000 &region);
17001 m_errorMonitor->VerifyNotFound();
17002
17003 // Buffer must accomodate a full compressed block, regardless of texel count
17004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17005 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
17006 &region);
17007 m_errorMonitor->VerifyFound();
17008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
17009 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17010 &region);
17011 m_errorMonitor->VerifyFound();
17012
17013 // Copy width < compressed block size, but not the full mip width
17014 region.imageExtent = {1, 2, 1};
17015 region.imageSubresource.mipLevel = 4;
17016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17017 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17018 &region);
17019 m_errorMonitor->VerifyFound();
17020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17021 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17022 &region);
17023 m_errorMonitor->VerifyFound();
17024
17025 // Copy height < compressed block size but not the full mip height
17026 region.imageExtent = {2, 1, 1};
17027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17028 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17029 &region);
17030 m_errorMonitor->VerifyFound();
17031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17032 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17033 &region);
17034 m_errorMonitor->VerifyFound();
17035
17036 // Offsets must be multiple of compressed block size
17037 region.imageOffset = {1, 1, 0};
17038 region.imageExtent = {1, 1, 1};
17039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17040 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17041 &region);
17042 m_errorMonitor->VerifyFound();
17043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17044 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17045 &region);
17046 m_errorMonitor->VerifyFound();
17047
17048 // Offset + extent width = mip width - should succeed
17049 region.imageOffset = {4, 4, 0};
17050 region.imageExtent = {3, 4, 1};
17051 region.imageSubresource.mipLevel = 2;
17052 m_errorMonitor->ExpectSuccess();
17053 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17054 &region);
17055 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17056 &region);
17057 m_errorMonitor->VerifyNotFound();
17058
17059 // Offset + extent width > mip width, but still within the final compressed block - should succeed
17060 region.imageExtent = {4, 4, 1};
17061 m_errorMonitor->ExpectSuccess();
17062 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17063 &region);
17064 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17065 &region);
17066 m_errorMonitor->VerifyNotFound();
17067
17068 // Offset + extent width < mip width and not a multiple of block width - should fail
17069 region.imageExtent = {3, 3, 1};
17070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17071 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17072 &region);
17073 m_errorMonitor->VerifyFound();
17074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17075 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17076 &region);
17077 m_errorMonitor->VerifyFound();
17078}
17079
Dave Houlton59a20702017-02-02 17:26:23 -070017080TEST_F(VkLayerTest, ImageBufferCopyTests) {
17081 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
17082
Tony Barbour1fa09702017-03-16 12:09:08 -060017083 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017084 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
17085 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
17086 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
17087 return;
17088 }
Dave Houlton584d51e2017-02-16 12:52:54 -070017089
17090 // Bail if any dimension of transfer granularity is 0.
17091 auto index = m_device->graphics_queue_node_index_;
17092 auto queue_family_properties = m_device->phy().queue_properties();
17093 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
17094 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
17095 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
17096 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
17097 return;
17098 }
17099
Dave Houlton59a20702017-02-02 17:26:23 -070017100 VkImageObj image_64k(m_device); // 128^2 texels, 64k
17101 VkImageObj image_16k(m_device); // 64^2 texels, 16k
17102 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070017103 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
17104 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
17105 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
17106 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
17107
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017108 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017109 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17110 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017111 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017112 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17113 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017114 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 -070017115 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070017116 ASSERT_TRUE(image_64k.initialized());
17117 ASSERT_TRUE(image_16k.initialized());
17118 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017119
Dave Houltonf3229d52017-02-21 15:59:08 -070017120 // Verify all needed Depth/Stencil formats are supported
17121 bool missing_ds_support = false;
17122 VkFormatProperties props = {0, 0, 0};
17123 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
17124 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17125 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
17126 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17127 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
17128 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17129 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
17130 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17131
17132 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017133 ds_image_4D_1S.Init(
17134 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017135 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17136 VK_IMAGE_TILING_OPTIMAL, 0);
17137 ASSERT_TRUE(ds_image_4D_1S.initialized());
17138
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017139 ds_image_3D_1S.Init(
17140 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017141 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17142 VK_IMAGE_TILING_OPTIMAL, 0);
17143 ASSERT_TRUE(ds_image_3D_1S.initialized());
17144
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017145 ds_image_2D.Init(
17146 256, 256, 1, VK_FORMAT_D16_UNORM,
17147 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17148 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017149 ASSERT_TRUE(ds_image_2D.initialized());
17150
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017151 ds_image_1S.Init(
17152 256, 256, 1, VK_FORMAT_S8_UINT,
17153 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17154 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017155 ASSERT_TRUE(ds_image_1S.initialized());
17156 }
17157
17158 // Allocate buffers
17159 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070017160 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070017161 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
17162 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
17163 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
17164 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070017165
17166 VkBufferImageCopy region = {};
17167 region.bufferRowLength = 0;
17168 region.bufferImageHeight = 0;
17169 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17170 region.imageSubresource.layerCount = 1;
17171 region.imageOffset = {0, 0, 0};
17172 region.imageExtent = {64, 64, 1};
17173 region.bufferOffset = 0;
17174
17175 // attempt copies before putting command buffer in recording state
17176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
17177 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17178 &region);
17179 m_errorMonitor->VerifyFound();
17180
17181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
17182 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17183 &region);
17184 m_errorMonitor->VerifyFound();
17185
17186 // start recording
17187 m_commandBuffer->BeginCommandBuffer();
17188
17189 // successful copies
17190 m_errorMonitor->ExpectSuccess();
17191 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17192 &region);
17193 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17194 &region);
17195 region.imageOffset.x = 16; // 16k copy, offset requires larger image
17196 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17197 &region);
17198 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
17199 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17200 &region);
17201 region.imageOffset.x = 0;
17202 region.imageExtent.height = 64;
17203 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
17204 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17205 &region);
17206 m_errorMonitor->VerifyNotFound();
17207
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017208 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070017209 region.imageExtent = {65, 64, 1};
17210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17211 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17212 &region);
17213 m_errorMonitor->VerifyFound();
17214
17215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17216 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17217 &region);
17218 m_errorMonitor->VerifyFound();
17219
17220 // image/buffer too small (offset) on copy to image
17221 region.imageExtent = {64, 64, 1};
17222 region.imageOffset = {0, 4, 0};
17223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17224 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17225 &region);
17226 m_errorMonitor->VerifyFound();
17227
17228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17229 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17230 &region);
17231 m_errorMonitor->VerifyFound();
17232
17233 // image/buffer too small on copy to buffer
17234 region.imageExtent = {64, 64, 1};
17235 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070017236 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
17238 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17239 &region);
17240 m_errorMonitor->VerifyFound();
17241
17242 region.imageExtent = {64, 65, 1};
17243 region.bufferOffset = 0;
17244 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
17245 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17246 &region);
17247 m_errorMonitor->VerifyFound();
17248
17249 // buffer size ok but rowlength causes loose packing
17250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17251 region.imageExtent = {64, 64, 1};
17252 region.bufferRowLength = 68;
17253 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17254 &region);
17255 m_errorMonitor->VerifyFound();
17256
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017257 // An extent with zero area should produce a warning, but no error
17258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
17259 region.imageExtent.width = 0;
17260 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17261 &region);
17262 m_errorMonitor->VerifyFound();
17263
Dave Houlton59a20702017-02-02 17:26:23 -070017264 // aspect bits
17265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
17266 region.imageExtent = {64, 64, 1};
17267 region.bufferRowLength = 0;
17268 region.bufferImageHeight = 0;
17269 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17270 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17271 buffer_16k.handle(), 1, &region);
17272 m_errorMonitor->VerifyFound();
17273
17274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
17275 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17276 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17277 &region);
17278 m_errorMonitor->VerifyFound();
17279
17280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
17281 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17282 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17283 buffer_16k.handle(), 1, &region);
17284 m_errorMonitor->VerifyFound();
17285
Dave Houltonf3229d52017-02-21 15:59:08 -070017286 // Test Depth/Stencil copies
17287 if (missing_ds_support) {
17288 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
17289 } else {
17290 VkBufferImageCopy ds_region = {};
17291 ds_region.bufferOffset = 0;
17292 ds_region.bufferRowLength = 0;
17293 ds_region.bufferImageHeight = 0;
17294 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17295 ds_region.imageSubresource.mipLevel = 0;
17296 ds_region.imageSubresource.baseArrayLayer = 0;
17297 ds_region.imageSubresource.layerCount = 1;
17298 ds_region.imageOffset = {0, 0, 0};
17299 ds_region.imageExtent = {256, 256, 1};
17300
17301 // Depth copies that should succeed
17302 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
17303 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17304 buffer_256k.handle(), 1, &ds_region);
17305 m_errorMonitor->VerifyNotFound();
17306
17307 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
17308 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17309 buffer_256k.handle(), 1, &ds_region);
17310 m_errorMonitor->VerifyNotFound();
17311
17312 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
17313 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17314 buffer_128k.handle(), 1, &ds_region);
17315 m_errorMonitor->VerifyNotFound();
17316
17317 // Depth copies that should fail
17318 ds_region.bufferOffset = 4;
17319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17320 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
17321 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17322 buffer_256k.handle(), 1, &ds_region);
17323 m_errorMonitor->VerifyFound();
17324
17325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17326 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
17327 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17328 buffer_256k.handle(), 1, &ds_region);
17329 m_errorMonitor->VerifyFound();
17330
17331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17332 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
17333 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17334 buffer_128k.handle(), 1, &ds_region);
17335 m_errorMonitor->VerifyFound();
17336
17337 // Stencil copies that should succeed
17338 ds_region.bufferOffset = 0;
17339 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17340 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17341 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17342 buffer_64k.handle(), 1, &ds_region);
17343 m_errorMonitor->VerifyNotFound();
17344
17345 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17346 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17347 buffer_64k.handle(), 1, &ds_region);
17348 m_errorMonitor->VerifyNotFound();
17349
17350 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
17351 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17352 buffer_64k.handle(), 1, &ds_region);
17353 m_errorMonitor->VerifyNotFound();
17354
17355 // Stencil copies that should fail
17356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17357 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17358 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17359 buffer_16k.handle(), 1, &ds_region);
17360 m_errorMonitor->VerifyFound();
17361
17362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17363 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17364 ds_region.bufferRowLength = 260;
17365 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17366 buffer_64k.handle(), 1, &ds_region);
17367 m_errorMonitor->VerifyFound();
17368
17369 ds_region.bufferRowLength = 0;
17370 ds_region.bufferOffset = 4;
17371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17372 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
17373 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17374 buffer_64k.handle(), 1, &ds_region);
17375 m_errorMonitor->VerifyFound();
17376 }
17377
Dave Houlton584d51e2017-02-16 12:52:54 -070017378 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040017379 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070017380 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070017381 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
17382 device_features.textureCompressionASTC_LDR)) {
17383 printf(" No compressed formats supported - block compression tests skipped.\n");
17384 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070017385 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
17386 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070017387 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017388 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
17389 0);
17390 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 -070017391 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017392 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017393 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 -070017394 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017395 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 -070017396 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017397 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017398 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 -070017399 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017400 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 -070017401 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017402 }
17403 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017404
Dave Houlton584d51e2017-02-16 12:52:54 -070017405 // Just fits
17406 m_errorMonitor->ExpectSuccess();
17407 region.imageExtent = {128, 128, 1};
17408 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17409 buffer_16k.handle(), 1, &region);
17410 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017411
Dave Houlton584d51e2017-02-16 12:52:54 -070017412 // with offset, too big for buffer
17413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17414 region.bufferOffset = 16;
17415 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17416 buffer_16k.handle(), 1, &region);
17417 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017418 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017419
Dave Houlton67e9b532017-03-02 17:00:10 -070017420 // extents that are not a multiple of compressed block size
17421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17422 region.imageExtent.width = 66;
17423 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17424 buffer_16k.handle(), 1, &region);
17425 m_errorMonitor->VerifyFound();
17426 region.imageExtent.width = 128;
17427
17428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017429 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070017430 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17431 buffer_16k.handle(), 1, &region);
17432 m_errorMonitor->VerifyFound();
17433 region.imageExtent.height = 128;
17434
17435 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
17436
17437 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
17438 m_errorMonitor->ExpectSuccess();
17439 region.imageExtent.width = 66;
17440 region.imageOffset.x = 64;
17441 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17442 buffer_16k.handle(), 1, &region);
17443 region.imageExtent.width = 16;
17444 region.imageOffset.x = 0;
17445 region.imageExtent.height = 2;
17446 region.imageOffset.y = 128;
17447 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017448 buffer_16k.handle(), 1, &region);
17449 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017450 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017451
Dave Houlton584d51e2017-02-16 12:52:54 -070017452 // buffer offset must be a multiple of texel block size (16)
17453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
17454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
17455 region.imageExtent = {64, 64, 1};
17456 region.bufferOffset = 24;
17457 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17458 buffer_16k.handle(), 1, &region);
17459 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017460
Dave Houlton584d51e2017-02-16 12:52:54 -070017461 // rowlength not a multiple of block width (4)
17462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
17463 region.bufferOffset = 0;
17464 region.bufferRowLength = 130;
17465 region.bufferImageHeight = 0;
17466 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17467 buffer_64k.handle(), 1, &region);
17468 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017469
Dave Houlton584d51e2017-02-16 12:52:54 -070017470 // imageheight not a multiple of block height (4)
17471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
17472 region.bufferRowLength = 0;
17473 region.bufferImageHeight = 130;
17474 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17475 buffer_64k.handle(), 1, &region);
17476 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070017477 }
Dave Houlton59a20702017-02-02 17:26:23 -070017478}
17479
Tony Barbourd6673642016-05-05 14:46:39 -060017480TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070017481 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060017482
Tony Barbour1fa09702017-03-16 12:09:08 -060017483 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060017484
Rene Lindsay135204f2016-12-22 17:11:09 -070017485 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060017486 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017487 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 -070017488 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060017489 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060017490 vk_testing::Buffer buffer;
17491 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070017492 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060017493 VkBufferImageCopy region = {};
17494 region.bufferRowLength = 128;
17495 region.bufferImageHeight = 128;
17496 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17497 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070017498 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017499 region.imageExtent.height = 4;
17500 region.imageExtent.width = 4;
17501 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070017502
17503 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017504 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 -070017505 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070017506 ASSERT_TRUE(image2.initialized());
17507 vk_testing::Buffer buffer2;
17508 VkMemoryPropertyFlags reqs2 = 0;
17509 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
17510 VkBufferImageCopy region2 = {};
17511 region2.bufferRowLength = 128;
17512 region2.bufferImageHeight = 128;
17513 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17514 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
17515 region2.imageSubresource.layerCount = 1;
17516 region2.imageExtent.height = 4;
17517 region2.imageExtent.width = 4;
17518 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017519 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060017520
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017521 // Image must have offset.z of 0 and extent.depth of 1
17522 // Introduce failure by setting imageExtent.depth to 0
17523 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017525 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017526 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017527 m_errorMonitor->VerifyFound();
17528
17529 region.imageExtent.depth = 1;
17530
17531 // Image must have offset.z of 0 and extent.depth of 1
17532 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017533 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017534 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017537 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017538 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017539 m_errorMonitor->VerifyFound();
17540
17541 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017542 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
17543 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070017544 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017546 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17547 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017548 m_errorMonitor->VerifyFound();
17549
17550 // BufferOffset must be a multiple of 4
17551 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070017552 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070017554 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
17555 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017556 m_errorMonitor->VerifyFound();
17557
17558 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
17559 region.bufferOffset = 0;
17560 region.imageExtent.height = 128;
17561 region.imageExtent.width = 128;
17562 // Introduce failure by setting bufferRowLength > 0 but less than width
17563 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017565 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17566 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017567 m_errorMonitor->VerifyFound();
17568
17569 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
17570 region.bufferRowLength = 128;
17571 // Introduce failure by setting bufferRowHeight > 0 but less than height
17572 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017574 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17575 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017576 m_errorMonitor->VerifyFound();
17577
17578 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060017579 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017580 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 -070017581 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017582 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017583 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 -070017584 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017585 VkImageBlit blitRegion = {};
17586 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17587 blitRegion.srcSubresource.baseArrayLayer = 0;
17588 blitRegion.srcSubresource.layerCount = 1;
17589 blitRegion.srcSubresource.mipLevel = 0;
17590 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17591 blitRegion.dstSubresource.baseArrayLayer = 0;
17592 blitRegion.dstSubresource.layerCount = 1;
17593 blitRegion.dstSubresource.mipLevel = 0;
17594
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017595 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17597 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17599 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017600 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17601 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017602 m_errorMonitor->VerifyFound();
17603
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017605 VkImageMemoryBarrier img_barrier;
17606 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17607 img_barrier.pNext = NULL;
17608 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17609 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17610 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17611 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17612 img_barrier.image = image.handle();
17613 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17614 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17615 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17616 img_barrier.subresourceRange.baseArrayLayer = 0;
17617 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017618 img_barrier.subresourceRange.layerCount = 0;
17619 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017620 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17621 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017622 m_errorMonitor->VerifyFound();
17623 img_barrier.subresourceRange.layerCount = 1;
17624}
17625
17626TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017627 TEST_DESCRIPTION("Exceed the limits of image format ");
17628
Tony Barbour1fa09702017-03-16 12:09:08 -060017629 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017630
17631 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17632 {
17633 VkFormatProperties properties;
17634 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17635 if (properties.linearTilingFeatures == 0) {
17636 printf(" Image format not supported; skipped.\n");
17637 return;
17638 }
17639 }
17640
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017642 VkImageCreateInfo image_create_info = {};
17643 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17644 image_create_info.pNext = NULL;
17645 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017646 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017647 image_create_info.extent.width = 32;
17648 image_create_info.extent.height = 32;
17649 image_create_info.extent.depth = 1;
17650 image_create_info.mipLevels = 1;
17651 image_create_info.arrayLayers = 1;
17652 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17653 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17654 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17655 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17656 image_create_info.flags = 0;
17657
17658 VkImage nullImg;
17659 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017660 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17661 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017662 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017663 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17664 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17665 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017666 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017667
Tony Barbour0907e362017-03-09 15:05:30 -070017668 uint32_t maxDim =
17669 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17670 // If max mip levels exceeds image extents, skip the max mip levels test
17671 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17673 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17674 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17675 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17676 m_errorMonitor->VerifyFound();
17677 image_create_info.mipLevels = 1;
17678 }
Tony Barbourd6673642016-05-05 14:46:39 -060017679
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017680 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017681 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17682 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17683 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17684 m_errorMonitor->VerifyFound();
17685 image_create_info.arrayLayers = 1;
17686
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017688 int samples = imgFmtProps.sampleCounts >> 1;
17689 image_create_info.samples = (VkSampleCountFlagBits)samples;
17690 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17691 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17692 m_errorMonitor->VerifyFound();
17693 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17694
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17696 "pCreateInfo->initialLayout, must be "
17697 "VK_IMAGE_LAYOUT_UNDEFINED or "
17698 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017699 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17700 // Expect INVALID_LAYOUT
17701 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17702 m_errorMonitor->VerifyFound();
17703 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17704}
17705
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017706TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017707 // Image copy with source region specified greater than src image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017708 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017709
Dave Houltonfc1a4052017-04-27 14:32:45 -060017710 // Create images with full mip chain
17711 VkImageCreateInfo ci;
17712 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17713 ci.pNext = NULL;
17714 ci.flags = 0;
17715 ci.imageType = VK_IMAGE_TYPE_3D;
17716 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17717 ci.extent = {32, 32, 8};
17718 ci.mipLevels = 6;
17719 ci.arrayLayers = 1;
17720 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17721 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17722 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17723 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17724 ci.queueFamilyIndexCount = 0;
17725 ci.pQueueFamilyIndices = NULL;
17726 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17727
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017728 VkImageObj src_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017729 src_image.init(&ci);
17730 ASSERT_TRUE(src_image.initialized());
17731
17732 // Dest image with one more mip level
17733 ci.extent = {64, 64, 16};
17734 ci.mipLevels = 7;
17735 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017736 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017737 dst_image.init(&ci);
17738 ASSERT_TRUE(dst_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017739
Tony Barbour552f6c02016-12-21 14:34:07 -070017740 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017741
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017742 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017743 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017744 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017745 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017746 copy_region.srcSubresource.mipLevel = 0;
17747 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017748 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017749 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017750 copy_region.srcSubresource.layerCount = 1;
17751 copy_region.dstSubresource.layerCount = 1;
17752 copy_region.srcOffset = {0, 0, 0};
17753 copy_region.dstOffset = {0, 0, 0};
17754
17755 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017756 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17757 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017758 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017759
Dave Houltonfc1a4052017-04-27 14:32:45 -060017760 // Source exceeded in x-dim, VU 01202
17761 copy_region.srcOffset.x = 4;
17762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175); // General "contained within" VU
17763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01202);
17764 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17765 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017766 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017767
17768 // Source exceeded in y-dim, VU 01203
17769 copy_region.srcOffset.x = 0;
17770 copy_region.extent.height = 48;
17771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01203);
17773 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17774 &copy_region);
17775 m_errorMonitor->VerifyFound();
17776
17777 // Source exceeded in z-dim, VU 01204
17778 copy_region.extent = {4, 4, 4};
17779 copy_region.srcSubresource.mipLevel = 2;
17780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01204);
17782 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17783 &copy_region);
17784 m_errorMonitor->VerifyFound();
17785
17786 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017787}
17788
17789TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017790 // Image copy with dest region specified greater than dest image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017791 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017792
Dave Houltonfc1a4052017-04-27 14:32:45 -060017793 // Create images with full mip chain
17794 VkImageCreateInfo ci;
17795 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17796 ci.pNext = NULL;
17797 ci.flags = 0;
17798 ci.imageType = VK_IMAGE_TYPE_3D;
17799 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17800 ci.extent = {32, 32, 8};
17801 ci.mipLevels = 6;
17802 ci.arrayLayers = 1;
17803 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17804 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17805 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17806 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17807 ci.queueFamilyIndexCount = 0;
17808 ci.pQueueFamilyIndices = NULL;
17809 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17810
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017811 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017812 dst_image.init(&ci);
17813 ASSERT_TRUE(dst_image.initialized());
17814
17815 // Src image with one more mip level
17816 ci.extent = {64, 64, 16};
17817 ci.mipLevels = 7;
17818 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17819 VkImageObj src_image(m_device);
17820 src_image.init(&ci);
17821 ASSERT_TRUE(src_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017822
Tony Barbour552f6c02016-12-21 14:34:07 -070017823 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017824
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017825 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017826 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017827 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017828 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017829 copy_region.srcSubresource.mipLevel = 0;
17830 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017831 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017832 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017833 copy_region.srcSubresource.layerCount = 1;
17834 copy_region.dstSubresource.layerCount = 1;
17835 copy_region.srcOffset = {0, 0, 0};
17836 copy_region.dstOffset = {0, 0, 0};
17837
17838 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017839 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17840 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017841 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017842
Dave Houltonfc1a4052017-04-27 14:32:45 -060017843 // Dest exceeded in x-dim, VU 01205
17844 copy_region.dstOffset.x = 4;
17845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176); // General "contained within" VU
17846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01205);
17847 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17848 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017849 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017850
17851 // Dest exceeded in y-dim, VU 01206
17852 copy_region.dstOffset.x = 0;
17853 copy_region.extent.height = 48;
17854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01206);
17856 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17857 &copy_region);
17858 m_errorMonitor->VerifyFound();
17859
17860 // Dest exceeded in z-dim, VU 01207
17861 copy_region.extent = {4, 4, 4};
17862 copy_region.dstSubresource.mipLevel = 2;
17863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01207);
17865 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17866 &copy_region);
17867 m_errorMonitor->VerifyFound();
17868
17869 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017870}
17871
Karl Schultz6addd812016-02-02 17:17:23 -070017872TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017873 VkResult err;
17874 bool pass;
17875
17876 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017878
Tony Barbour1fa09702017-03-16 12:09:08 -060017879 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017880
17881 // Create two images of different types and try to copy between them
17882 VkImage srcImage;
17883 VkImage dstImage;
17884 VkDeviceMemory srcMem;
17885 VkDeviceMemory destMem;
17886 VkMemoryRequirements memReqs;
17887
17888 VkImageCreateInfo image_create_info = {};
17889 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17890 image_create_info.pNext = NULL;
17891 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17892 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17893 image_create_info.extent.width = 32;
17894 image_create_info.extent.height = 32;
17895 image_create_info.extent.depth = 1;
17896 image_create_info.mipLevels = 1;
17897 image_create_info.arrayLayers = 1;
17898 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17899 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17900 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17901 image_create_info.flags = 0;
17902
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017903 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017904 ASSERT_VK_SUCCESS(err);
17905
17906 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17907 // Introduce failure by creating second image with a different-sized format.
17908 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017909 VkFormatProperties properties;
17910 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17911 if (properties.optimalTilingFeatures == 0) {
17912 printf(" Image format not supported; skipped.\n");
17913 return;
17914 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017915
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017916 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017917 ASSERT_VK_SUCCESS(err);
17918
17919 // Allocate memory
17920 VkMemoryAllocateInfo memAlloc = {};
17921 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17922 memAlloc.pNext = NULL;
17923 memAlloc.allocationSize = 0;
17924 memAlloc.memoryTypeIndex = 0;
17925
17926 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17927 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017928 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017929 ASSERT_TRUE(pass);
17930 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17931 ASSERT_VK_SUCCESS(err);
17932
17933 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17934 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017935 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017936 ASSERT_TRUE(pass);
17937 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17938 ASSERT_VK_SUCCESS(err);
17939
17940 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17941 ASSERT_VK_SUCCESS(err);
17942 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17943 ASSERT_VK_SUCCESS(err);
17944
Tony Barbour552f6c02016-12-21 14:34:07 -070017945 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017946 VkImageCopy copyRegion;
17947 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17948 copyRegion.srcSubresource.mipLevel = 0;
17949 copyRegion.srcSubresource.baseArrayLayer = 0;
17950 copyRegion.srcSubresource.layerCount = 0;
17951 copyRegion.srcOffset.x = 0;
17952 copyRegion.srcOffset.y = 0;
17953 copyRegion.srcOffset.z = 0;
17954 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17955 copyRegion.dstSubresource.mipLevel = 0;
17956 copyRegion.dstSubresource.baseArrayLayer = 0;
17957 copyRegion.dstSubresource.layerCount = 0;
17958 copyRegion.dstOffset.x = 0;
17959 copyRegion.dstOffset.y = 0;
17960 copyRegion.dstOffset.z = 0;
17961 copyRegion.extent.width = 1;
17962 copyRegion.extent.height = 1;
17963 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017964 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017965 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017966
17967 m_errorMonitor->VerifyFound();
17968
17969 vkDestroyImage(m_device->device(), srcImage, NULL);
17970 vkDestroyImage(m_device->device(), dstImage, NULL);
17971 vkFreeMemory(m_device->device(), srcMem, NULL);
17972 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017973}
17974
Karl Schultz6addd812016-02-02 17:17:23 -070017975TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17976 VkResult err;
17977 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017978
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017979 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17981 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017982
Tony Barbour1fa09702017-03-16 12:09:08 -060017983 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017984 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017985 if (!depth_format) {
17986 return;
17987 }
Mike Stroyana3082432015-09-25 13:39:21 -060017988
17989 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017990 VkImage srcImage;
17991 VkImage dstImage;
17992 VkDeviceMemory srcMem;
17993 VkDeviceMemory destMem;
17994 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017995
17996 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017997 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17998 image_create_info.pNext = NULL;
17999 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018000 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070018001 image_create_info.extent.width = 32;
18002 image_create_info.extent.height = 32;
18003 image_create_info.extent.depth = 1;
18004 image_create_info.mipLevels = 1;
18005 image_create_info.arrayLayers = 1;
18006 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060018007 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070018008 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18009 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018010 VkFormatProperties properties;
18011 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
18012 if (properties.optimalTilingFeatures == 0) {
18013 printf(" Image format not supported; skipped.\n");
18014 return;
18015 }
Mike Stroyana3082432015-09-25 13:39:21 -060018016
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018017 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018018 ASSERT_VK_SUCCESS(err);
18019
Karl Schultzbdb75952016-04-19 11:36:49 -060018020 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18021
Mark Lobodzinskidb117632016-03-31 10:45:56 -060018022 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070018023 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070018024 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060018025 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018026
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018027 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018028 ASSERT_VK_SUCCESS(err);
18029
18030 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018031 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018032 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18033 memAlloc.pNext = NULL;
18034 memAlloc.allocationSize = 0;
18035 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018036
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018037 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018038 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018039 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018040 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018041 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018042 ASSERT_VK_SUCCESS(err);
18043
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018044 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018045 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018046 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018047 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018048 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018049 ASSERT_VK_SUCCESS(err);
18050
18051 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18052 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018053 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018054 ASSERT_VK_SUCCESS(err);
18055
Tony Barbour552f6c02016-12-21 14:34:07 -070018056 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018057 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018058 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018059 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018060 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018061 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018062 copyRegion.srcOffset.x = 0;
18063 copyRegion.srcOffset.y = 0;
18064 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018065 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018066 copyRegion.dstSubresource.mipLevel = 0;
18067 copyRegion.dstSubresource.baseArrayLayer = 0;
18068 copyRegion.dstSubresource.layerCount = 0;
18069 copyRegion.dstOffset.x = 0;
18070 copyRegion.dstOffset.y = 0;
18071 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018072 copyRegion.extent.width = 1;
18073 copyRegion.extent.height = 1;
18074 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018075 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018076 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018077
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018078 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018079
Chia-I Wuf7458c52015-10-26 21:10:41 +080018080 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018081 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018082 vkFreeMemory(m_device->device(), srcMem, NULL);
18083 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018084}
18085
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018086TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
18087 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070018088
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018089 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070018090
18091 VkImageFormatProperties image_format_properties;
18092 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
18093 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
18094 &image_format_properties);
18095
18096 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
18097 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
18098 printf(" Image multi-sample support not found; skipped.\n");
18099 return;
18100 }
18101
18102 VkImageCreateInfo ci;
18103 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18104 ci.pNext = NULL;
18105 ci.flags = 0;
18106 ci.imageType = VK_IMAGE_TYPE_2D;
18107 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
18108 ci.extent = {128, 128, 1};
18109 ci.mipLevels = 1;
18110 ci.arrayLayers = 1;
18111 ci.samples = VK_SAMPLE_COUNT_1_BIT;
18112 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
18113 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18114 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18115 ci.queueFamilyIndexCount = 0;
18116 ci.pQueueFamilyIndices = NULL;
18117 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18118
18119 VkImageObj image1(m_device);
18120 image1.init(&ci);
18121 ASSERT_TRUE(image1.initialized());
18122
18123 ci.samples = VK_SAMPLE_COUNT_2_BIT;
18124 VkImageObj image2(m_device);
18125 image2.init(&ci);
18126 ASSERT_TRUE(image2.initialized());
18127
18128 ci.samples = VK_SAMPLE_COUNT_4_BIT;
18129 VkImageObj image4(m_device);
18130 image4.init(&ci);
18131 ASSERT_TRUE(image4.initialized());
18132
18133 m_commandBuffer->BeginCommandBuffer();
18134
18135 VkImageCopy copyRegion;
18136 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18137 copyRegion.srcSubresource.mipLevel = 0;
18138 copyRegion.srcSubresource.baseArrayLayer = 0;
18139 copyRegion.srcSubresource.layerCount = 1;
18140 copyRegion.srcOffset = {0, 0, 0};
18141 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18142 copyRegion.dstSubresource.mipLevel = 0;
18143 copyRegion.dstSubresource.baseArrayLayer = 0;
18144 copyRegion.dstSubresource.layerCount = 1;
18145 copyRegion.dstOffset = {0, 0, 0};
18146 copyRegion.extent = {128, 128, 1};
18147
18148 // Copy a single sample image to/from a multi-sample image
18149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18150 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18151 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18152 m_errorMonitor->VerifyFound();
18153
18154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18155 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
18156 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18157 m_errorMonitor->VerifyFound();
18158
18159 // Copy between multi-sample images with different sample counts
18160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18161 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18162 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18163 m_errorMonitor->VerifyFound();
18164
18165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18166 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
18167 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18168 m_errorMonitor->VerifyFound();
18169
18170 m_commandBuffer->EndCommandBuffer();
18171}
18172
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018173TEST_F(VkLayerTest, CopyImageAspectMismatch) {
18174 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018175 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018176 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060018177 if (!ds_format) {
18178 return;
18179 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018180
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018181 VkFormatProperties properties;
18182 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
18183 if (properties.optimalTilingFeatures == 0) {
18184 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
18185 return;
18186 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018187 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018188 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 -060018189 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 -060018190 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018191 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
18192 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018193 ASSERT_TRUE(color_image.initialized());
18194 ASSERT_TRUE(depth_image.initialized());
18195 ASSERT_TRUE(ds_image.initialized());
18196
18197 VkImageCopy copyRegion;
18198 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18199 copyRegion.srcSubresource.mipLevel = 0;
18200 copyRegion.srcSubresource.baseArrayLayer = 0;
18201 copyRegion.srcSubresource.layerCount = 1;
18202 copyRegion.srcOffset = {0, 0, 0};
18203 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18204 copyRegion.dstSubresource.mipLevel = 0;
18205 copyRegion.dstSubresource.baseArrayLayer = 0;
18206 copyRegion.dstSubresource.layerCount = 1;
18207 copyRegion.dstOffset = {64, 0, 0};
18208 copyRegion.extent = {64, 128, 1};
18209
18210 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060018211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18212 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
18213 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18214 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018215 m_errorMonitor->VerifyFound();
18216
18217 m_commandBuffer->BeginCommandBuffer();
18218
18219 // Src and dest aspect masks don't match
18220 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
18221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018222 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
18223 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018224 m_errorMonitor->VerifyFound();
18225 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18226
18227 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060018228 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018229 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
18230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
18231 // These aspect/format mismatches are redundant but unavoidable here
18232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018234 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18235 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018236 m_errorMonitor->VerifyFound();
18237 // Metadata aspect is illegal - VU 01222
18238 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18239 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
18241 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060018242 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18243 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018244 m_errorMonitor->VerifyFound();
18245
18246 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18247 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18248
18249 // Aspect mask doesn't match source image format - VU 01200
18250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18251 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
18252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18253 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18254 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18255 m_errorMonitor->VerifyFound();
18256
18257 // Aspect mask doesn't match dest image format - VU 01201
18258 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18259 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
18261 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
18262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18263 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18264 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18265 m_errorMonitor->VerifyFound();
18266
18267 m_commandBuffer->EndCommandBuffer();
18268}
18269
Karl Schultz6addd812016-02-02 17:17:23 -070018270TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
18271 VkResult err;
18272 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018273
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18275 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018276
Tony Barbour1fa09702017-03-16 12:09:08 -060018277 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018278
18279 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018280 VkImage srcImage;
18281 VkImage dstImage;
18282 VkDeviceMemory srcMem;
18283 VkDeviceMemory destMem;
18284 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018285
18286 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018287 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18288 image_create_info.pNext = NULL;
18289 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18290 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18291 image_create_info.extent.width = 32;
18292 image_create_info.extent.height = 1;
18293 image_create_info.extent.depth = 1;
18294 image_create_info.mipLevels = 1;
18295 image_create_info.arrayLayers = 1;
18296 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18297 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18298 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18299 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018300
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018301 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018302 ASSERT_VK_SUCCESS(err);
18303
Karl Schultz6addd812016-02-02 17:17:23 -070018304 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018305
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018306 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018307 ASSERT_VK_SUCCESS(err);
18308
18309 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018310 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018311 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18312 memAlloc.pNext = NULL;
18313 memAlloc.allocationSize = 0;
18314 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018315
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018316 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018317 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018318 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018319 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018320 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018321 ASSERT_VK_SUCCESS(err);
18322
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018323 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018324 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018325 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018326 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018327 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018328 ASSERT_VK_SUCCESS(err);
18329
18330 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18331 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018332 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018333 ASSERT_VK_SUCCESS(err);
18334
Tony Barbour552f6c02016-12-21 14:34:07 -070018335 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018336 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018337 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18338 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018339 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018340 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018341 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018342 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018343 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018344 resolveRegion.srcOffset.x = 0;
18345 resolveRegion.srcOffset.y = 0;
18346 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018347 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018348 resolveRegion.dstSubresource.mipLevel = 0;
18349 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018350 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018351 resolveRegion.dstOffset.x = 0;
18352 resolveRegion.dstOffset.y = 0;
18353 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018354 resolveRegion.extent.width = 1;
18355 resolveRegion.extent.height = 1;
18356 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018357 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018358 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018359
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018360 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018361
Chia-I Wuf7458c52015-10-26 21:10:41 +080018362 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018363 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018364 vkFreeMemory(m_device->device(), srcMem, NULL);
18365 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018366}
18367
Karl Schultz6addd812016-02-02 17:17:23 -070018368TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
18369 VkResult err;
18370 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018371
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18373 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018374
Tony Barbour1fa09702017-03-16 12:09:08 -060018375 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018376
Chris Forbesa7530692016-05-08 12:35:39 +120018377 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018378 VkImage srcImage;
18379 VkImage dstImage;
18380 VkDeviceMemory srcMem;
18381 VkDeviceMemory destMem;
18382 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018383
18384 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018385 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18386 image_create_info.pNext = NULL;
18387 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18388 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18389 image_create_info.extent.width = 32;
18390 image_create_info.extent.height = 1;
18391 image_create_info.extent.depth = 1;
18392 image_create_info.mipLevels = 1;
18393 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120018394 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018395 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18396 // Note: Some implementations expect color attachment usage for any
18397 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018398 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018399 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018400
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018401 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018402 ASSERT_VK_SUCCESS(err);
18403
Karl Schultz6addd812016-02-02 17:17:23 -070018404 // Note: Some implementations expect color attachment usage for any
18405 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018406 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018407
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018408 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018409 ASSERT_VK_SUCCESS(err);
18410
18411 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018412 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018413 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18414 memAlloc.pNext = NULL;
18415 memAlloc.allocationSize = 0;
18416 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018417
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018418 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018419 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018420 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018421 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018422 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018423 ASSERT_VK_SUCCESS(err);
18424
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018425 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018426 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018427 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018428 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018429 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018430 ASSERT_VK_SUCCESS(err);
18431
18432 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18433 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018434 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018435 ASSERT_VK_SUCCESS(err);
18436
Tony Barbour552f6c02016-12-21 14:34:07 -070018437 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018438 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018439 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18440 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018441 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018442 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018443 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018444 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018445 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018446 resolveRegion.srcOffset.x = 0;
18447 resolveRegion.srcOffset.y = 0;
18448 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018449 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018450 resolveRegion.dstSubresource.mipLevel = 0;
18451 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018452 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018453 resolveRegion.dstOffset.x = 0;
18454 resolveRegion.dstOffset.y = 0;
18455 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018456 resolveRegion.extent.width = 1;
18457 resolveRegion.extent.height = 1;
18458 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018459 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018460 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018461
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018462 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018463
Chia-I Wuf7458c52015-10-26 21:10:41 +080018464 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018465 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018466 vkFreeMemory(m_device->device(), srcMem, NULL);
18467 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018468}
18469
Karl Schultz6addd812016-02-02 17:17:23 -070018470TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
18471 VkResult err;
18472 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018473
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018475 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018476
Tony Barbour1fa09702017-03-16 12:09:08 -060018477 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018478
18479 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018480 VkImage srcImage;
18481 VkImage dstImage;
18482 VkDeviceMemory srcMem;
18483 VkDeviceMemory destMem;
18484 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018485
18486 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018487 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18488 image_create_info.pNext = NULL;
18489 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18490 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18491 image_create_info.extent.width = 32;
18492 image_create_info.extent.height = 1;
18493 image_create_info.extent.depth = 1;
18494 image_create_info.mipLevels = 1;
18495 image_create_info.arrayLayers = 1;
18496 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18497 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18498 // Note: Some implementations expect color attachment usage for any
18499 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018500 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018501 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018502
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018503 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018504 ASSERT_VK_SUCCESS(err);
18505
Karl Schultz6addd812016-02-02 17:17:23 -070018506 // Set format to something other than source image
18507 image_create_info.format = VK_FORMAT_R32_SFLOAT;
18508 // Note: Some implementations expect color attachment usage for any
18509 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018510 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018511 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018512
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018513 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018514 ASSERT_VK_SUCCESS(err);
18515
18516 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018517 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018518 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18519 memAlloc.pNext = NULL;
18520 memAlloc.allocationSize = 0;
18521 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018522
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018523 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018524 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018525 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018526 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018527 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018528 ASSERT_VK_SUCCESS(err);
18529
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018530 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018531 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018532 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018533 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018534 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018535 ASSERT_VK_SUCCESS(err);
18536
18537 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18538 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018539 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018540 ASSERT_VK_SUCCESS(err);
18541
Tony Barbour552f6c02016-12-21 14:34:07 -070018542 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018543 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018544 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18545 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018546 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018547 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018548 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018549 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018550 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018551 resolveRegion.srcOffset.x = 0;
18552 resolveRegion.srcOffset.y = 0;
18553 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018554 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018555 resolveRegion.dstSubresource.mipLevel = 0;
18556 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018557 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018558 resolveRegion.dstOffset.x = 0;
18559 resolveRegion.dstOffset.y = 0;
18560 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018561 resolveRegion.extent.width = 1;
18562 resolveRegion.extent.height = 1;
18563 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018564 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018565 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018566
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018567 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018568
Chia-I Wuf7458c52015-10-26 21:10:41 +080018569 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018570 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018571 vkFreeMemory(m_device->device(), srcMem, NULL);
18572 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018573}
18574
Karl Schultz6addd812016-02-02 17:17:23 -070018575TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
18576 VkResult err;
18577 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018578
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018580 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018581
Tony Barbour1fa09702017-03-16 12:09:08 -060018582 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018583
18584 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018585 VkImage srcImage;
18586 VkImage dstImage;
18587 VkDeviceMemory srcMem;
18588 VkDeviceMemory destMem;
18589 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018590
18591 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018592 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18593 image_create_info.pNext = NULL;
18594 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18595 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18596 image_create_info.extent.width = 32;
18597 image_create_info.extent.height = 1;
18598 image_create_info.extent.depth = 1;
18599 image_create_info.mipLevels = 1;
18600 image_create_info.arrayLayers = 1;
18601 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18602 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18603 // Note: Some implementations expect color attachment usage for any
18604 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018605 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018606 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018607
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018608 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018609 ASSERT_VK_SUCCESS(err);
18610
Karl Schultz6addd812016-02-02 17:17:23 -070018611 image_create_info.imageType = VK_IMAGE_TYPE_1D;
18612 // Note: Some implementations expect color attachment usage for any
18613 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018614 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018615 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018616
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018617 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018618 ASSERT_VK_SUCCESS(err);
18619
18620 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018621 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018622 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18623 memAlloc.pNext = NULL;
18624 memAlloc.allocationSize = 0;
18625 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018626
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018627 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018628 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018629 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018630 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018631 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018632 ASSERT_VK_SUCCESS(err);
18633
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018634 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018635 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018636 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018637 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018638 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018639 ASSERT_VK_SUCCESS(err);
18640
18641 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18642 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018643 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018644 ASSERT_VK_SUCCESS(err);
18645
Tony Barbour552f6c02016-12-21 14:34:07 -070018646 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018647 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018648 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18649 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018650 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018651 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018652 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018653 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018654 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018655 resolveRegion.srcOffset.x = 0;
18656 resolveRegion.srcOffset.y = 0;
18657 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018658 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018659 resolveRegion.dstSubresource.mipLevel = 0;
18660 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018661 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018662 resolveRegion.dstOffset.x = 0;
18663 resolveRegion.dstOffset.y = 0;
18664 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018665 resolveRegion.extent.width = 1;
18666 resolveRegion.extent.height = 1;
18667 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018668 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018669 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018670
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018671 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018672
Chia-I Wuf7458c52015-10-26 21:10:41 +080018673 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018674 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018675 vkFreeMemory(m_device->device(), srcMem, NULL);
18676 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018677}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018678
Karl Schultz6addd812016-02-02 17:17:23 -070018679TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018680 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018681 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18682 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018683 // The image format check comes 2nd in validation so we trigger it first,
18684 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018685 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018686
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18688 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018689
Tony Barbour1fa09702017-03-16 12:09:08 -060018690 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018691 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018692 if (!depth_format) {
18693 return;
18694 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018695
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018696 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018697 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18698 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018699
18700 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018701 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18702 ds_pool_ci.pNext = NULL;
18703 ds_pool_ci.maxSets = 1;
18704 ds_pool_ci.poolSizeCount = 1;
18705 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018706
18707 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018708 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018709 ASSERT_VK_SUCCESS(err);
18710
18711 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018712 dsl_binding.binding = 0;
18713 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18714 dsl_binding.descriptorCount = 1;
18715 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18716 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018717
18718 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018719 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18720 ds_layout_ci.pNext = NULL;
18721 ds_layout_ci.bindingCount = 1;
18722 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018723 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018724 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018725 ASSERT_VK_SUCCESS(err);
18726
18727 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018728 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018729 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018730 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018731 alloc_info.descriptorPool = ds_pool;
18732 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018733 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018734 ASSERT_VK_SUCCESS(err);
18735
Karl Schultz6addd812016-02-02 17:17:23 -070018736 VkImage image_bad;
18737 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018738 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018739 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018740 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018741 const int32_t tex_width = 32;
18742 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018743
18744 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018745 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18746 image_create_info.pNext = NULL;
18747 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18748 image_create_info.format = tex_format_bad;
18749 image_create_info.extent.width = tex_width;
18750 image_create_info.extent.height = tex_height;
18751 image_create_info.extent.depth = 1;
18752 image_create_info.mipLevels = 1;
18753 image_create_info.arrayLayers = 1;
18754 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18755 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018756 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018757 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018758
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018759 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018760 ASSERT_VK_SUCCESS(err);
18761 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018762 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18763 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018764 ASSERT_VK_SUCCESS(err);
18765
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018766 // ---Bind image memory---
18767 VkMemoryRequirements img_mem_reqs;
18768 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18769 VkMemoryAllocateInfo image_alloc_info = {};
18770 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18771 image_alloc_info.pNext = NULL;
18772 image_alloc_info.memoryTypeIndex = 0;
18773 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018774 bool pass =
18775 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 -070018776 ASSERT_TRUE(pass);
18777 VkDeviceMemory mem;
18778 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18779 ASSERT_VK_SUCCESS(err);
18780 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18781 ASSERT_VK_SUCCESS(err);
18782 // -----------------------
18783
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018784 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018785 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018786 image_view_create_info.image = image_bad;
18787 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18788 image_view_create_info.format = tex_format_bad;
18789 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18790 image_view_create_info.subresourceRange.baseMipLevel = 0;
18791 image_view_create_info.subresourceRange.layerCount = 1;
18792 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018793 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018794
18795 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018796 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018797
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018798 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018799
Chia-I Wuf7458c52015-10-26 21:10:41 +080018800 vkDestroyImage(m_device->device(), image_bad, NULL);
18801 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018802 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18803 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018804
18805 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018806}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018807
18808TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018809 TEST_DESCRIPTION(
18810 "Call ClearColorImage w/ a depth|stencil image and "
18811 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018812
Tony Barbour1fa09702017-03-16 12:09:08 -060018813 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018814 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018815 if (!depth_format) {
18816 return;
18817 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018818 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18819
Tony Barbour552f6c02016-12-21 14:34:07 -070018820 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018821
18822 // Color image
18823 VkClearColorValue clear_color;
18824 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18825 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18826 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18827 const int32_t img_width = 32;
18828 const int32_t img_height = 32;
18829 VkImageCreateInfo image_create_info = {};
18830 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18831 image_create_info.pNext = NULL;
18832 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18833 image_create_info.format = color_format;
18834 image_create_info.extent.width = img_width;
18835 image_create_info.extent.height = img_height;
18836 image_create_info.extent.depth = 1;
18837 image_create_info.mipLevels = 1;
18838 image_create_info.arrayLayers = 1;
18839 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18840 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18841 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18842
18843 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018844 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018845
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018846 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018847
18848 // Depth/Stencil image
18849 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018850 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018851 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18852 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018853 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018854 ds_image_create_info.extent.width = 64;
18855 ds_image_create_info.extent.height = 64;
18856 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018857 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 -060018858
18859 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018860 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018861
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018862 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 -060018863
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018866 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018867 &color_range);
18868
18869 m_errorMonitor->VerifyFound();
18870
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18872 "vkCmdClearColorImage called with "
18873 "image created without "
18874 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018875
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018876 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018877 &color_range);
18878
18879 m_errorMonitor->VerifyFound();
18880
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018881 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18883 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018884
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018885 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18886 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018887
18888 m_errorMonitor->VerifyFound();
18889}
Tobin Ehliscde08892015-09-22 10:11:37 -060018890
Mike Schuchardt35fece12017-03-07 14:40:28 -070018891TEST_F(VkLayerTest, CommandQueueFlags) {
18892 TEST_DESCRIPTION(
18893 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18894 "graphics-only command");
18895
18896 ASSERT_NO_FATAL_FAILURE(Init());
18897
18898 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018899 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018900 printf(" Non-graphics queue family not found; skipped.\n");
18901 return;
18902 } else {
18903 // Create command pool on a non-graphics queue
18904 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18905
18906 // Setup command buffer on pool
18907 VkCommandBufferObj command_buffer(m_device, &command_pool);
18908 command_buffer.BeginCommandBuffer();
18909
18910 // Issue a graphics only command
18911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18912 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18913 command_buffer.SetViewport(0, 1, &viewport);
18914 m_errorMonitor->VerifyFound();
18915 }
18916}
18917
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018918// WSI Enabled Tests
18919//
Chris Forbes09368e42016-10-13 11:59:22 +130018920#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018921TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18922
18923#if defined(VK_USE_PLATFORM_XCB_KHR)
18924 VkSurfaceKHR surface = VK_NULL_HANDLE;
18925
18926 VkResult err;
18927 bool pass;
18928 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18929 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18930 // uint32_t swapchain_image_count = 0;
18931 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18932 // uint32_t image_index = 0;
18933 // VkPresentInfoKHR present_info = {};
18934
Tony Barbour1fa09702017-03-16 12:09:08 -060018935 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018936
18937 // Use the create function from one of the VK_KHR_*_surface extension in
18938 // order to create a surface, testing all known errors in the process,
18939 // before successfully creating a surface:
18940 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18942 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18943 pass = (err != VK_SUCCESS);
18944 ASSERT_TRUE(pass);
18945 m_errorMonitor->VerifyFound();
18946
18947 // Next, try to create a surface with the wrong
18948 // VkXcbSurfaceCreateInfoKHR::sType:
18949 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18950 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18952 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18953 pass = (err != VK_SUCCESS);
18954 ASSERT_TRUE(pass);
18955 m_errorMonitor->VerifyFound();
18956
18957 // Create a native window, and then correctly create a surface:
18958 xcb_connection_t *connection;
18959 xcb_screen_t *screen;
18960 xcb_window_t xcb_window;
18961 xcb_intern_atom_reply_t *atom_wm_delete_window;
18962
18963 const xcb_setup_t *setup;
18964 xcb_screen_iterator_t iter;
18965 int scr;
18966 uint32_t value_mask, value_list[32];
18967 int width = 1;
18968 int height = 1;
18969
18970 connection = xcb_connect(NULL, &scr);
18971 ASSERT_TRUE(connection != NULL);
18972 setup = xcb_get_setup(connection);
18973 iter = xcb_setup_roots_iterator(setup);
18974 while (scr-- > 0)
18975 xcb_screen_next(&iter);
18976 screen = iter.data;
18977
18978 xcb_window = xcb_generate_id(connection);
18979
18980 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18981 value_list[0] = screen->black_pixel;
18982 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18983
18984 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18985 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18986
18987 /* Magic code that will send notification when window is destroyed */
18988 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18989 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18990
18991 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18992 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18993 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18994 free(reply);
18995
18996 xcb_map_window(connection, xcb_window);
18997
18998 // Force the x/y coordinates to 100,100 results are identical in consecutive
18999 // runs
19000 const uint32_t coords[] = { 100, 100 };
19001 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
19002
19003 // Finally, try to correctly create a surface:
19004 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
19005 xcb_create_info.pNext = NULL;
19006 xcb_create_info.flags = 0;
19007 xcb_create_info.connection = connection;
19008 xcb_create_info.window = xcb_window;
19009 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19010 pass = (err == VK_SUCCESS);
19011 ASSERT_TRUE(pass);
19012
19013 // Check if surface supports presentation:
19014
19015 // 1st, do so without having queried the queue families:
19016 VkBool32 supported = false;
19017 // TODO: Get the following error to come out:
19018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19019 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
19020 "function");
19021 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19022 pass = (err != VK_SUCCESS);
19023 // ASSERT_TRUE(pass);
19024 // m_errorMonitor->VerifyFound();
19025
19026 // Next, query a queue family index that's too large:
19027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19028 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
19029 pass = (err != VK_SUCCESS);
19030 ASSERT_TRUE(pass);
19031 m_errorMonitor->VerifyFound();
19032
19033 // Finally, do so correctly:
19034 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19035 // SUPPORTED
19036 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19037 pass = (err == VK_SUCCESS);
19038 ASSERT_TRUE(pass);
19039
19040 // Before proceeding, try to create a swapchain without having called
19041 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
19042 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19043 swapchain_create_info.pNext = NULL;
19044 swapchain_create_info.flags = 0;
19045 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
19046 swapchain_create_info.surface = surface;
19047 swapchain_create_info.imageArrayLayers = 1;
19048 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
19049 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
19050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19051 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
19052 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19053 pass = (err != VK_SUCCESS);
19054 ASSERT_TRUE(pass);
19055 m_errorMonitor->VerifyFound();
19056
19057 // Get the surface capabilities:
19058 VkSurfaceCapabilitiesKHR surface_capabilities;
19059
19060 // Do so correctly (only error logged by this entrypoint is if the
19061 // extension isn't enabled):
19062 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
19063 pass = (err == VK_SUCCESS);
19064 ASSERT_TRUE(pass);
19065
19066 // Get the surface formats:
19067 uint32_t surface_format_count;
19068
19069 // First, try without a pointer to surface_format_count:
19070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
19071 "specified as NULL");
19072 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
19073 pass = (err == VK_SUCCESS);
19074 ASSERT_TRUE(pass);
19075 m_errorMonitor->VerifyFound();
19076
19077 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
19078 // correctly done a 1st try (to get the count):
19079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19080 surface_format_count = 0;
19081 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
19082 pass = (err == VK_SUCCESS);
19083 ASSERT_TRUE(pass);
19084 m_errorMonitor->VerifyFound();
19085
19086 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19087 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19088 pass = (err == VK_SUCCESS);
19089 ASSERT_TRUE(pass);
19090
19091 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19092 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
19093
19094 // Next, do a 2nd try with surface_format_count being set too high:
19095 surface_format_count += 5;
19096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19097 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19098 pass = (err == VK_SUCCESS);
19099 ASSERT_TRUE(pass);
19100 m_errorMonitor->VerifyFound();
19101
19102 // Finally, do a correct 1st and 2nd try:
19103 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19104 pass = (err == VK_SUCCESS);
19105 ASSERT_TRUE(pass);
19106 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19107 pass = (err == VK_SUCCESS);
19108 ASSERT_TRUE(pass);
19109
19110 // Get the surface present modes:
19111 uint32_t surface_present_mode_count;
19112
19113 // First, try without a pointer to surface_format_count:
19114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
19115 "specified as NULL");
19116
19117 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
19118 pass = (err == VK_SUCCESS);
19119 ASSERT_TRUE(pass);
19120 m_errorMonitor->VerifyFound();
19121
19122 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
19123 // correctly done a 1st try (to get the count):
19124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19125 surface_present_mode_count = 0;
19126 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
19127 (VkPresentModeKHR *)&surface_present_mode_count);
19128 pass = (err == VK_SUCCESS);
19129 ASSERT_TRUE(pass);
19130 m_errorMonitor->VerifyFound();
19131
19132 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19133 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19134 pass = (err == VK_SUCCESS);
19135 ASSERT_TRUE(pass);
19136
19137 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19138 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
19139
19140 // Next, do a 2nd try with surface_format_count being set too high:
19141 surface_present_mode_count += 5;
19142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19143 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19144 pass = (err == VK_SUCCESS);
19145 ASSERT_TRUE(pass);
19146 m_errorMonitor->VerifyFound();
19147
19148 // Finally, do a correct 1st and 2nd try:
19149 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19150 pass = (err == VK_SUCCESS);
19151 ASSERT_TRUE(pass);
19152 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19153 pass = (err == VK_SUCCESS);
19154 ASSERT_TRUE(pass);
19155
19156 // Create a swapchain:
19157
19158 // First, try without a pointer to swapchain_create_info:
19159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
19160 "specified as NULL");
19161
19162 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
19163 pass = (err != VK_SUCCESS);
19164 ASSERT_TRUE(pass);
19165 m_errorMonitor->VerifyFound();
19166
19167 // Next, call with a non-NULL swapchain_create_info, that has the wrong
19168 // sType:
19169 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19171
19172 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19173 pass = (err != VK_SUCCESS);
19174 ASSERT_TRUE(pass);
19175 m_errorMonitor->VerifyFound();
19176
19177 // Next, call with a NULL swapchain pointer:
19178 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19179 swapchain_create_info.pNext = NULL;
19180 swapchain_create_info.flags = 0;
19181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
19182 "specified as NULL");
19183
19184 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
19185 pass = (err != VK_SUCCESS);
19186 ASSERT_TRUE(pass);
19187 m_errorMonitor->VerifyFound();
19188
19189 // TODO: Enhance swapchain layer so that
19190 // swapchain_create_info.queueFamilyIndexCount is checked against something?
19191
19192 // Next, call with a queue family index that's too large:
19193 uint32_t queueFamilyIndex[2] = { 100000, 0 };
19194 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19195 swapchain_create_info.queueFamilyIndexCount = 2;
19196 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
19197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19198 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19199 pass = (err != VK_SUCCESS);
19200 ASSERT_TRUE(pass);
19201 m_errorMonitor->VerifyFound();
19202
19203 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
19204 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19205 swapchain_create_info.queueFamilyIndexCount = 1;
19206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19207 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
19208 "pCreateInfo->pQueueFamilyIndices).");
19209 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19210 pass = (err != VK_SUCCESS);
19211 ASSERT_TRUE(pass);
19212 m_errorMonitor->VerifyFound();
19213
19214 // Next, call with an invalid imageSharingMode:
19215 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
19216 swapchain_create_info.queueFamilyIndexCount = 1;
19217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19218 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
19219 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19220 pass = (err != VK_SUCCESS);
19221 ASSERT_TRUE(pass);
19222 m_errorMonitor->VerifyFound();
19223 // Fix for the future:
19224 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19225 // SUPPORTED
19226 swapchain_create_info.queueFamilyIndexCount = 0;
19227 queueFamilyIndex[0] = 0;
19228 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
19229
19230 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
19231 // Get the images from a swapchain:
19232 // Acquire an image from a swapchain:
19233 // Present an image to a swapchain:
19234 // Destroy the swapchain:
19235
19236 // TODOs:
19237 //
19238 // - Try destroying the device without first destroying the swapchain
19239 //
19240 // - Try destroying the device without first destroying the surface
19241 //
19242 // - Try destroying the surface without first destroying the swapchain
19243
19244 // Destroy the surface:
19245 vkDestroySurfaceKHR(instance(), surface, NULL);
19246
19247 // Tear down the window:
19248 xcb_destroy_window(connection, xcb_window);
19249 xcb_disconnect(connection);
19250
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019251#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019252 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019253#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019254}
Chris Forbes09368e42016-10-13 11:59:22 +130019255#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019256
19257//
19258// POSITIVE VALIDATION TESTS
19259//
19260// These tests do not expect to encounter ANY validation errors pass only if this is true
19261
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019262TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
19263 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060019264 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019265 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19266
19267 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19268 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019269 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019270 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19271 command_buffer_allocate_info.commandBufferCount = 1;
19272
19273 VkCommandBuffer secondary_command_buffer;
19274 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19275 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19276 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19277 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19278 command_buffer_inheritance_info.renderPass = m_renderPass;
19279 command_buffer_inheritance_info.framebuffer = m_framebuffer;
19280
19281 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19282 command_buffer_begin_info.flags =
19283 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
19284 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19285
19286 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19287 VkClearAttachment color_attachment;
19288 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19289 color_attachment.clearValue.color.float32[0] = 0;
19290 color_attachment.clearValue.color.float32[1] = 0;
19291 color_attachment.clearValue.color.float32[2] = 0;
19292 color_attachment.clearValue.color.float32[3] = 0;
19293 color_attachment.colorAttachment = 0;
19294 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
19295 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
19296}
19297
Tobin Ehlise0006882016-11-03 10:14:28 -060019298TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019299 TEST_DESCRIPTION(
19300 "Perform an image layout transition in a secondary command buffer followed "
19301 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060019302 VkResult err;
19303 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060019304 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060019305 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070019306 if (!depth_format) {
19307 return;
19308 }
Tobin Ehlise0006882016-11-03 10:14:28 -060019309 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19310 // Allocate a secondary and primary cmd buffer
19311 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19312 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019313 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060019314 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19315 command_buffer_allocate_info.commandBufferCount = 1;
19316
19317 VkCommandBuffer secondary_command_buffer;
19318 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19319 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19320 VkCommandBuffer primary_command_buffer;
19321 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19322 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19323 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19324 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19325 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19326 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
19327 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19328
19329 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19330 ASSERT_VK_SUCCESS(err);
19331 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019332 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 -060019333 ASSERT_TRUE(image.initialized());
19334 VkImageMemoryBarrier img_barrier = {};
19335 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19336 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19337 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19338 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
19339 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19340 img_barrier.image = image.handle();
19341 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19342 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19343 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19344 img_barrier.subresourceRange.baseArrayLayer = 0;
19345 img_barrier.subresourceRange.baseMipLevel = 0;
19346 img_barrier.subresourceRange.layerCount = 1;
19347 img_barrier.subresourceRange.levelCount = 1;
19348 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
19349 0, nullptr, 1, &img_barrier);
19350 err = vkEndCommandBuffer(secondary_command_buffer);
19351 ASSERT_VK_SUCCESS(err);
19352
19353 // Now update primary cmd buffer to execute secondary and transitions image
19354 command_buffer_begin_info.pInheritanceInfo = nullptr;
19355 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
19356 ASSERT_VK_SUCCESS(err);
19357 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
19358 VkImageMemoryBarrier img_barrier2 = {};
19359 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19360 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19361 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19362 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19363 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19364 img_barrier2.image = image.handle();
19365 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19366 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19367 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19368 img_barrier2.subresourceRange.baseArrayLayer = 0;
19369 img_barrier2.subresourceRange.baseMipLevel = 0;
19370 img_barrier2.subresourceRange.layerCount = 1;
19371 img_barrier2.subresourceRange.levelCount = 1;
19372 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
19373 nullptr, 1, &img_barrier2);
19374 err = vkEndCommandBuffer(primary_command_buffer);
19375 ASSERT_VK_SUCCESS(err);
19376 VkSubmitInfo submit_info = {};
19377 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19378 submit_info.commandBufferCount = 1;
19379 submit_info.pCommandBuffers = &primary_command_buffer;
19380 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19381 ASSERT_VK_SUCCESS(err);
19382 m_errorMonitor->VerifyNotFound();
19383 err = vkDeviceWaitIdle(m_device->device());
19384 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070019385 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
19386 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060019387}
19388
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019389// This is a positive test. No failures are expected.
19390TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019391 TEST_DESCRIPTION(
19392 "Ensure that the vkUpdateDescriptorSets validation code "
19393 "is ignoring VkWriteDescriptorSet members that are not "
19394 "related to the descriptor type specified by "
19395 "VkWriteDescriptorSet::descriptorType. Correct "
19396 "validation behavior will result in the test running to "
19397 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019398
19399 const uintptr_t invalid_ptr = 0xcdcdcdcd;
19400
Tony Barbour1fa09702017-03-16 12:09:08 -060019401 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019402
19403 // Image Case
19404 {
19405 m_errorMonitor->ExpectSuccess();
19406
19407 VkImage image;
19408 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
19409 const int32_t tex_width = 32;
19410 const int32_t tex_height = 32;
19411 VkImageCreateInfo image_create_info = {};
19412 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19413 image_create_info.pNext = NULL;
19414 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19415 image_create_info.format = tex_format;
19416 image_create_info.extent.width = tex_width;
19417 image_create_info.extent.height = tex_height;
19418 image_create_info.extent.depth = 1;
19419 image_create_info.mipLevels = 1;
19420 image_create_info.arrayLayers = 1;
19421 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19422 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19423 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
19424 image_create_info.flags = 0;
19425 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19426 ASSERT_VK_SUCCESS(err);
19427
19428 VkMemoryRequirements memory_reqs;
19429 VkDeviceMemory image_memory;
19430 bool pass;
19431 VkMemoryAllocateInfo memory_info = {};
19432 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19433 memory_info.pNext = NULL;
19434 memory_info.allocationSize = 0;
19435 memory_info.memoryTypeIndex = 0;
19436 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19437 memory_info.allocationSize = memory_reqs.size;
19438 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19439 ASSERT_TRUE(pass);
19440 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
19441 ASSERT_VK_SUCCESS(err);
19442 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
19443 ASSERT_VK_SUCCESS(err);
19444
19445 VkImageViewCreateInfo image_view_create_info = {};
19446 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19447 image_view_create_info.image = image;
19448 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
19449 image_view_create_info.format = tex_format;
19450 image_view_create_info.subresourceRange.layerCount = 1;
19451 image_view_create_info.subresourceRange.baseMipLevel = 0;
19452 image_view_create_info.subresourceRange.levelCount = 1;
19453 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19454
19455 VkImageView view;
19456 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
19457 ASSERT_VK_SUCCESS(err);
19458
19459 VkDescriptorPoolSize ds_type_count = {};
19460 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19461 ds_type_count.descriptorCount = 1;
19462
19463 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19464 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19465 ds_pool_ci.pNext = NULL;
19466 ds_pool_ci.maxSets = 1;
19467 ds_pool_ci.poolSizeCount = 1;
19468 ds_pool_ci.pPoolSizes = &ds_type_count;
19469
19470 VkDescriptorPool ds_pool;
19471 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19472 ASSERT_VK_SUCCESS(err);
19473
19474 VkDescriptorSetLayoutBinding dsl_binding = {};
19475 dsl_binding.binding = 0;
19476 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19477 dsl_binding.descriptorCount = 1;
19478 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19479 dsl_binding.pImmutableSamplers = NULL;
19480
19481 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19482 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19483 ds_layout_ci.pNext = NULL;
19484 ds_layout_ci.bindingCount = 1;
19485 ds_layout_ci.pBindings = &dsl_binding;
19486 VkDescriptorSetLayout ds_layout;
19487 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19488 ASSERT_VK_SUCCESS(err);
19489
19490 VkDescriptorSet descriptor_set;
19491 VkDescriptorSetAllocateInfo alloc_info = {};
19492 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19493 alloc_info.descriptorSetCount = 1;
19494 alloc_info.descriptorPool = ds_pool;
19495 alloc_info.pSetLayouts = &ds_layout;
19496 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19497 ASSERT_VK_SUCCESS(err);
19498
19499 VkDescriptorImageInfo image_info = {};
19500 image_info.imageView = view;
19501 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
19502
19503 VkWriteDescriptorSet descriptor_write;
19504 memset(&descriptor_write, 0, sizeof(descriptor_write));
19505 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19506 descriptor_write.dstSet = descriptor_set;
19507 descriptor_write.dstBinding = 0;
19508 descriptor_write.descriptorCount = 1;
19509 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19510 descriptor_write.pImageInfo = &image_info;
19511
19512 // Set pBufferInfo and pTexelBufferView to invalid values, which should
19513 // be
19514 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
19515 // This will most likely produce a crash if the parameter_validation
19516 // layer
19517 // does not correctly ignore pBufferInfo.
19518 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19519 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19520
19521 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19522
19523 m_errorMonitor->VerifyNotFound();
19524
19525 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19526 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19527 vkDestroyImageView(m_device->device(), view, NULL);
19528 vkDestroyImage(m_device->device(), image, NULL);
19529 vkFreeMemory(m_device->device(), image_memory, NULL);
19530 }
19531
19532 // Buffer Case
19533 {
19534 m_errorMonitor->ExpectSuccess();
19535
19536 VkBuffer buffer;
19537 uint32_t queue_family_index = 0;
19538 VkBufferCreateInfo buffer_create_info = {};
19539 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19540 buffer_create_info.size = 1024;
19541 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19542 buffer_create_info.queueFamilyIndexCount = 1;
19543 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19544
19545 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19546 ASSERT_VK_SUCCESS(err);
19547
19548 VkMemoryRequirements memory_reqs;
19549 VkDeviceMemory buffer_memory;
19550 bool pass;
19551 VkMemoryAllocateInfo memory_info = {};
19552 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19553 memory_info.pNext = NULL;
19554 memory_info.allocationSize = 0;
19555 memory_info.memoryTypeIndex = 0;
19556
19557 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19558 memory_info.allocationSize = memory_reqs.size;
19559 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19560 ASSERT_TRUE(pass);
19561
19562 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19563 ASSERT_VK_SUCCESS(err);
19564 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19565 ASSERT_VK_SUCCESS(err);
19566
19567 VkDescriptorPoolSize ds_type_count = {};
19568 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19569 ds_type_count.descriptorCount = 1;
19570
19571 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19572 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19573 ds_pool_ci.pNext = NULL;
19574 ds_pool_ci.maxSets = 1;
19575 ds_pool_ci.poolSizeCount = 1;
19576 ds_pool_ci.pPoolSizes = &ds_type_count;
19577
19578 VkDescriptorPool ds_pool;
19579 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19580 ASSERT_VK_SUCCESS(err);
19581
19582 VkDescriptorSetLayoutBinding dsl_binding = {};
19583 dsl_binding.binding = 0;
19584 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19585 dsl_binding.descriptorCount = 1;
19586 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19587 dsl_binding.pImmutableSamplers = NULL;
19588
19589 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19590 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19591 ds_layout_ci.pNext = NULL;
19592 ds_layout_ci.bindingCount = 1;
19593 ds_layout_ci.pBindings = &dsl_binding;
19594 VkDescriptorSetLayout ds_layout;
19595 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19596 ASSERT_VK_SUCCESS(err);
19597
19598 VkDescriptorSet descriptor_set;
19599 VkDescriptorSetAllocateInfo alloc_info = {};
19600 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19601 alloc_info.descriptorSetCount = 1;
19602 alloc_info.descriptorPool = ds_pool;
19603 alloc_info.pSetLayouts = &ds_layout;
19604 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19605 ASSERT_VK_SUCCESS(err);
19606
19607 VkDescriptorBufferInfo buffer_info = {};
19608 buffer_info.buffer = buffer;
19609 buffer_info.offset = 0;
19610 buffer_info.range = 1024;
19611
19612 VkWriteDescriptorSet descriptor_write;
19613 memset(&descriptor_write, 0, sizeof(descriptor_write));
19614 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19615 descriptor_write.dstSet = descriptor_set;
19616 descriptor_write.dstBinding = 0;
19617 descriptor_write.descriptorCount = 1;
19618 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19619 descriptor_write.pBufferInfo = &buffer_info;
19620
19621 // Set pImageInfo and pTexelBufferView to invalid values, which should
19622 // be
19623 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
19624 // This will most likely produce a crash if the parameter_validation
19625 // layer
19626 // does not correctly ignore pImageInfo.
19627 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19628 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19629
19630 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19631
19632 m_errorMonitor->VerifyNotFound();
19633
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019634 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19635 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19636 vkDestroyBuffer(m_device->device(), buffer, NULL);
19637 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19638 }
19639
19640 // Texel Buffer Case
19641 {
19642 m_errorMonitor->ExpectSuccess();
19643
19644 VkBuffer buffer;
19645 uint32_t queue_family_index = 0;
19646 VkBufferCreateInfo buffer_create_info = {};
19647 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19648 buffer_create_info.size = 1024;
19649 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
19650 buffer_create_info.queueFamilyIndexCount = 1;
19651 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19652
19653 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19654 ASSERT_VK_SUCCESS(err);
19655
19656 VkMemoryRequirements memory_reqs;
19657 VkDeviceMemory buffer_memory;
19658 bool pass;
19659 VkMemoryAllocateInfo memory_info = {};
19660 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19661 memory_info.pNext = NULL;
19662 memory_info.allocationSize = 0;
19663 memory_info.memoryTypeIndex = 0;
19664
19665 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19666 memory_info.allocationSize = memory_reqs.size;
19667 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19668 ASSERT_TRUE(pass);
19669
19670 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19671 ASSERT_VK_SUCCESS(err);
19672 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19673 ASSERT_VK_SUCCESS(err);
19674
19675 VkBufferViewCreateInfo buff_view_ci = {};
19676 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
19677 buff_view_ci.buffer = buffer;
19678 buff_view_ci.format = VK_FORMAT_R8_UNORM;
19679 buff_view_ci.range = VK_WHOLE_SIZE;
19680 VkBufferView buffer_view;
19681 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19682
19683 VkDescriptorPoolSize ds_type_count = {};
19684 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19685 ds_type_count.descriptorCount = 1;
19686
19687 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19688 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19689 ds_pool_ci.pNext = NULL;
19690 ds_pool_ci.maxSets = 1;
19691 ds_pool_ci.poolSizeCount = 1;
19692 ds_pool_ci.pPoolSizes = &ds_type_count;
19693
19694 VkDescriptorPool ds_pool;
19695 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19696 ASSERT_VK_SUCCESS(err);
19697
19698 VkDescriptorSetLayoutBinding dsl_binding = {};
19699 dsl_binding.binding = 0;
19700 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19701 dsl_binding.descriptorCount = 1;
19702 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19703 dsl_binding.pImmutableSamplers = NULL;
19704
19705 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19706 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19707 ds_layout_ci.pNext = NULL;
19708 ds_layout_ci.bindingCount = 1;
19709 ds_layout_ci.pBindings = &dsl_binding;
19710 VkDescriptorSetLayout ds_layout;
19711 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19712 ASSERT_VK_SUCCESS(err);
19713
19714 VkDescriptorSet descriptor_set;
19715 VkDescriptorSetAllocateInfo alloc_info = {};
19716 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19717 alloc_info.descriptorSetCount = 1;
19718 alloc_info.descriptorPool = ds_pool;
19719 alloc_info.pSetLayouts = &ds_layout;
19720 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19721 ASSERT_VK_SUCCESS(err);
19722
19723 VkWriteDescriptorSet descriptor_write;
19724 memset(&descriptor_write, 0, sizeof(descriptor_write));
19725 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19726 descriptor_write.dstSet = descriptor_set;
19727 descriptor_write.dstBinding = 0;
19728 descriptor_write.descriptorCount = 1;
19729 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19730 descriptor_write.pTexelBufferView = &buffer_view;
19731
19732 // Set pImageInfo and pBufferInfo to invalid values, which should be
19733 // ignored for descriptorType ==
19734 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19735 // This will most likely produce a crash if the parameter_validation
19736 // layer
19737 // does not correctly ignore pImageInfo and pBufferInfo.
19738 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19739 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19740
19741 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19742
19743 m_errorMonitor->VerifyNotFound();
19744
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19747 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19748 vkDestroyBuffer(m_device->device(), buffer, NULL);
19749 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19750 }
19751}
19752
Tobin Ehlis8893af82017-05-08 12:52:25 -060019753TEST_F(VkPositiveLayerTest, ImmutableSamplerOnlyDescriptor) {
19754 TEST_DESCRIPTION(
19755 "Bind a DescriptorSet with only an immutable sampler"
19756 "and make sure that we don't warn for no update.");
19757
19758 ASSERT_NO_FATAL_FAILURE(Init());
19759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19760
19761 VkDescriptorPoolSize ds_type_count = {};
19762 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
19763 ds_type_count.descriptorCount = 1;
19764
19765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19767 ds_pool_ci.maxSets = 1;
19768 ds_pool_ci.poolSizeCount = 1;
19769 ds_pool_ci.pPoolSizes = &ds_type_count;
19770
19771 VkDescriptorPool ds_pool;
19772 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19773 ASSERT_VK_SUCCESS(err);
19774
19775 VkSamplerCreateInfo sampler_ci = {};
19776 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
19777 sampler_ci.pNext = NULL;
19778 sampler_ci.magFilter = VK_FILTER_NEAREST;
19779 sampler_ci.minFilter = VK_FILTER_NEAREST;
19780 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
19781 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19782 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19783 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19784 sampler_ci.mipLodBias = 1.0;
19785 sampler_ci.anisotropyEnable = VK_FALSE;
19786 sampler_ci.maxAnisotropy = 1;
19787 sampler_ci.compareEnable = VK_FALSE;
19788 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
19789 sampler_ci.minLod = 1.0;
19790 sampler_ci.maxLod = 1.0;
19791 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
19792 sampler_ci.unnormalizedCoordinates = VK_FALSE;
19793 VkSampler sampler;
19794
19795 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
19796 ASSERT_VK_SUCCESS(err);
19797
19798 VkDescriptorSetLayoutBinding layout_binding = {};
19799 layout_binding.binding = 0;
19800 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
19801 layout_binding.descriptorCount = 1;
19802 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19803 layout_binding.pImmutableSamplers = static_cast<VkSampler *>(&sampler);
19804
19805 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19806 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19807 ds_layout_ci.bindingCount = 1;
19808 ds_layout_ci.pBindings = &layout_binding;
19809 VkDescriptorSetLayout ds_layout;
19810 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19811 ASSERT_VK_SUCCESS(err);
19812
19813 VkDescriptorSetAllocateInfo alloc_info = {};
19814 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19815 alloc_info.descriptorSetCount = 1;
19816 alloc_info.descriptorPool = ds_pool;
19817 alloc_info.pSetLayouts = &ds_layout;
19818 VkDescriptorSet descriptor_set;
19819 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19820 ASSERT_VK_SUCCESS(err);
19821
19822 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19823 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19824 pipeline_layout_ci.pNext = NULL;
19825 pipeline_layout_ci.setLayoutCount = 1;
19826 pipeline_layout_ci.pSetLayouts = &ds_layout;
19827
19828 VkPipelineLayout pipeline_layout;
19829 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19830 ASSERT_VK_SUCCESS(err);
19831
19832 m_errorMonitor->ExpectSuccess();
19833 m_commandBuffer->BeginCommandBuffer();
19834 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
19835
19836 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19837 &descriptor_set, 0, nullptr);
19838 m_errorMonitor->VerifyNotFound();
19839
19840 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19841 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19842 vkDestroySampler(m_device->device(), sampler, NULL);
19843 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19844}
19845
Tobin Ehlisf7428442016-10-25 07:58:24 -060019846TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19847 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19848
Tony Barbour1fa09702017-03-16 12:09:08 -060019849 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019850 // Create layout where two binding #s are "1"
19851 static const uint32_t NUM_BINDINGS = 3;
19852 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19853 dsl_binding[0].binding = 1;
19854 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19855 dsl_binding[0].descriptorCount = 1;
19856 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19857 dsl_binding[0].pImmutableSamplers = NULL;
19858 dsl_binding[1].binding = 0;
19859 dsl_binding[1].descriptorCount = 1;
19860 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19861 dsl_binding[1].descriptorCount = 1;
19862 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19863 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019864 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019865 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19866 dsl_binding[2].descriptorCount = 1;
19867 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19868 dsl_binding[2].pImmutableSamplers = NULL;
19869
19870 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19871 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19872 ds_layout_ci.pNext = NULL;
19873 ds_layout_ci.bindingCount = NUM_BINDINGS;
19874 ds_layout_ci.pBindings = dsl_binding;
19875 VkDescriptorSetLayout ds_layout;
19876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19877 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19878 m_errorMonitor->VerifyFound();
19879}
19880
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019881TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019882 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19883
Tony Barbour1fa09702017-03-16 12:09:08 -060019884 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019885
Tony Barbour552f6c02016-12-21 14:34:07 -070019886 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019887
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019888 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19889
19890 {
19891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19892 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19893 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19894 m_errorMonitor->VerifyFound();
19895 }
19896
19897 {
19898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19899 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19900 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19901 m_errorMonitor->VerifyFound();
19902 }
19903
19904 {
19905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19906 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
19907 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19908 m_errorMonitor->VerifyFound();
19909 }
19910
19911 {
19912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19913 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
19914 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19915 m_errorMonitor->VerifyFound();
19916 }
19917
19918 {
19919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
19920 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
19921 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19922 m_errorMonitor->VerifyFound();
19923 }
19924
19925 {
19926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
19927 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19928 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19929 m_errorMonitor->VerifyFound();
19930 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019931
19932 {
19933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19934 VkRect2D scissor = {{-1, 0}, {16, 16}};
19935 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19936 m_errorMonitor->VerifyFound();
19937 }
19938
19939 {
19940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19941 VkRect2D scissor = {{0, -2}, {16, 16}};
19942 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19943 m_errorMonitor->VerifyFound();
19944 }
19945
19946 {
19947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19948 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
19949 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19950 m_errorMonitor->VerifyFound();
19951 }
19952
19953 {
19954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
19955 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19956 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19957 m_errorMonitor->VerifyFound();
19958 }
19959
Tony Barbour552f6c02016-12-21 14:34:07 -070019960 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019961}
19962
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019963// This is a positive test. No failures are expected.
19964TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19965 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19966 VkResult err;
19967
Tony Barbour1fa09702017-03-16 12:09:08 -060019968 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019969 m_errorMonitor->ExpectSuccess();
19970 VkDescriptorPoolSize ds_type_count = {};
19971 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19972 ds_type_count.descriptorCount = 2;
19973
19974 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19975 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19976 ds_pool_ci.pNext = NULL;
19977 ds_pool_ci.maxSets = 1;
19978 ds_pool_ci.poolSizeCount = 1;
19979 ds_pool_ci.pPoolSizes = &ds_type_count;
19980
19981 VkDescriptorPool ds_pool;
19982 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19983 ASSERT_VK_SUCCESS(err);
19984
19985 // Create layout with two uniform buffer descriptors w/ empty binding between them
19986 static const uint32_t NUM_BINDINGS = 3;
19987 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19988 dsl_binding[0].binding = 0;
19989 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19990 dsl_binding[0].descriptorCount = 1;
19991 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19992 dsl_binding[0].pImmutableSamplers = NULL;
19993 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019994 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019995 dsl_binding[2].binding = 2;
19996 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19997 dsl_binding[2].descriptorCount = 1;
19998 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19999 dsl_binding[2].pImmutableSamplers = NULL;
20000
20001 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20002 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20003 ds_layout_ci.pNext = NULL;
20004 ds_layout_ci.bindingCount = NUM_BINDINGS;
20005 ds_layout_ci.pBindings = dsl_binding;
20006 VkDescriptorSetLayout ds_layout;
20007 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20008 ASSERT_VK_SUCCESS(err);
20009
20010 VkDescriptorSet descriptor_set = {};
20011 VkDescriptorSetAllocateInfo alloc_info = {};
20012 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20013 alloc_info.descriptorSetCount = 1;
20014 alloc_info.descriptorPool = ds_pool;
20015 alloc_info.pSetLayouts = &ds_layout;
20016 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20017 ASSERT_VK_SUCCESS(err);
20018
20019 // Create a buffer to be used for update
20020 VkBufferCreateInfo buff_ci = {};
20021 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20022 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20023 buff_ci.size = 256;
20024 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20025 VkBuffer buffer;
20026 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
20027 ASSERT_VK_SUCCESS(err);
20028 // Have to bind memory to buffer before descriptor update
20029 VkMemoryAllocateInfo mem_alloc = {};
20030 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20031 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020032 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020033 mem_alloc.memoryTypeIndex = 0;
20034
20035 VkMemoryRequirements mem_reqs;
20036 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20037 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
20038 if (!pass) {
20039 vkDestroyBuffer(m_device->device(), buffer, NULL);
20040 return;
20041 }
20042
20043 VkDeviceMemory mem;
20044 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20045 ASSERT_VK_SUCCESS(err);
20046 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20047 ASSERT_VK_SUCCESS(err);
20048
20049 // Only update the descriptor at binding 2
20050 VkDescriptorBufferInfo buff_info = {};
20051 buff_info.buffer = buffer;
20052 buff_info.offset = 0;
20053 buff_info.range = VK_WHOLE_SIZE;
20054 VkWriteDescriptorSet descriptor_write = {};
20055 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20056 descriptor_write.dstBinding = 2;
20057 descriptor_write.descriptorCount = 1;
20058 descriptor_write.pTexelBufferView = nullptr;
20059 descriptor_write.pBufferInfo = &buff_info;
20060 descriptor_write.pImageInfo = nullptr;
20061 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20062 descriptor_write.dstSet = descriptor_set;
20063
20064 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20065
20066 m_errorMonitor->VerifyNotFound();
20067 // Cleanup
20068 vkFreeMemory(m_device->device(), mem, NULL);
20069 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20070 vkDestroyBuffer(m_device->device(), buffer, NULL);
20071 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20072}
20073
20074// This is a positive test. No failures are expected.
20075TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
20076 VkResult err;
20077 bool pass;
20078
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020079 TEST_DESCRIPTION(
20080 "Create a buffer, allocate memory, bind memory, destroy "
20081 "the buffer, create an image, and bind the same memory to "
20082 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020083
20084 m_errorMonitor->ExpectSuccess();
20085
Tony Barbour1fa09702017-03-16 12:09:08 -060020086 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020087
20088 VkBuffer buffer;
20089 VkImage image;
20090 VkDeviceMemory mem;
20091 VkMemoryRequirements mem_reqs;
20092
20093 VkBufferCreateInfo buf_info = {};
20094 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20095 buf_info.pNext = NULL;
20096 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20097 buf_info.size = 256;
20098 buf_info.queueFamilyIndexCount = 0;
20099 buf_info.pQueueFamilyIndices = NULL;
20100 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20101 buf_info.flags = 0;
20102 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
20103 ASSERT_VK_SUCCESS(err);
20104
20105 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20106
20107 VkMemoryAllocateInfo alloc_info = {};
20108 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20109 alloc_info.pNext = NULL;
20110 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020111
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020112 // Ensure memory is big enough for both bindings
20113 alloc_info.allocationSize = 0x10000;
20114
20115 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20116 if (!pass) {
20117 vkDestroyBuffer(m_device->device(), buffer, NULL);
20118 return;
20119 }
20120
20121 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20122 ASSERT_VK_SUCCESS(err);
20123
20124 uint8_t *pData;
20125 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
20126 ASSERT_VK_SUCCESS(err);
20127
20128 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
20129
20130 vkUnmapMemory(m_device->device(), mem);
20131
20132 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20133 ASSERT_VK_SUCCESS(err);
20134
20135 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
20136 // memory. In fact, it was never used by the GPU.
20137 // Just be be sure, wait for idle.
20138 vkDestroyBuffer(m_device->device(), buffer, NULL);
20139 vkDeviceWaitIdle(m_device->device());
20140
Tobin Ehlis6a005702016-12-28 15:25:56 -070020141 // Use optimal as some platforms report linear support but then fail image creation
20142 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
20143 VkImageFormatProperties image_format_properties;
20144 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
20145 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
20146 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070020147 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070020148 vkFreeMemory(m_device->device(), mem, NULL);
20149 return;
20150 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020151 VkImageCreateInfo image_create_info = {};
20152 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20153 image_create_info.pNext = NULL;
20154 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20155 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
20156 image_create_info.extent.width = 64;
20157 image_create_info.extent.height = 64;
20158 image_create_info.extent.depth = 1;
20159 image_create_info.mipLevels = 1;
20160 image_create_info.arrayLayers = 1;
20161 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070020162 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020163 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
20164 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
20165 image_create_info.queueFamilyIndexCount = 0;
20166 image_create_info.pQueueFamilyIndices = NULL;
20167 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20168 image_create_info.flags = 0;
20169
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020170 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020171 * to be textures or it will be the staging image if they are not.
20172 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020173 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20174 ASSERT_VK_SUCCESS(err);
20175
20176 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
20177
Tobin Ehlis6a005702016-12-28 15:25:56 -070020178 VkMemoryAllocateInfo mem_alloc = {};
20179 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20180 mem_alloc.pNext = NULL;
20181 mem_alloc.allocationSize = 0;
20182 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020183 mem_alloc.allocationSize = mem_reqs.size;
20184
20185 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20186 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070020187 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020188 vkDestroyImage(m_device->device(), image, NULL);
20189 return;
20190 }
20191
20192 // VALIDATION FAILURE:
20193 err = vkBindImageMemory(m_device->device(), image, mem, 0);
20194 ASSERT_VK_SUCCESS(err);
20195
20196 m_errorMonitor->VerifyNotFound();
20197
20198 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020199 vkDestroyImage(m_device->device(), image, NULL);
20200}
20201
Tony Barbourab713912017-02-02 14:17:35 -070020202// This is a positive test. No failures are expected.
20203TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
20204 VkResult err;
20205
20206 TEST_DESCRIPTION(
20207 "Call all applicable destroy and free routines with NULL"
20208 "handles, expecting no validation errors");
20209
20210 m_errorMonitor->ExpectSuccess();
20211
Tony Barbour1fa09702017-03-16 12:09:08 -060020212 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070020213 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20214 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
20215 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
20216 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
20217 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20218 vkDestroyDevice(VK_NULL_HANDLE, NULL);
20219 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
20220 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
20221 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20222 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
20223 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
20224 vkDestroyInstance(VK_NULL_HANDLE, NULL);
20225 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
20226 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
20227 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20228 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
20229 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
20230 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
20231 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
20232 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
20233
20234 VkCommandPool command_pool;
20235 VkCommandPoolCreateInfo pool_create_info{};
20236 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20237 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20238 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20239 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20240 VkCommandBuffer command_buffers[3] = {};
20241 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20242 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20243 command_buffer_allocate_info.commandPool = command_pool;
20244 command_buffer_allocate_info.commandBufferCount = 1;
20245 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20246 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
20247 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
20248 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20249
20250 VkDescriptorPoolSize ds_type_count = {};
20251 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20252 ds_type_count.descriptorCount = 1;
20253
20254 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20255 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20256 ds_pool_ci.pNext = NULL;
20257 ds_pool_ci.maxSets = 1;
20258 ds_pool_ci.poolSizeCount = 1;
20259 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
20260 ds_pool_ci.pPoolSizes = &ds_type_count;
20261
20262 VkDescriptorPool ds_pool;
20263 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20264 ASSERT_VK_SUCCESS(err);
20265
20266 VkDescriptorSetLayoutBinding dsl_binding = {};
20267 dsl_binding.binding = 2;
20268 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20269 dsl_binding.descriptorCount = 1;
20270 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20271 dsl_binding.pImmutableSamplers = NULL;
20272 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20273 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20274 ds_layout_ci.pNext = NULL;
20275 ds_layout_ci.bindingCount = 1;
20276 ds_layout_ci.pBindings = &dsl_binding;
20277 VkDescriptorSetLayout ds_layout;
20278 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20279 ASSERT_VK_SUCCESS(err);
20280
20281 VkDescriptorSet descriptor_sets[3] = {};
20282 VkDescriptorSetAllocateInfo alloc_info = {};
20283 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20284 alloc_info.descriptorSetCount = 1;
20285 alloc_info.descriptorPool = ds_pool;
20286 alloc_info.pSetLayouts = &ds_layout;
20287 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
20288 ASSERT_VK_SUCCESS(err);
20289 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
20290 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20291 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20292
20293 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
20294
20295 m_errorMonitor->VerifyNotFound();
20296}
20297
Tony Barbour626994c2017-02-08 15:29:37 -070020298TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070020299 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070020300
20301 m_errorMonitor->ExpectSuccess();
20302
Tony Barbour1fa09702017-03-16 12:09:08 -060020303 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070020304 VkCommandBuffer cmd_bufs[4];
20305 VkCommandBufferAllocateInfo alloc_info;
20306 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20307 alloc_info.pNext = NULL;
20308 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070020309 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070020310 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20311 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
20312 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020313 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070020314 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
20315 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070020316 ASSERT_TRUE(image.initialized());
20317 VkCommandBufferBeginInfo cb_binfo;
20318 cb_binfo.pNext = NULL;
20319 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20320 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
20321 cb_binfo.flags = 0;
20322 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
20323 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
20324 VkImageMemoryBarrier img_barrier = {};
20325 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20326 img_barrier.pNext = NULL;
20327 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20328 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20329 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20330 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20331 img_barrier.image = image.handle();
20332 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20333 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20334 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20335 img_barrier.subresourceRange.baseArrayLayer = 0;
20336 img_barrier.subresourceRange.baseMipLevel = 0;
20337 img_barrier.subresourceRange.layerCount = 1;
20338 img_barrier.subresourceRange.levelCount = 1;
20339 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20340 &img_barrier);
20341 vkEndCommandBuffer(cmd_bufs[0]);
20342 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
20343 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20344 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20345 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20346 &img_barrier);
20347 vkEndCommandBuffer(cmd_bufs[1]);
20348 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
20349 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20350 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20351 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20352 &img_barrier);
20353 vkEndCommandBuffer(cmd_bufs[2]);
20354 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
20355 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20356 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20357 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20358 &img_barrier);
20359 vkEndCommandBuffer(cmd_bufs[3]);
20360
20361 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
20362 VkSemaphore semaphore1, semaphore2;
20363 VkSemaphoreCreateInfo semaphore_create_info{};
20364 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20365 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
20366 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
20367 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
20368 VkSubmitInfo submit_info[3];
20369 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20370 submit_info[0].pNext = nullptr;
20371 submit_info[0].commandBufferCount = 1;
20372 submit_info[0].pCommandBuffers = &cmd_bufs[0];
20373 submit_info[0].signalSemaphoreCount = 1;
20374 submit_info[0].pSignalSemaphores = &semaphore1;
20375 submit_info[0].waitSemaphoreCount = 0;
20376 submit_info[0].pWaitDstStageMask = nullptr;
20377 submit_info[0].pWaitDstStageMask = flags;
20378 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20379 submit_info[1].pNext = nullptr;
20380 submit_info[1].commandBufferCount = 1;
20381 submit_info[1].pCommandBuffers = &cmd_bufs[1];
20382 submit_info[1].waitSemaphoreCount = 1;
20383 submit_info[1].pWaitSemaphores = &semaphore1;
20384 submit_info[1].signalSemaphoreCount = 1;
20385 submit_info[1].pSignalSemaphores = &semaphore2;
20386 submit_info[1].pWaitDstStageMask = flags;
20387 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20388 submit_info[2].pNext = nullptr;
20389 submit_info[2].commandBufferCount = 2;
20390 submit_info[2].pCommandBuffers = &cmd_bufs[2];
20391 submit_info[2].waitSemaphoreCount = 1;
20392 submit_info[2].pWaitSemaphores = &semaphore2;
20393 submit_info[2].signalSemaphoreCount = 0;
20394 submit_info[2].pSignalSemaphores = nullptr;
20395 submit_info[2].pWaitDstStageMask = flags;
20396 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
20397 vkQueueWaitIdle(m_device->m_queue);
20398
20399 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
20400 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
20401 m_errorMonitor->VerifyNotFound();
20402}
20403
Tobin Ehlis953e8392016-11-17 10:54:13 -070020404TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
20405 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
20406 // We previously had a bug where dynamic offset of inactive bindings was still being used
20407 VkResult err;
20408 m_errorMonitor->ExpectSuccess();
20409
Tony Barbour1fa09702017-03-16 12:09:08 -060020410 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070020411 ASSERT_NO_FATAL_FAILURE(InitViewport());
20412 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20413
20414 VkDescriptorPoolSize ds_type_count = {};
20415 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20416 ds_type_count.descriptorCount = 3;
20417
20418 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20419 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20420 ds_pool_ci.pNext = NULL;
20421 ds_pool_ci.maxSets = 1;
20422 ds_pool_ci.poolSizeCount = 1;
20423 ds_pool_ci.pPoolSizes = &ds_type_count;
20424
20425 VkDescriptorPool ds_pool;
20426 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20427 ASSERT_VK_SUCCESS(err);
20428
20429 const uint32_t BINDING_COUNT = 3;
20430 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020431 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020432 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20433 dsl_binding[0].descriptorCount = 1;
20434 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20435 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020436 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020437 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20438 dsl_binding[1].descriptorCount = 1;
20439 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20440 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020441 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020442 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20443 dsl_binding[2].descriptorCount = 1;
20444 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20445 dsl_binding[2].pImmutableSamplers = NULL;
20446
20447 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20448 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20449 ds_layout_ci.pNext = NULL;
20450 ds_layout_ci.bindingCount = BINDING_COUNT;
20451 ds_layout_ci.pBindings = dsl_binding;
20452 VkDescriptorSetLayout ds_layout;
20453 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20454 ASSERT_VK_SUCCESS(err);
20455
20456 VkDescriptorSet descriptor_set;
20457 VkDescriptorSetAllocateInfo alloc_info = {};
20458 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20459 alloc_info.descriptorSetCount = 1;
20460 alloc_info.descriptorPool = ds_pool;
20461 alloc_info.pSetLayouts = &ds_layout;
20462 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20463 ASSERT_VK_SUCCESS(err);
20464
20465 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20466 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20467 pipeline_layout_ci.pNext = NULL;
20468 pipeline_layout_ci.setLayoutCount = 1;
20469 pipeline_layout_ci.pSetLayouts = &ds_layout;
20470
20471 VkPipelineLayout pipeline_layout;
20472 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20473 ASSERT_VK_SUCCESS(err);
20474
20475 // Create two buffers to update the descriptors with
20476 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
20477 uint32_t qfi = 0;
20478 VkBufferCreateInfo buffCI = {};
20479 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20480 buffCI.size = 2048;
20481 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20482 buffCI.queueFamilyIndexCount = 1;
20483 buffCI.pQueueFamilyIndices = &qfi;
20484
20485 VkBuffer dyub1;
20486 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
20487 ASSERT_VK_SUCCESS(err);
20488 // buffer2
20489 buffCI.size = 1024;
20490 VkBuffer dyub2;
20491 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
20492 ASSERT_VK_SUCCESS(err);
20493 // Allocate memory and bind to buffers
20494 VkMemoryAllocateInfo mem_alloc[2] = {};
20495 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20496 mem_alloc[0].pNext = NULL;
20497 mem_alloc[0].memoryTypeIndex = 0;
20498 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20499 mem_alloc[1].pNext = NULL;
20500 mem_alloc[1].memoryTypeIndex = 0;
20501
20502 VkMemoryRequirements mem_reqs1;
20503 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
20504 VkMemoryRequirements mem_reqs2;
20505 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
20506 mem_alloc[0].allocationSize = mem_reqs1.size;
20507 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
20508 mem_alloc[1].allocationSize = mem_reqs2.size;
20509 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
20510 if (!pass) {
20511 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20512 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20513 return;
20514 }
20515
20516 VkDeviceMemory mem1;
20517 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
20518 ASSERT_VK_SUCCESS(err);
20519 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
20520 ASSERT_VK_SUCCESS(err);
20521 VkDeviceMemory mem2;
20522 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
20523 ASSERT_VK_SUCCESS(err);
20524 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
20525 ASSERT_VK_SUCCESS(err);
20526 // Update descriptors
20527 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
20528 buff_info[0].buffer = dyub1;
20529 buff_info[0].offset = 0;
20530 buff_info[0].range = 256;
20531 buff_info[1].buffer = dyub1;
20532 buff_info[1].offset = 256;
20533 buff_info[1].range = 512;
20534 buff_info[2].buffer = dyub2;
20535 buff_info[2].offset = 0;
20536 buff_info[2].range = 512;
20537
20538 VkWriteDescriptorSet descriptor_write;
20539 memset(&descriptor_write, 0, sizeof(descriptor_write));
20540 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20541 descriptor_write.dstSet = descriptor_set;
20542 descriptor_write.dstBinding = 0;
20543 descriptor_write.descriptorCount = BINDING_COUNT;
20544 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20545 descriptor_write.pBufferInfo = buff_info;
20546
20547 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20548
Tony Barbour552f6c02016-12-21 14:34:07 -070020549 m_commandBuffer->BeginCommandBuffer();
20550 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070020551
20552 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020553 char const *vsSource =
20554 "#version 450\n"
20555 "\n"
20556 "out gl_PerVertex { \n"
20557 " vec4 gl_Position;\n"
20558 "};\n"
20559 "void main(){\n"
20560 " gl_Position = vec4(1);\n"
20561 "}\n";
20562 char const *fsSource =
20563 "#version 450\n"
20564 "\n"
20565 "layout(location=0) out vec4 x;\n"
20566 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
20567 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
20568 "void main(){\n"
20569 " x = vec4(bar1.y) + vec4(bar2.y);\n"
20570 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070020571 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20572 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20573 VkPipelineObj pipe(m_device);
20574 pipe.SetViewport(m_viewports);
20575 pipe.SetScissor(m_scissors);
20576 pipe.AddShader(&vs);
20577 pipe.AddShader(&fs);
20578 pipe.AddColorAttachment();
20579 pipe.CreateVKPipeline(pipeline_layout, renderPass());
20580
20581 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
20582 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
20583 // we used to have a bug in this case.
20584 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
20585 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
20586 &descriptor_set, BINDING_COUNT, dyn_off);
20587 Draw(1, 0, 0, 0);
20588 m_errorMonitor->VerifyNotFound();
20589
20590 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20591 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20592 vkFreeMemory(m_device->device(), mem1, NULL);
20593 vkFreeMemory(m_device->device(), mem2, NULL);
20594
20595 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20596 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20597 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20598}
20599
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020600TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020601 TEST_DESCRIPTION(
20602 "Ensure that validations handling of non-coherent memory "
20603 "mapping while using VK_WHOLE_SIZE does not cause access "
20604 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020605 VkResult err;
20606 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060020607 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020608
20609 VkDeviceMemory mem;
20610 VkMemoryRequirements mem_reqs;
20611 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020612 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020613 VkMemoryAllocateInfo alloc_info = {};
20614 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20615 alloc_info.pNext = NULL;
20616 alloc_info.memoryTypeIndex = 0;
20617
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020618 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020619 alloc_info.allocationSize = allocation_size;
20620
20621 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
20622 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 -070020623 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020624 if (!pass) {
20625 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020626 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
20627 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020628 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020629 pass = m_device->phy().set_memory_type(
20630 mem_reqs.memoryTypeBits, &alloc_info,
20631 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
20632 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020633 if (!pass) {
20634 return;
20635 }
20636 }
20637 }
20638
20639 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20640 ASSERT_VK_SUCCESS(err);
20641
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020642 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020643 m_errorMonitor->ExpectSuccess();
20644 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20645 ASSERT_VK_SUCCESS(err);
20646 VkMappedMemoryRange mmr = {};
20647 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20648 mmr.memory = mem;
20649 mmr.offset = 0;
20650 mmr.size = VK_WHOLE_SIZE;
20651 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20652 ASSERT_VK_SUCCESS(err);
20653 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20654 ASSERT_VK_SUCCESS(err);
20655 m_errorMonitor->VerifyNotFound();
20656 vkUnmapMemory(m_device->device(), mem);
20657
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020658 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020659 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020660 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020661 ASSERT_VK_SUCCESS(err);
20662 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20663 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020664 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020665 mmr.size = VK_WHOLE_SIZE;
20666 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20667 ASSERT_VK_SUCCESS(err);
20668 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20669 ASSERT_VK_SUCCESS(err);
20670 m_errorMonitor->VerifyNotFound();
20671 vkUnmapMemory(m_device->device(), mem);
20672
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020673 // Map with offset and size
20674 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020675 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020676 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020677 ASSERT_VK_SUCCESS(err);
20678 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20679 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020680 mmr.offset = 4 * atom_size;
20681 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020682 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20683 ASSERT_VK_SUCCESS(err);
20684 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20685 ASSERT_VK_SUCCESS(err);
20686 m_errorMonitor->VerifyNotFound();
20687 vkUnmapMemory(m_device->device(), mem);
20688
20689 // Map without offset and flush WHOLE_SIZE with two separate offsets
20690 m_errorMonitor->ExpectSuccess();
20691 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20692 ASSERT_VK_SUCCESS(err);
20693 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20694 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020695 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020696 mmr.size = VK_WHOLE_SIZE;
20697 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20698 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020699 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020700 mmr.size = VK_WHOLE_SIZE;
20701 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20702 ASSERT_VK_SUCCESS(err);
20703 m_errorMonitor->VerifyNotFound();
20704 vkUnmapMemory(m_device->device(), mem);
20705
20706 vkFreeMemory(m_device->device(), mem, NULL);
20707}
20708
20709// This is a positive test. We used to expect error in this case but spec now allows it
20710TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
20711 m_errorMonitor->ExpectSuccess();
20712 vk_testing::Fence testFence;
20713 VkFenceCreateInfo fenceInfo = {};
20714 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20715 fenceInfo.pNext = NULL;
20716
Tony Barbour1fa09702017-03-16 12:09:08 -060020717 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020718 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020719 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020720 VkResult result = vkResetFences(m_device->device(), 1, fences);
20721 ASSERT_VK_SUCCESS(result);
20722
20723 m_errorMonitor->VerifyNotFound();
20724}
20725
20726TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
20727 m_errorMonitor->ExpectSuccess();
20728
Tony Barbour1fa09702017-03-16 12:09:08 -060020729 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020730 VkResult err;
20731
20732 // Record (empty!) command buffer that can be submitted multiple times
20733 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020734 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
20735 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020736 m_commandBuffer->BeginCommandBuffer(&cbbi);
20737 m_commandBuffer->EndCommandBuffer();
20738
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020739 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020740 VkFence fence;
20741 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20742 ASSERT_VK_SUCCESS(err);
20743
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020744 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020745 VkSemaphore s1, s2;
20746 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
20747 ASSERT_VK_SUCCESS(err);
20748 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
20749 ASSERT_VK_SUCCESS(err);
20750
20751 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020752 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020753 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20754 ASSERT_VK_SUCCESS(err);
20755
20756 // Submit CB again, signaling s2.
20757 si.pSignalSemaphores = &s2;
20758 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
20759 ASSERT_VK_SUCCESS(err);
20760
20761 // Wait for fence.
20762 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20763 ASSERT_VK_SUCCESS(err);
20764
20765 // CB is still in flight from second submission, but semaphore s1 is no
20766 // longer in flight. delete it.
20767 vkDestroySemaphore(m_device->device(), s1, nullptr);
20768
20769 m_errorMonitor->VerifyNotFound();
20770
20771 // Force device idle and clean up remaining objects
20772 vkDeviceWaitIdle(m_device->device());
20773 vkDestroySemaphore(m_device->device(), s2, nullptr);
20774 vkDestroyFence(m_device->device(), fence, nullptr);
20775}
20776
20777TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20778 m_errorMonitor->ExpectSuccess();
20779
Tony Barbour1fa09702017-03-16 12:09:08 -060020780 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020781 VkResult err;
20782
20783 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020784 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020785 VkFence f1;
20786 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20787 ASSERT_VK_SUCCESS(err);
20788
20789 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020790 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020791 VkFence f2;
20792 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20793 ASSERT_VK_SUCCESS(err);
20794
20795 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020796 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020797 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20798
20799 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020800 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020801 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20802
20803 // Should have both retired!
20804 vkDestroyFence(m_device->device(), f1, nullptr);
20805 vkDestroyFence(m_device->device(), f2, nullptr);
20806
20807 m_errorMonitor->VerifyNotFound();
20808}
20809
20810TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020811 TEST_DESCRIPTION(
20812 "Verify that creating an image view from an image with valid usage "
20813 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020814
Tony Barbour1fa09702017-03-16 12:09:08 -060020815 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020816
20817 m_errorMonitor->ExpectSuccess();
20818 // Verify that we can create a view with usage INPUT_ATTACHMENT
20819 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020820 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 -060020821 ASSERT_TRUE(image.initialized());
20822 VkImageView imageView;
20823 VkImageViewCreateInfo ivci = {};
20824 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20825 ivci.image = image.handle();
20826 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20827 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20828 ivci.subresourceRange.layerCount = 1;
20829 ivci.subresourceRange.baseMipLevel = 0;
20830 ivci.subresourceRange.levelCount = 1;
20831 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20832
20833 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20834 m_errorMonitor->VerifyNotFound();
20835 vkDestroyImageView(m_device->device(), imageView, NULL);
20836}
20837
20838// This is a positive test. No failures are expected.
20839TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020840 TEST_DESCRIPTION(
20841 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20842 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020843
Tony Barbour1fa09702017-03-16 12:09:08 -060020844 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020845
20846 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020847 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020848 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020849
20850 m_errorMonitor->ExpectSuccess();
20851
20852 VkImage image;
20853 VkImageCreateInfo image_create_info = {};
20854 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20855 image_create_info.pNext = NULL;
20856 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20857 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20858 image_create_info.extent.width = 64;
20859 image_create_info.extent.height = 64;
20860 image_create_info.extent.depth = 1;
20861 image_create_info.mipLevels = 1;
20862 image_create_info.arrayLayers = 1;
20863 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20864 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20865 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20866 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20867 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20868 ASSERT_VK_SUCCESS(err);
20869
20870 VkMemoryRequirements memory_reqs;
20871 VkDeviceMemory memory_one, memory_two;
20872 bool pass;
20873 VkMemoryAllocateInfo memory_info = {};
20874 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20875 memory_info.pNext = NULL;
20876 memory_info.allocationSize = 0;
20877 memory_info.memoryTypeIndex = 0;
20878 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20879 // Find an image big enough to allow sparse mapping of 2 memory regions
20880 // Increase the image size until it is at least twice the
20881 // size of the required alignment, to ensure we can bind both
20882 // allocated memory blocks to the image on aligned offsets.
20883 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20884 vkDestroyImage(m_device->device(), image, nullptr);
20885 image_create_info.extent.width *= 2;
20886 image_create_info.extent.height *= 2;
20887 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20888 ASSERT_VK_SUCCESS(err);
20889 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20890 }
20891 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20892 // at the end of the first
20893 memory_info.allocationSize = memory_reqs.alignment;
20894 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20895 ASSERT_TRUE(pass);
20896 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20897 ASSERT_VK_SUCCESS(err);
20898 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20899 ASSERT_VK_SUCCESS(err);
20900 VkSparseMemoryBind binds[2];
20901 binds[0].flags = 0;
20902 binds[0].memory = memory_one;
20903 binds[0].memoryOffset = 0;
20904 binds[0].resourceOffset = 0;
20905 binds[0].size = memory_info.allocationSize;
20906 binds[1].flags = 0;
20907 binds[1].memory = memory_two;
20908 binds[1].memoryOffset = 0;
20909 binds[1].resourceOffset = memory_info.allocationSize;
20910 binds[1].size = memory_info.allocationSize;
20911
20912 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20913 opaqueBindInfo.image = image;
20914 opaqueBindInfo.bindCount = 2;
20915 opaqueBindInfo.pBinds = binds;
20916
20917 VkFence fence = VK_NULL_HANDLE;
20918 VkBindSparseInfo bindSparseInfo = {};
20919 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20920 bindSparseInfo.imageOpaqueBindCount = 1;
20921 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20922
20923 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20924 vkQueueWaitIdle(m_device->m_queue);
20925 vkDestroyImage(m_device->device(), image, NULL);
20926 vkFreeMemory(m_device->device(), memory_one, NULL);
20927 vkFreeMemory(m_device->device(), memory_two, NULL);
20928 m_errorMonitor->VerifyNotFound();
20929}
20930
20931TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020932 TEST_DESCRIPTION(
20933 "Ensure that CmdBeginRenderPass with an attachment's "
20934 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20935 "the command buffer has prior knowledge of that "
20936 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020937
20938 m_errorMonitor->ExpectSuccess();
20939
Tony Barbour1fa09702017-03-16 12:09:08 -060020940 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020941
20942 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020943 VkAttachmentDescription attachment = {0,
20944 VK_FORMAT_R8G8B8A8_UNORM,
20945 VK_SAMPLE_COUNT_1_BIT,
20946 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20947 VK_ATTACHMENT_STORE_OP_STORE,
20948 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20949 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20950 VK_IMAGE_LAYOUT_UNDEFINED,
20951 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020952
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020953 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020954
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020955 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020956
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020957 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020958
20959 VkRenderPass rp;
20960 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20961 ASSERT_VK_SUCCESS(err);
20962
20963 // A compatible framebuffer.
20964 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020965 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 -060020966 ASSERT_TRUE(image.initialized());
20967
20968 VkImageViewCreateInfo ivci = {
20969 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20970 nullptr,
20971 0,
20972 image.handle(),
20973 VK_IMAGE_VIEW_TYPE_2D,
20974 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020975 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20976 VK_COMPONENT_SWIZZLE_IDENTITY},
20977 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020978 };
20979 VkImageView view;
20980 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20981 ASSERT_VK_SUCCESS(err);
20982
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020983 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020984 VkFramebuffer fb;
20985 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20986 ASSERT_VK_SUCCESS(err);
20987
20988 // Record a single command buffer which uses this renderpass twice. The
20989 // bug is triggered at the beginning of the second renderpass, when the
20990 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020991 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 -070020992 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020993 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20994 vkCmdEndRenderPass(m_commandBuffer->handle());
20995 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20996
20997 m_errorMonitor->VerifyNotFound();
20998
20999 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070021000 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021001
21002 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21003 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21004 vkDestroyImageView(m_device->device(), view, nullptr);
21005}
21006
21007TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021008 TEST_DESCRIPTION(
21009 "This test should pass. Create a Framebuffer and "
21010 "command buffer, bind them together, then destroy "
21011 "command pool and framebuffer and verify there are no "
21012 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021013
21014 m_errorMonitor->ExpectSuccess();
21015
Tony Barbour1fa09702017-03-16 12:09:08 -060021016 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021017
21018 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021019 VkAttachmentDescription attachment = {0,
21020 VK_FORMAT_R8G8B8A8_UNORM,
21021 VK_SAMPLE_COUNT_1_BIT,
21022 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21023 VK_ATTACHMENT_STORE_OP_STORE,
21024 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21025 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21026 VK_IMAGE_LAYOUT_UNDEFINED,
21027 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021028
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021029 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021030
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021031 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021032
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021033 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021034
21035 VkRenderPass rp;
21036 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21037 ASSERT_VK_SUCCESS(err);
21038
21039 // A compatible framebuffer.
21040 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021041 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 -060021042 ASSERT_TRUE(image.initialized());
21043
21044 VkImageViewCreateInfo ivci = {
21045 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21046 nullptr,
21047 0,
21048 image.handle(),
21049 VK_IMAGE_VIEW_TYPE_2D,
21050 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021051 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21052 VK_COMPONENT_SWIZZLE_IDENTITY},
21053 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021054 };
21055 VkImageView view;
21056 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21057 ASSERT_VK_SUCCESS(err);
21058
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021059 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021060 VkFramebuffer fb;
21061 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21062 ASSERT_VK_SUCCESS(err);
21063
21064 // Explicitly create a command buffer to bind the FB to so that we can then
21065 // destroy the command pool in order to implicitly free command buffer
21066 VkCommandPool command_pool;
21067 VkCommandPoolCreateInfo pool_create_info{};
21068 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21069 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21070 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21071 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21072
21073 VkCommandBuffer command_buffer;
21074 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21075 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21076 command_buffer_allocate_info.commandPool = command_pool;
21077 command_buffer_allocate_info.commandBufferCount = 1;
21078 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21079 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21080
21081 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021082 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 -060021083 VkCommandBufferBeginInfo begin_info{};
21084 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21085 vkBeginCommandBuffer(command_buffer, &begin_info);
21086
21087 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21088 vkCmdEndRenderPass(command_buffer);
21089 vkEndCommandBuffer(command_buffer);
21090 vkDestroyImageView(m_device->device(), view, nullptr);
21091 // Destroy command pool to implicitly free command buffer
21092 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21093 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21094 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21095 m_errorMonitor->VerifyNotFound();
21096}
21097
21098TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021099 TEST_DESCRIPTION(
21100 "Ensure that CmdBeginRenderPass applies the layout "
21101 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021102
21103 m_errorMonitor->ExpectSuccess();
21104
Tony Barbour1fa09702017-03-16 12:09:08 -060021105 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021106
21107 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021108 VkAttachmentDescription attachment = {0,
21109 VK_FORMAT_R8G8B8A8_UNORM,
21110 VK_SAMPLE_COUNT_1_BIT,
21111 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21112 VK_ATTACHMENT_STORE_OP_STORE,
21113 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21114 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21115 VK_IMAGE_LAYOUT_UNDEFINED,
21116 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021117
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021118 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021119
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021120 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021121
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021122 VkSubpassDependency dep = {0,
21123 0,
21124 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21125 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21126 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21127 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21128 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021129
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021130 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021131
21132 VkResult err;
21133 VkRenderPass rp;
21134 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21135 ASSERT_VK_SUCCESS(err);
21136
21137 // A compatible framebuffer.
21138 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021139 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 -060021140 ASSERT_TRUE(image.initialized());
21141
21142 VkImageViewCreateInfo ivci = {
21143 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21144 nullptr,
21145 0,
21146 image.handle(),
21147 VK_IMAGE_VIEW_TYPE_2D,
21148 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021149 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21150 VK_COMPONENT_SWIZZLE_IDENTITY},
21151 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021152 };
21153 VkImageView view;
21154 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21155 ASSERT_VK_SUCCESS(err);
21156
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021157 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021158 VkFramebuffer fb;
21159 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21160 ASSERT_VK_SUCCESS(err);
21161
21162 // Record a single command buffer which issues a pipeline barrier w/
21163 // image memory barrier for the attachment. This detects the previously
21164 // missing tracking of the subpass layout by throwing a validation error
21165 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021166 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 -070021167 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021168 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21169
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021170 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
21171 nullptr,
21172 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21173 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21174 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21175 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21176 VK_QUEUE_FAMILY_IGNORED,
21177 VK_QUEUE_FAMILY_IGNORED,
21178 image.handle(),
21179 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021180 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021181 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21182 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021183
21184 vkCmdEndRenderPass(m_commandBuffer->handle());
21185 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021186 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021187
21188 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21189 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21190 vkDestroyImageView(m_device->device(), view, nullptr);
21191}
21192
21193TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021194 TEST_DESCRIPTION(
21195 "Validate that when an imageView of a depth/stencil image "
21196 "is used as a depth/stencil framebuffer attachment, the "
21197 "aspectMask is ignored and both depth and stencil image "
21198 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021199
Tony Barbour1fa09702017-03-16 12:09:08 -060021200 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021201 VkFormatProperties format_properties;
21202 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
21203 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
21204 return;
21205 }
21206
21207 m_errorMonitor->ExpectSuccess();
21208
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021209 VkAttachmentDescription attachment = {0,
21210 VK_FORMAT_D32_SFLOAT_S8_UINT,
21211 VK_SAMPLE_COUNT_1_BIT,
21212 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21213 VK_ATTACHMENT_STORE_OP_STORE,
21214 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21215 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21216 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
21217 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021218
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021219 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021220
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021221 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021222
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021223 VkSubpassDependency dep = {0,
21224 0,
21225 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21226 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21227 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21228 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21229 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021230
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021231 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021232
21233 VkResult err;
21234 VkRenderPass rp;
21235 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21236 ASSERT_VK_SUCCESS(err);
21237
21238 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021239 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
21240 0x26, // usage
21241 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021242 ASSERT_TRUE(image.initialized());
21243 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
21244
21245 VkImageViewCreateInfo ivci = {
21246 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21247 nullptr,
21248 0,
21249 image.handle(),
21250 VK_IMAGE_VIEW_TYPE_2D,
21251 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021252 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
21253 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021254 };
21255 VkImageView view;
21256 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21257 ASSERT_VK_SUCCESS(err);
21258
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021259 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021260 VkFramebuffer fb;
21261 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21262 ASSERT_VK_SUCCESS(err);
21263
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021264 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 -070021265 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021266 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21267
21268 VkImageMemoryBarrier imb = {};
21269 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21270 imb.pNext = nullptr;
21271 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21272 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21273 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21274 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
21275 imb.srcQueueFamilyIndex = 0;
21276 imb.dstQueueFamilyIndex = 0;
21277 imb.image = image.handle();
21278 imb.subresourceRange.aspectMask = 0x6;
21279 imb.subresourceRange.baseMipLevel = 0;
21280 imb.subresourceRange.levelCount = 0x1;
21281 imb.subresourceRange.baseArrayLayer = 0;
21282 imb.subresourceRange.layerCount = 0x1;
21283
21284 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021285 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21286 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021287
21288 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070021289 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021290 QueueCommandBuffer(false);
21291 m_errorMonitor->VerifyNotFound();
21292
21293 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21294 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21295 vkDestroyImageView(m_device->device(), view, nullptr);
21296}
21297
21298TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021299 TEST_DESCRIPTION(
21300 "Ensure that layout transitions work correctly without "
21301 "errors, when an attachment reference is "
21302 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021303
21304 m_errorMonitor->ExpectSuccess();
21305
Tony Barbour1fa09702017-03-16 12:09:08 -060021306 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021307
21308 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021309 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021310
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021311 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021312
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021313 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021314
21315 VkRenderPass rp;
21316 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21317 ASSERT_VK_SUCCESS(err);
21318
21319 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021320 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021321 VkFramebuffer fb;
21322 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21323 ASSERT_VK_SUCCESS(err);
21324
21325 // Record a command buffer which just begins and ends the renderpass. The
21326 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021327 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 -070021328 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021329 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21330 vkCmdEndRenderPass(m_commandBuffer->handle());
21331 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021332 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021333
21334 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21335 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21336}
21337
21338// This is a positive test. No errors are expected.
21339TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021340 TEST_DESCRIPTION(
21341 "Create a stencil-only attachment with a LOAD_OP set to "
21342 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021343 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060021344 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021345 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021346 if (!depth_format) {
21347 printf(" No Depth + Stencil format found. Skipped.\n");
21348 return;
21349 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021350 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070021351 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021352 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
21353 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021354 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
21355 return;
21356 }
21357
Tony Barbourf887b162017-03-09 10:06:46 -070021358 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021359 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021360 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021361 VkAttachmentDescription att = {};
21362 VkAttachmentReference ref = {};
21363 att.format = depth_stencil_fmt;
21364 att.samples = VK_SAMPLE_COUNT_1_BIT;
21365 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
21366 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21367 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21368 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
21369 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21370 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21371
21372 VkClearValue clear;
21373 clear.depthStencil.depth = 1.0;
21374 clear.depthStencil.stencil = 0;
21375 ref.attachment = 0;
21376 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21377
21378 VkSubpassDescription subpass = {};
21379 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
21380 subpass.flags = 0;
21381 subpass.inputAttachmentCount = 0;
21382 subpass.pInputAttachments = NULL;
21383 subpass.colorAttachmentCount = 0;
21384 subpass.pColorAttachments = NULL;
21385 subpass.pResolveAttachments = NULL;
21386 subpass.pDepthStencilAttachment = &ref;
21387 subpass.preserveAttachmentCount = 0;
21388 subpass.pPreserveAttachments = NULL;
21389
21390 VkRenderPass rp;
21391 VkRenderPassCreateInfo rp_info = {};
21392 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21393 rp_info.attachmentCount = 1;
21394 rp_info.pAttachments = &att;
21395 rp_info.subpassCount = 1;
21396 rp_info.pSubpasses = &subpass;
21397 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
21398 ASSERT_VK_SUCCESS(result);
21399
21400 VkImageView *depthView = m_depthStencil->BindInfo();
21401 VkFramebufferCreateInfo fb_info = {};
21402 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
21403 fb_info.pNext = NULL;
21404 fb_info.renderPass = rp;
21405 fb_info.attachmentCount = 1;
21406 fb_info.pAttachments = depthView;
21407 fb_info.width = 100;
21408 fb_info.height = 100;
21409 fb_info.layers = 1;
21410 VkFramebuffer fb;
21411 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
21412 ASSERT_VK_SUCCESS(result);
21413
21414 VkRenderPassBeginInfo rpbinfo = {};
21415 rpbinfo.clearValueCount = 1;
21416 rpbinfo.pClearValues = &clear;
21417 rpbinfo.pNext = NULL;
21418 rpbinfo.renderPass = rp;
21419 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
21420 rpbinfo.renderArea.extent.width = 100;
21421 rpbinfo.renderArea.extent.height = 100;
21422 rpbinfo.renderArea.offset.x = 0;
21423 rpbinfo.renderArea.offset.y = 0;
21424 rpbinfo.framebuffer = fb;
21425
21426 VkFence fence = {};
21427 VkFenceCreateInfo fence_ci = {};
21428 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21429 fence_ci.pNext = nullptr;
21430 fence_ci.flags = 0;
21431 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
21432 ASSERT_VK_SUCCESS(result);
21433
21434 m_commandBuffer->BeginCommandBuffer();
21435 m_commandBuffer->BeginRenderPass(rpbinfo);
21436 m_commandBuffer->EndRenderPass();
21437 m_commandBuffer->EndCommandBuffer();
21438 m_commandBuffer->QueueCommandBuffer(fence);
21439
21440 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021441 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 -070021442 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021443 VkImageMemoryBarrier barrier = {};
21444 VkImageSubresourceRange range;
21445 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21446 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21447 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
21448 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21449 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
21450 barrier.image = m_depthStencil->handle();
21451 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21452 range.baseMipLevel = 0;
21453 range.levelCount = 1;
21454 range.baseArrayLayer = 0;
21455 range.layerCount = 1;
21456 barrier.subresourceRange = range;
21457 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21458 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
21459 cmdbuf.BeginCommandBuffer();
21460 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 -070021461 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021462 barrier.srcAccessMask = 0;
21463 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
21464 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
21465 barrier.image = destImage.handle();
21466 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21467 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 -070021468 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021469 VkImageCopy cregion;
21470 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21471 cregion.srcSubresource.mipLevel = 0;
21472 cregion.srcSubresource.baseArrayLayer = 0;
21473 cregion.srcSubresource.layerCount = 1;
21474 cregion.srcOffset.x = 0;
21475 cregion.srcOffset.y = 0;
21476 cregion.srcOffset.z = 0;
21477 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21478 cregion.dstSubresource.mipLevel = 0;
21479 cregion.dstSubresource.baseArrayLayer = 0;
21480 cregion.dstSubresource.layerCount = 1;
21481 cregion.dstOffset.x = 0;
21482 cregion.dstOffset.y = 0;
21483 cregion.dstOffset.z = 0;
21484 cregion.extent.width = 100;
21485 cregion.extent.height = 100;
21486 cregion.extent.depth = 1;
21487 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021488 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021489 cmdbuf.EndCommandBuffer();
21490
21491 VkSubmitInfo submit_info;
21492 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21493 submit_info.pNext = NULL;
21494 submit_info.waitSemaphoreCount = 0;
21495 submit_info.pWaitSemaphores = NULL;
21496 submit_info.pWaitDstStageMask = NULL;
21497 submit_info.commandBufferCount = 1;
21498 submit_info.pCommandBuffers = &cmdbuf.handle();
21499 submit_info.signalSemaphoreCount = 0;
21500 submit_info.pSignalSemaphores = NULL;
21501
21502 m_errorMonitor->ExpectSuccess();
21503 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21504 m_errorMonitor->VerifyNotFound();
21505
21506 vkQueueWaitIdle(m_device->m_queue);
21507 vkDestroyFence(m_device->device(), fence, nullptr);
21508 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21509 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21510}
21511
21512// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070021513TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
21514 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
21515
21516 m_errorMonitor->ExpectSuccess();
21517
Tony Barbour1fa09702017-03-16 12:09:08 -060021518 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021519 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060021520 if (!depth_format) {
21521 printf(" No Depth + Stencil format found. Skipped.\n");
21522 return;
21523 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070021524 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21525
21526 VkImageMemoryBarrier img_barrier = {};
21527 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21528 img_barrier.pNext = NULL;
21529 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
21530 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21531 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21532 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21533 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21534 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21535 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
21536 img_barrier.subresourceRange.baseArrayLayer = 0;
21537 img_barrier.subresourceRange.baseMipLevel = 0;
21538 img_barrier.subresourceRange.layerCount = 1;
21539 img_barrier.subresourceRange.levelCount = 1;
21540
21541 {
21542 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021543 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 -070021544 ASSERT_TRUE(img_color.initialized());
21545
21546 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021547 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 -070021548 ASSERT_TRUE(img_ds1.initialized());
21549
21550 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021551 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 -070021552 ASSERT_TRUE(img_ds2.initialized());
21553
21554 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021555 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 -070021556 ASSERT_TRUE(img_xfer_src.initialized());
21557
21558 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021559 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 -070021560 ASSERT_TRUE(img_xfer_dst.initialized());
21561
21562 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021563 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 -070021564 ASSERT_TRUE(img_sampled.initialized());
21565
21566 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021567 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 -070021568 ASSERT_TRUE(img_input.initialized());
21569
21570 const struct {
21571 VkImageObj &image_obj;
21572 VkImageLayout old_layout;
21573 VkImageLayout new_layout;
21574 } buffer_layouts[] = {
21575 // clang-format off
21576 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21577 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21578 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21579 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21580 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21581 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21582 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21583 // clang-format on
21584 };
21585 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
21586
21587 m_commandBuffer->BeginCommandBuffer();
21588 for (uint32_t i = 0; i < layout_count; ++i) {
21589 img_barrier.image = buffer_layouts[i].image_obj.handle();
21590 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
21591 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
21592 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
21593 : VK_IMAGE_ASPECT_COLOR_BIT;
21594
21595 img_barrier.oldLayout = buffer_layouts[i].old_layout;
21596 img_barrier.newLayout = buffer_layouts[i].new_layout;
21597 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21598 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21599
21600 img_barrier.oldLayout = buffer_layouts[i].new_layout;
21601 img_barrier.newLayout = buffer_layouts[i].old_layout;
21602 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21603 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21604 }
21605 m_commandBuffer->EndCommandBuffer();
21606
21607 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
21608 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
21609 }
21610 m_errorMonitor->VerifyNotFound();
21611}
21612
21613// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021614TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
21615 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
21616
21617 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021618 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021619
21620 VkEvent event;
21621 VkEventCreateInfo event_create_info{};
21622 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21623 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21624
21625 VkCommandPool command_pool;
21626 VkCommandPoolCreateInfo pool_create_info{};
21627 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21628 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21629 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21630 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21631
21632 VkCommandBuffer command_buffer;
21633 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21634 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21635 command_buffer_allocate_info.commandPool = command_pool;
21636 command_buffer_allocate_info.commandBufferCount = 1;
21637 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21638 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21639
21640 VkQueue queue = VK_NULL_HANDLE;
21641 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21642
21643 {
21644 VkCommandBufferBeginInfo begin_info{};
21645 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21646 vkBeginCommandBuffer(command_buffer, &begin_info);
21647
21648 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 -070021649 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021650 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
21651 vkEndCommandBuffer(command_buffer);
21652 }
21653 {
21654 VkSubmitInfo submit_info{};
21655 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21656 submit_info.commandBufferCount = 1;
21657 submit_info.pCommandBuffers = &command_buffer;
21658 submit_info.signalSemaphoreCount = 0;
21659 submit_info.pSignalSemaphores = nullptr;
21660 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21661 }
21662 { vkSetEvent(m_device->device(), event); }
21663
21664 vkQueueWaitIdle(queue);
21665
21666 vkDestroyEvent(m_device->device(), event, nullptr);
21667 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21668 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21669
21670 m_errorMonitor->VerifyNotFound();
21671}
21672// This is a positive test. No errors should be generated.
21673TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
21674 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
21675
Tony Barbour1fa09702017-03-16 12:09:08 -060021676 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021677 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021678
21679 m_errorMonitor->ExpectSuccess();
21680
21681 VkQueryPool query_pool;
21682 VkQueryPoolCreateInfo query_pool_create_info{};
21683 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21684 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21685 query_pool_create_info.queryCount = 1;
21686 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21687
21688 VkCommandPool command_pool;
21689 VkCommandPoolCreateInfo pool_create_info{};
21690 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21691 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21692 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21693 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21694
21695 VkCommandBuffer command_buffer;
21696 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21697 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21698 command_buffer_allocate_info.commandPool = command_pool;
21699 command_buffer_allocate_info.commandBufferCount = 1;
21700 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21701 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21702
21703 VkCommandBuffer secondary_command_buffer;
21704 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
21705 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
21706
21707 VkQueue queue = VK_NULL_HANDLE;
21708 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21709
21710 uint32_t qfi = 0;
21711 VkBufferCreateInfo buff_create_info = {};
21712 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21713 buff_create_info.size = 1024;
21714 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21715 buff_create_info.queueFamilyIndexCount = 1;
21716 buff_create_info.pQueueFamilyIndices = &qfi;
21717
21718 VkResult err;
21719 VkBuffer buffer;
21720 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21721 ASSERT_VK_SUCCESS(err);
21722 VkMemoryAllocateInfo mem_alloc = {};
21723 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21724 mem_alloc.pNext = NULL;
21725 mem_alloc.allocationSize = 1024;
21726 mem_alloc.memoryTypeIndex = 0;
21727
21728 VkMemoryRequirements memReqs;
21729 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21730 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21731 if (!pass) {
21732 vkDestroyBuffer(m_device->device(), buffer, NULL);
21733 return;
21734 }
21735
21736 VkDeviceMemory mem;
21737 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21738 ASSERT_VK_SUCCESS(err);
21739 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21740 ASSERT_VK_SUCCESS(err);
21741
21742 VkCommandBufferInheritanceInfo hinfo = {};
21743 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
21744 hinfo.renderPass = VK_NULL_HANDLE;
21745 hinfo.subpass = 0;
21746 hinfo.framebuffer = VK_NULL_HANDLE;
21747 hinfo.occlusionQueryEnable = VK_FALSE;
21748 hinfo.queryFlags = 0;
21749 hinfo.pipelineStatistics = 0;
21750
21751 {
21752 VkCommandBufferBeginInfo begin_info{};
21753 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21754 begin_info.pInheritanceInfo = &hinfo;
21755 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
21756
21757 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
21758 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21759
21760 vkEndCommandBuffer(secondary_command_buffer);
21761
21762 begin_info.pInheritanceInfo = nullptr;
21763 vkBeginCommandBuffer(command_buffer, &begin_info);
21764
21765 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
21766 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
21767
21768 vkEndCommandBuffer(command_buffer);
21769 }
21770 {
21771 VkSubmitInfo submit_info{};
21772 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21773 submit_info.commandBufferCount = 1;
21774 submit_info.pCommandBuffers = &command_buffer;
21775 submit_info.signalSemaphoreCount = 0;
21776 submit_info.pSignalSemaphores = nullptr;
21777 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21778 }
21779
21780 vkQueueWaitIdle(queue);
21781
21782 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21783 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21784 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21785 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21786 vkDestroyBuffer(m_device->device(), buffer, NULL);
21787 vkFreeMemory(m_device->device(), mem, NULL);
21788
21789 m_errorMonitor->VerifyNotFound();
21790}
21791
21792// This is a positive test. No errors should be generated.
21793TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21794 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21795
Tony Barbour1fa09702017-03-16 12:09:08 -060021796 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021797 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021798
21799 m_errorMonitor->ExpectSuccess();
21800
21801 VkQueryPool query_pool;
21802 VkQueryPoolCreateInfo query_pool_create_info{};
21803 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21804 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21805 query_pool_create_info.queryCount = 1;
21806 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21807
21808 VkCommandPool command_pool;
21809 VkCommandPoolCreateInfo pool_create_info{};
21810 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21811 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21812 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21813 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21814
21815 VkCommandBuffer command_buffer[2];
21816 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21817 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21818 command_buffer_allocate_info.commandPool = command_pool;
21819 command_buffer_allocate_info.commandBufferCount = 2;
21820 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21821 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21822
21823 VkQueue queue = VK_NULL_HANDLE;
21824 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21825
21826 uint32_t qfi = 0;
21827 VkBufferCreateInfo buff_create_info = {};
21828 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21829 buff_create_info.size = 1024;
21830 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21831 buff_create_info.queueFamilyIndexCount = 1;
21832 buff_create_info.pQueueFamilyIndices = &qfi;
21833
21834 VkResult err;
21835 VkBuffer buffer;
21836 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21837 ASSERT_VK_SUCCESS(err);
21838 VkMemoryAllocateInfo mem_alloc = {};
21839 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21840 mem_alloc.pNext = NULL;
21841 mem_alloc.allocationSize = 1024;
21842 mem_alloc.memoryTypeIndex = 0;
21843
21844 VkMemoryRequirements memReqs;
21845 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21846 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21847 if (!pass) {
21848 vkDestroyBuffer(m_device->device(), buffer, NULL);
21849 return;
21850 }
21851
21852 VkDeviceMemory mem;
21853 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21854 ASSERT_VK_SUCCESS(err);
21855 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21856 ASSERT_VK_SUCCESS(err);
21857
21858 {
21859 VkCommandBufferBeginInfo begin_info{};
21860 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21861 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21862
21863 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21864 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21865
21866 vkEndCommandBuffer(command_buffer[0]);
21867
21868 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21869
21870 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21871
21872 vkEndCommandBuffer(command_buffer[1]);
21873 }
21874 {
21875 VkSubmitInfo submit_info{};
21876 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21877 submit_info.commandBufferCount = 2;
21878 submit_info.pCommandBuffers = command_buffer;
21879 submit_info.signalSemaphoreCount = 0;
21880 submit_info.pSignalSemaphores = nullptr;
21881 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21882 }
21883
21884 vkQueueWaitIdle(queue);
21885
21886 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21887 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21888 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21889 vkDestroyBuffer(m_device->device(), buffer, NULL);
21890 vkFreeMemory(m_device->device(), mem, NULL);
21891
21892 m_errorMonitor->VerifyNotFound();
21893}
21894
Tony Barbourc46924f2016-11-04 11:49:52 -060021895TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021896 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21897
Tony Barbour1fa09702017-03-16 12:09:08 -060021898 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021899 VkEvent event;
21900 VkEventCreateInfo event_create_info{};
21901 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21902 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21903
21904 VkCommandPool command_pool;
21905 VkCommandPoolCreateInfo pool_create_info{};
21906 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21907 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21908 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21909 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21910
21911 VkCommandBuffer command_buffer;
21912 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21913 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21914 command_buffer_allocate_info.commandPool = command_pool;
21915 command_buffer_allocate_info.commandBufferCount = 1;
21916 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21917 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21918
21919 VkQueue queue = VK_NULL_HANDLE;
21920 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21921
21922 {
21923 VkCommandBufferBeginInfo begin_info{};
21924 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21925 vkBeginCommandBuffer(command_buffer, &begin_info);
21926
21927 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021928 vkEndCommandBuffer(command_buffer);
21929 }
21930 {
21931 VkSubmitInfo submit_info{};
21932 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21933 submit_info.commandBufferCount = 1;
21934 submit_info.pCommandBuffers = &command_buffer;
21935 submit_info.signalSemaphoreCount = 0;
21936 submit_info.pSignalSemaphores = nullptr;
21937 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21938 }
21939 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21941 "that is already in use by a "
21942 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021943 vkSetEvent(m_device->device(), event);
21944 m_errorMonitor->VerifyFound();
21945 }
21946
21947 vkQueueWaitIdle(queue);
21948
21949 vkDestroyEvent(m_device->device(), event, nullptr);
21950 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21951 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21952}
21953
21954// This is a positive test. No errors should be generated.
21955TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021956 TEST_DESCRIPTION(
21957 "Two command buffers with two separate fences are each "
21958 "run through a Submit & WaitForFences cycle 3 times. This "
21959 "previously revealed a bug so running this positive test "
21960 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021961 m_errorMonitor->ExpectSuccess();
21962
Tony Barbour1fa09702017-03-16 12:09:08 -060021963 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021964 VkQueue queue = VK_NULL_HANDLE;
21965 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21966
21967 static const uint32_t NUM_OBJECTS = 2;
21968 static const uint32_t NUM_FRAMES = 3;
21969 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21970 VkFence fences[NUM_OBJECTS] = {};
21971
21972 VkCommandPool cmd_pool;
21973 VkCommandPoolCreateInfo cmd_pool_ci = {};
21974 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21975 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
21976 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21977 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
21978 ASSERT_VK_SUCCESS(err);
21979
21980 VkCommandBufferAllocateInfo cmd_buf_info = {};
21981 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21982 cmd_buf_info.commandPool = cmd_pool;
21983 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21984 cmd_buf_info.commandBufferCount = 1;
21985
21986 VkFenceCreateInfo fence_ci = {};
21987 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21988 fence_ci.pNext = nullptr;
21989 fence_ci.flags = 0;
21990
21991 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21992 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21993 ASSERT_VK_SUCCESS(err);
21994 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21995 ASSERT_VK_SUCCESS(err);
21996 }
21997
21998 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21999 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
22000 // Create empty cmd buffer
22001 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
22002 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22003
22004 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
22005 ASSERT_VK_SUCCESS(err);
22006 err = vkEndCommandBuffer(cmd_buffers[obj]);
22007 ASSERT_VK_SUCCESS(err);
22008
22009 VkSubmitInfo submit_info = {};
22010 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22011 submit_info.commandBufferCount = 1;
22012 submit_info.pCommandBuffers = &cmd_buffers[obj];
22013 // Submit cmd buffer and wait for fence
22014 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
22015 ASSERT_VK_SUCCESS(err);
22016 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
22017 ASSERT_VK_SUCCESS(err);
22018 err = vkResetFences(m_device->device(), 1, &fences[obj]);
22019 ASSERT_VK_SUCCESS(err);
22020 }
22021 }
22022 m_errorMonitor->VerifyNotFound();
22023 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
22024 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22025 vkDestroyFence(m_device->device(), fences[i], nullptr);
22026 }
22027}
22028// This is a positive test. No errors should be generated.
22029TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022030 TEST_DESCRIPTION(
22031 "Two command buffers, each in a separate QueueSubmit call "
22032 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022033
Tony Barbour1fa09702017-03-16 12:09:08 -060022034 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022035 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022036
22037 m_errorMonitor->ExpectSuccess();
22038
22039 VkSemaphore semaphore;
22040 VkSemaphoreCreateInfo semaphore_create_info{};
22041 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22042 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22043
22044 VkCommandPool command_pool;
22045 VkCommandPoolCreateInfo pool_create_info{};
22046 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22047 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22048 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22049 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22050
22051 VkCommandBuffer command_buffer[2];
22052 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22053 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22054 command_buffer_allocate_info.commandPool = command_pool;
22055 command_buffer_allocate_info.commandBufferCount = 2;
22056 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22057 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22058
22059 VkQueue queue = VK_NULL_HANDLE;
22060 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22061
22062 {
22063 VkCommandBufferBeginInfo begin_info{};
22064 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22065 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22066
22067 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 -070022068 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022069
22070 VkViewport viewport{};
22071 viewport.maxDepth = 1.0f;
22072 viewport.minDepth = 0.0f;
22073 viewport.width = 512;
22074 viewport.height = 512;
22075 viewport.x = 0;
22076 viewport.y = 0;
22077 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22078 vkEndCommandBuffer(command_buffer[0]);
22079 }
22080 {
22081 VkCommandBufferBeginInfo begin_info{};
22082 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22083 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22084
22085 VkViewport viewport{};
22086 viewport.maxDepth = 1.0f;
22087 viewport.minDepth = 0.0f;
22088 viewport.width = 512;
22089 viewport.height = 512;
22090 viewport.x = 0;
22091 viewport.y = 0;
22092 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22093 vkEndCommandBuffer(command_buffer[1]);
22094 }
22095 {
22096 VkSubmitInfo submit_info{};
22097 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22098 submit_info.commandBufferCount = 1;
22099 submit_info.pCommandBuffers = &command_buffer[0];
22100 submit_info.signalSemaphoreCount = 1;
22101 submit_info.pSignalSemaphores = &semaphore;
22102 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22103 }
22104 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022105 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022106 VkSubmitInfo submit_info{};
22107 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22108 submit_info.commandBufferCount = 1;
22109 submit_info.pCommandBuffers = &command_buffer[1];
22110 submit_info.waitSemaphoreCount = 1;
22111 submit_info.pWaitSemaphores = &semaphore;
22112 submit_info.pWaitDstStageMask = flags;
22113 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22114 }
22115
22116 vkQueueWaitIdle(m_device->m_queue);
22117
22118 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22119 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22120 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22121
22122 m_errorMonitor->VerifyNotFound();
22123}
22124
22125// This is a positive test. No errors should be generated.
22126TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022127 TEST_DESCRIPTION(
22128 "Two command buffers, each in a separate QueueSubmit call "
22129 "submitted on separate queues, the second having a fence"
22130 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022131
Tony Barbour1fa09702017-03-16 12:09:08 -060022132 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022133 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022134
22135 m_errorMonitor->ExpectSuccess();
22136
22137 VkFence fence;
22138 VkFenceCreateInfo fence_create_info{};
22139 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22140 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22141
22142 VkSemaphore semaphore;
22143 VkSemaphoreCreateInfo semaphore_create_info{};
22144 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22145 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22146
22147 VkCommandPool command_pool;
22148 VkCommandPoolCreateInfo pool_create_info{};
22149 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22150 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22151 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22152 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22153
22154 VkCommandBuffer command_buffer[2];
22155 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22156 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22157 command_buffer_allocate_info.commandPool = command_pool;
22158 command_buffer_allocate_info.commandBufferCount = 2;
22159 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22160 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22161
22162 VkQueue queue = VK_NULL_HANDLE;
22163 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22164
22165 {
22166 VkCommandBufferBeginInfo begin_info{};
22167 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22168 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22169
22170 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 -070022171 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022172
22173 VkViewport viewport{};
22174 viewport.maxDepth = 1.0f;
22175 viewport.minDepth = 0.0f;
22176 viewport.width = 512;
22177 viewport.height = 512;
22178 viewport.x = 0;
22179 viewport.y = 0;
22180 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22181 vkEndCommandBuffer(command_buffer[0]);
22182 }
22183 {
22184 VkCommandBufferBeginInfo begin_info{};
22185 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22186 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22187
22188 VkViewport viewport{};
22189 viewport.maxDepth = 1.0f;
22190 viewport.minDepth = 0.0f;
22191 viewport.width = 512;
22192 viewport.height = 512;
22193 viewport.x = 0;
22194 viewport.y = 0;
22195 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22196 vkEndCommandBuffer(command_buffer[1]);
22197 }
22198 {
22199 VkSubmitInfo submit_info{};
22200 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22201 submit_info.commandBufferCount = 1;
22202 submit_info.pCommandBuffers = &command_buffer[0];
22203 submit_info.signalSemaphoreCount = 1;
22204 submit_info.pSignalSemaphores = &semaphore;
22205 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22206 }
22207 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022208 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022209 VkSubmitInfo submit_info{};
22210 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22211 submit_info.commandBufferCount = 1;
22212 submit_info.pCommandBuffers = &command_buffer[1];
22213 submit_info.waitSemaphoreCount = 1;
22214 submit_info.pWaitSemaphores = &semaphore;
22215 submit_info.pWaitDstStageMask = flags;
22216 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22217 }
22218
22219 vkQueueWaitIdle(m_device->m_queue);
22220
22221 vkDestroyFence(m_device->device(), fence, nullptr);
22222 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22223 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22224 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22225
22226 m_errorMonitor->VerifyNotFound();
22227}
22228
22229// This is a positive test. No errors should be generated.
22230TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022231 TEST_DESCRIPTION(
22232 "Two command buffers, each in a separate QueueSubmit call "
22233 "submitted on separate queues, the second having a fence"
22234 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022235
Tony Barbour1fa09702017-03-16 12:09:08 -060022236 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022237 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022238
22239 m_errorMonitor->ExpectSuccess();
22240
22241 VkFence fence;
22242 VkFenceCreateInfo fence_create_info{};
22243 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22244 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22245
22246 VkSemaphore semaphore;
22247 VkSemaphoreCreateInfo semaphore_create_info{};
22248 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22249 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22250
22251 VkCommandPool command_pool;
22252 VkCommandPoolCreateInfo pool_create_info{};
22253 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22254 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22255 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22256 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22257
22258 VkCommandBuffer command_buffer[2];
22259 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22260 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22261 command_buffer_allocate_info.commandPool = command_pool;
22262 command_buffer_allocate_info.commandBufferCount = 2;
22263 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22264 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22265
22266 VkQueue queue = VK_NULL_HANDLE;
22267 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22268
22269 {
22270 VkCommandBufferBeginInfo begin_info{};
22271 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22272 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22273
22274 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 -070022275 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022276
22277 VkViewport viewport{};
22278 viewport.maxDepth = 1.0f;
22279 viewport.minDepth = 0.0f;
22280 viewport.width = 512;
22281 viewport.height = 512;
22282 viewport.x = 0;
22283 viewport.y = 0;
22284 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22285 vkEndCommandBuffer(command_buffer[0]);
22286 }
22287 {
22288 VkCommandBufferBeginInfo begin_info{};
22289 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22290 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22291
22292 VkViewport viewport{};
22293 viewport.maxDepth = 1.0f;
22294 viewport.minDepth = 0.0f;
22295 viewport.width = 512;
22296 viewport.height = 512;
22297 viewport.x = 0;
22298 viewport.y = 0;
22299 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22300 vkEndCommandBuffer(command_buffer[1]);
22301 }
22302 {
22303 VkSubmitInfo submit_info{};
22304 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22305 submit_info.commandBufferCount = 1;
22306 submit_info.pCommandBuffers = &command_buffer[0];
22307 submit_info.signalSemaphoreCount = 1;
22308 submit_info.pSignalSemaphores = &semaphore;
22309 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22310 }
22311 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022312 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022313 VkSubmitInfo submit_info{};
22314 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22315 submit_info.commandBufferCount = 1;
22316 submit_info.pCommandBuffers = &command_buffer[1];
22317 submit_info.waitSemaphoreCount = 1;
22318 submit_info.pWaitSemaphores = &semaphore;
22319 submit_info.pWaitDstStageMask = flags;
22320 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22321 }
22322
22323 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22324 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22325
22326 vkDestroyFence(m_device->device(), fence, nullptr);
22327 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22328 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22329 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22330
22331 m_errorMonitor->VerifyNotFound();
22332}
22333
22334TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060022335 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022336 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022337 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022338 return;
22339 }
22340
22341 VkResult err;
22342
22343 m_errorMonitor->ExpectSuccess();
22344
22345 VkQueue q0 = m_device->m_queue;
22346 VkQueue q1 = nullptr;
22347 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
22348 ASSERT_NE(q1, nullptr);
22349
22350 // An (empty) command buffer. We must have work in the first submission --
22351 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022352 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022353 VkCommandPool pool;
22354 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
22355 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022356 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
22357 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022358 VkCommandBuffer cb;
22359 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
22360 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022361 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022362 err = vkBeginCommandBuffer(cb, &cbbi);
22363 ASSERT_VK_SUCCESS(err);
22364 err = vkEndCommandBuffer(cb);
22365 ASSERT_VK_SUCCESS(err);
22366
22367 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022368 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022369 VkSemaphore s;
22370 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
22371 ASSERT_VK_SUCCESS(err);
22372
22373 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022374 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022375
22376 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
22377 ASSERT_VK_SUCCESS(err);
22378
22379 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022380 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022381 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022382
22383 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
22384 ASSERT_VK_SUCCESS(err);
22385
22386 // Wait for q0 idle
22387 err = vkQueueWaitIdle(q0);
22388 ASSERT_VK_SUCCESS(err);
22389
22390 // Command buffer should have been completed (it was on q0); reset the pool.
22391 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
22392
22393 m_errorMonitor->VerifyNotFound();
22394
22395 // Force device completely idle and clean up resources
22396 vkDeviceWaitIdle(m_device->device());
22397 vkDestroyCommandPool(m_device->device(), pool, nullptr);
22398 vkDestroySemaphore(m_device->device(), s, nullptr);
22399}
22400
22401// This is a positive test. No errors should be generated.
22402TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022403 TEST_DESCRIPTION(
22404 "Two command buffers, each in a separate QueueSubmit call "
22405 "submitted on separate queues, the second having a fence, "
22406 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022407
Tony Barbour1fa09702017-03-16 12:09:08 -060022408 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022409 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022410
22411 m_errorMonitor->ExpectSuccess();
22412
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022413 VkFence fence;
22414 VkFenceCreateInfo fence_create_info{};
22415 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22416 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22417
22418 VkSemaphore semaphore;
22419 VkSemaphoreCreateInfo semaphore_create_info{};
22420 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22421 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22422
22423 VkCommandPool command_pool;
22424 VkCommandPoolCreateInfo pool_create_info{};
22425 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22426 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22427 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22428 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22429
22430 VkCommandBuffer command_buffer[2];
22431 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22432 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22433 command_buffer_allocate_info.commandPool = command_pool;
22434 command_buffer_allocate_info.commandBufferCount = 2;
22435 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22436 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22437
22438 VkQueue queue = VK_NULL_HANDLE;
22439 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22440
22441 {
22442 VkCommandBufferBeginInfo begin_info{};
22443 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22444 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22445
22446 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 -070022447 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022448
22449 VkViewport viewport{};
22450 viewport.maxDepth = 1.0f;
22451 viewport.minDepth = 0.0f;
22452 viewport.width = 512;
22453 viewport.height = 512;
22454 viewport.x = 0;
22455 viewport.y = 0;
22456 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22457 vkEndCommandBuffer(command_buffer[0]);
22458 }
22459 {
22460 VkCommandBufferBeginInfo begin_info{};
22461 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22462 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22463
22464 VkViewport viewport{};
22465 viewport.maxDepth = 1.0f;
22466 viewport.minDepth = 0.0f;
22467 viewport.width = 512;
22468 viewport.height = 512;
22469 viewport.x = 0;
22470 viewport.y = 0;
22471 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22472 vkEndCommandBuffer(command_buffer[1]);
22473 }
22474 {
22475 VkSubmitInfo submit_info{};
22476 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22477 submit_info.commandBufferCount = 1;
22478 submit_info.pCommandBuffers = &command_buffer[0];
22479 submit_info.signalSemaphoreCount = 1;
22480 submit_info.pSignalSemaphores = &semaphore;
22481 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22482 }
22483 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022484 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022485 VkSubmitInfo submit_info{};
22486 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22487 submit_info.commandBufferCount = 1;
22488 submit_info.pCommandBuffers = &command_buffer[1];
22489 submit_info.waitSemaphoreCount = 1;
22490 submit_info.pWaitSemaphores = &semaphore;
22491 submit_info.pWaitDstStageMask = flags;
22492 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22493 }
22494
22495 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22496
22497 vkDestroyFence(m_device->device(), fence, nullptr);
22498 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22499 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22500 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22501
22502 m_errorMonitor->VerifyNotFound();
22503}
22504
22505// This is a positive test. No errors should be generated.
22506TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022507 TEST_DESCRIPTION(
22508 "Two command buffers, each in a separate QueueSubmit call "
22509 "on the same queue, sharing a signal/wait semaphore, the "
22510 "second having a fence, "
22511 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022512
22513 m_errorMonitor->ExpectSuccess();
22514
Tony Barbour1fa09702017-03-16 12:09:08 -060022515 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022516 VkFence fence;
22517 VkFenceCreateInfo fence_create_info{};
22518 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22519 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22520
22521 VkSemaphore semaphore;
22522 VkSemaphoreCreateInfo semaphore_create_info{};
22523 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22524 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22525
22526 VkCommandPool command_pool;
22527 VkCommandPoolCreateInfo pool_create_info{};
22528 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22529 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22530 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22531 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22532
22533 VkCommandBuffer command_buffer[2];
22534 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22535 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22536 command_buffer_allocate_info.commandPool = command_pool;
22537 command_buffer_allocate_info.commandBufferCount = 2;
22538 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22539 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22540
22541 {
22542 VkCommandBufferBeginInfo begin_info{};
22543 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22544 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22545
22546 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 -070022547 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022548
22549 VkViewport viewport{};
22550 viewport.maxDepth = 1.0f;
22551 viewport.minDepth = 0.0f;
22552 viewport.width = 512;
22553 viewport.height = 512;
22554 viewport.x = 0;
22555 viewport.y = 0;
22556 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22557 vkEndCommandBuffer(command_buffer[0]);
22558 }
22559 {
22560 VkCommandBufferBeginInfo begin_info{};
22561 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22562 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22563
22564 VkViewport viewport{};
22565 viewport.maxDepth = 1.0f;
22566 viewport.minDepth = 0.0f;
22567 viewport.width = 512;
22568 viewport.height = 512;
22569 viewport.x = 0;
22570 viewport.y = 0;
22571 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22572 vkEndCommandBuffer(command_buffer[1]);
22573 }
22574 {
22575 VkSubmitInfo submit_info{};
22576 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22577 submit_info.commandBufferCount = 1;
22578 submit_info.pCommandBuffers = &command_buffer[0];
22579 submit_info.signalSemaphoreCount = 1;
22580 submit_info.pSignalSemaphores = &semaphore;
22581 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22582 }
22583 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022584 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022585 VkSubmitInfo submit_info{};
22586 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22587 submit_info.commandBufferCount = 1;
22588 submit_info.pCommandBuffers = &command_buffer[1];
22589 submit_info.waitSemaphoreCount = 1;
22590 submit_info.pWaitSemaphores = &semaphore;
22591 submit_info.pWaitDstStageMask = flags;
22592 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22593 }
22594
22595 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22596
22597 vkDestroyFence(m_device->device(), fence, nullptr);
22598 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22599 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22600 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22601
22602 m_errorMonitor->VerifyNotFound();
22603}
22604
22605// This is a positive test. No errors should be generated.
22606TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022607 TEST_DESCRIPTION(
22608 "Two command buffers, each in a separate QueueSubmit call "
22609 "on the same queue, no fences, followed by a third QueueSubmit with NO "
22610 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022611
22612 m_errorMonitor->ExpectSuccess();
22613
Tony Barbour1fa09702017-03-16 12:09:08 -060022614 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022615 VkFence fence;
22616 VkFenceCreateInfo fence_create_info{};
22617 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22618 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22619
22620 VkCommandPool command_pool;
22621 VkCommandPoolCreateInfo pool_create_info{};
22622 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22623 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22624 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22625 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22626
22627 VkCommandBuffer command_buffer[2];
22628 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22629 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22630 command_buffer_allocate_info.commandPool = command_pool;
22631 command_buffer_allocate_info.commandBufferCount = 2;
22632 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22633 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22634
22635 {
22636 VkCommandBufferBeginInfo begin_info{};
22637 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22638 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22639
22640 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 -070022641 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022642
22643 VkViewport viewport{};
22644 viewport.maxDepth = 1.0f;
22645 viewport.minDepth = 0.0f;
22646 viewport.width = 512;
22647 viewport.height = 512;
22648 viewport.x = 0;
22649 viewport.y = 0;
22650 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22651 vkEndCommandBuffer(command_buffer[0]);
22652 }
22653 {
22654 VkCommandBufferBeginInfo begin_info{};
22655 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22656 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22657
22658 VkViewport viewport{};
22659 viewport.maxDepth = 1.0f;
22660 viewport.minDepth = 0.0f;
22661 viewport.width = 512;
22662 viewport.height = 512;
22663 viewport.x = 0;
22664 viewport.y = 0;
22665 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22666 vkEndCommandBuffer(command_buffer[1]);
22667 }
22668 {
22669 VkSubmitInfo submit_info{};
22670 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22671 submit_info.commandBufferCount = 1;
22672 submit_info.pCommandBuffers = &command_buffer[0];
22673 submit_info.signalSemaphoreCount = 0;
22674 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22675 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22676 }
22677 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022678 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022679 VkSubmitInfo submit_info{};
22680 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22681 submit_info.commandBufferCount = 1;
22682 submit_info.pCommandBuffers = &command_buffer[1];
22683 submit_info.waitSemaphoreCount = 0;
22684 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22685 submit_info.pWaitDstStageMask = flags;
22686 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22687 }
22688
22689 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
22690
22691 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22692 ASSERT_VK_SUCCESS(err);
22693
22694 vkDestroyFence(m_device->device(), fence, nullptr);
22695 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22696 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22697
22698 m_errorMonitor->VerifyNotFound();
22699}
22700
22701// This is a positive test. No errors should be generated.
22702TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022703 TEST_DESCRIPTION(
22704 "Two command buffers, each in a separate QueueSubmit call "
22705 "on the same queue, the second having a fence, followed "
22706 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022707
22708 m_errorMonitor->ExpectSuccess();
22709
Tony Barbour1fa09702017-03-16 12:09:08 -060022710 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022711 VkFence fence;
22712 VkFenceCreateInfo fence_create_info{};
22713 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22714 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22715
22716 VkCommandPool command_pool;
22717 VkCommandPoolCreateInfo pool_create_info{};
22718 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22719 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22720 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22721 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22722
22723 VkCommandBuffer command_buffer[2];
22724 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22725 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22726 command_buffer_allocate_info.commandPool = command_pool;
22727 command_buffer_allocate_info.commandBufferCount = 2;
22728 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22729 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22730
22731 {
22732 VkCommandBufferBeginInfo begin_info{};
22733 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22734 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22735
22736 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 -070022737 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022738
22739 VkViewport viewport{};
22740 viewport.maxDepth = 1.0f;
22741 viewport.minDepth = 0.0f;
22742 viewport.width = 512;
22743 viewport.height = 512;
22744 viewport.x = 0;
22745 viewport.y = 0;
22746 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22747 vkEndCommandBuffer(command_buffer[0]);
22748 }
22749 {
22750 VkCommandBufferBeginInfo begin_info{};
22751 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22752 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22753
22754 VkViewport viewport{};
22755 viewport.maxDepth = 1.0f;
22756 viewport.minDepth = 0.0f;
22757 viewport.width = 512;
22758 viewport.height = 512;
22759 viewport.x = 0;
22760 viewport.y = 0;
22761 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22762 vkEndCommandBuffer(command_buffer[1]);
22763 }
22764 {
22765 VkSubmitInfo submit_info{};
22766 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22767 submit_info.commandBufferCount = 1;
22768 submit_info.pCommandBuffers = &command_buffer[0];
22769 submit_info.signalSemaphoreCount = 0;
22770 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22771 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22772 }
22773 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022774 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022775 VkSubmitInfo submit_info{};
22776 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22777 submit_info.commandBufferCount = 1;
22778 submit_info.pCommandBuffers = &command_buffer[1];
22779 submit_info.waitSemaphoreCount = 0;
22780 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22781 submit_info.pWaitDstStageMask = flags;
22782 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22783 }
22784
22785 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22786
22787 vkDestroyFence(m_device->device(), fence, nullptr);
22788 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22789 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22790
22791 m_errorMonitor->VerifyNotFound();
22792}
22793
22794// This is a positive test. No errors should be generated.
22795TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022796 TEST_DESCRIPTION(
22797 "Two command buffers each in a separate SubmitInfo sent in a single "
22798 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022799 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022800
22801 m_errorMonitor->ExpectSuccess();
22802
22803 VkFence fence;
22804 VkFenceCreateInfo fence_create_info{};
22805 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22806 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22807
22808 VkSemaphore semaphore;
22809 VkSemaphoreCreateInfo semaphore_create_info{};
22810 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22811 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22812
22813 VkCommandPool command_pool;
22814 VkCommandPoolCreateInfo pool_create_info{};
22815 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22816 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22817 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22818 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22819
22820 VkCommandBuffer command_buffer[2];
22821 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22822 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22823 command_buffer_allocate_info.commandPool = command_pool;
22824 command_buffer_allocate_info.commandBufferCount = 2;
22825 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22826 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22827
22828 {
22829 VkCommandBufferBeginInfo begin_info{};
22830 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22831 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22832
22833 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 -070022834 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022835
22836 VkViewport viewport{};
22837 viewport.maxDepth = 1.0f;
22838 viewport.minDepth = 0.0f;
22839 viewport.width = 512;
22840 viewport.height = 512;
22841 viewport.x = 0;
22842 viewport.y = 0;
22843 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22844 vkEndCommandBuffer(command_buffer[0]);
22845 }
22846 {
22847 VkCommandBufferBeginInfo begin_info{};
22848 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22849 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22850
22851 VkViewport viewport{};
22852 viewport.maxDepth = 1.0f;
22853 viewport.minDepth = 0.0f;
22854 viewport.width = 512;
22855 viewport.height = 512;
22856 viewport.x = 0;
22857 viewport.y = 0;
22858 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22859 vkEndCommandBuffer(command_buffer[1]);
22860 }
22861 {
22862 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022863 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022864
22865 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22866 submit_info[0].pNext = NULL;
22867 submit_info[0].commandBufferCount = 1;
22868 submit_info[0].pCommandBuffers = &command_buffer[0];
22869 submit_info[0].signalSemaphoreCount = 1;
22870 submit_info[0].pSignalSemaphores = &semaphore;
22871 submit_info[0].waitSemaphoreCount = 0;
22872 submit_info[0].pWaitSemaphores = NULL;
22873 submit_info[0].pWaitDstStageMask = 0;
22874
22875 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22876 submit_info[1].pNext = NULL;
22877 submit_info[1].commandBufferCount = 1;
22878 submit_info[1].pCommandBuffers = &command_buffer[1];
22879 submit_info[1].waitSemaphoreCount = 1;
22880 submit_info[1].pWaitSemaphores = &semaphore;
22881 submit_info[1].pWaitDstStageMask = flags;
22882 submit_info[1].signalSemaphoreCount = 0;
22883 submit_info[1].pSignalSemaphores = NULL;
22884 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22885 }
22886
22887 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22888
22889 vkDestroyFence(m_device->device(), fence, nullptr);
22890 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22891 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22892 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22893
22894 m_errorMonitor->VerifyNotFound();
22895}
22896
22897TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22898 m_errorMonitor->ExpectSuccess();
22899
Tony Barbour1fa09702017-03-16 12:09:08 -060022900 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022901 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22902
Tony Barbour552f6c02016-12-21 14:34:07 -070022903 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022904
22905 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22906 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22907 m_errorMonitor->VerifyNotFound();
22908 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22909 m_errorMonitor->VerifyNotFound();
22910 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22911 m_errorMonitor->VerifyNotFound();
22912
22913 m_commandBuffer->EndCommandBuffer();
22914 m_errorMonitor->VerifyNotFound();
22915}
22916
22917TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022918 TEST_DESCRIPTION(
22919 "Positive test where we create a renderpass with an "
22920 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22921 "has a valid layout, and a second subpass then uses a "
22922 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022923 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022924 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022925 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022926 if (!depth_format) {
22927 printf(" No Depth + Stencil format found. Skipped.\n");
22928 return;
22929 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022930
22931 VkAttachmentReference attach[2] = {};
22932 attach[0].attachment = 0;
22933 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22934 attach[1].attachment = 0;
22935 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22936 VkSubpassDescription subpasses[2] = {};
22937 // First subpass clears DS attach on load
22938 subpasses[0].pDepthStencilAttachment = &attach[0];
22939 // 2nd subpass reads in DS as input attachment
22940 subpasses[1].inputAttachmentCount = 1;
22941 subpasses[1].pInputAttachments = &attach[1];
22942 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022943 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022944 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22945 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22946 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22947 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22948 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22949 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22950 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22951 VkRenderPassCreateInfo rpci = {};
22952 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22953 rpci.attachmentCount = 1;
22954 rpci.pAttachments = &attach_desc;
22955 rpci.subpassCount = 2;
22956 rpci.pSubpasses = subpasses;
22957
22958 // Now create RenderPass and verify no errors
22959 VkRenderPass rp;
22960 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22961 m_errorMonitor->VerifyNotFound();
22962
22963 vkDestroyRenderPass(m_device->device(), rp, NULL);
22964}
22965
Tobin Ehlis01103de2017-02-16 13:22:47 -070022966TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22967 TEST_DESCRIPTION(
22968 "Create a render pass with depth-stencil attachment where layout transition "
22969 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22970 "transition has correctly occurred at queue submit time with no validation errors.");
22971
Tony Barbour1fa09702017-03-16 12:09:08 -060022972 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022973 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022974 if (!depth_format) {
22975 printf(" No Depth + Stencil format found. Skipped.\n");
22976 return;
22977 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070022978 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070022979 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022980 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22981 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022982 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022983 return;
22984 }
22985
22986 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22988
22989 // A renderpass with one depth/stencil attachment.
22990 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022991 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022992 VK_SAMPLE_COUNT_1_BIT,
22993 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22994 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22995 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22996 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22997 VK_IMAGE_LAYOUT_UNDEFINED,
22998 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22999
23000 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23001
23002 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
23003
23004 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
23005
23006 VkRenderPass rp;
23007 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23008 ASSERT_VK_SUCCESS(err);
23009 // A compatible ds image.
23010 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060023011 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 -070023012 ASSERT_TRUE(image.initialized());
23013
23014 VkImageViewCreateInfo ivci = {
23015 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
23016 nullptr,
23017 0,
23018 image.handle(),
23019 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070023020 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023021 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
23022 VK_COMPONENT_SWIZZLE_IDENTITY},
23023 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
23024 };
23025 VkImageView view;
23026 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
23027 ASSERT_VK_SUCCESS(err);
23028
23029 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
23030 VkFramebuffer fb;
23031 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
23032 ASSERT_VK_SUCCESS(err);
23033
23034 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
23035 m_commandBuffer->BeginCommandBuffer();
23036 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
23037 vkCmdEndRenderPass(m_commandBuffer->handle());
23038 m_commandBuffer->EndCommandBuffer();
23039 QueueCommandBuffer(false);
23040 m_errorMonitor->VerifyNotFound();
23041
23042 // Cleanup
23043 vkDestroyImageView(m_device->device(), view, NULL);
23044 vkDestroyRenderPass(m_device->device(), rp, NULL);
23045 vkDestroyFramebuffer(m_device->device(), fb, NULL);
23046}
23047
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023048TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023049 TEST_DESCRIPTION(
23050 "Test that pipeline validation accepts matrices passed "
23051 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023052 m_errorMonitor->ExpectSuccess();
23053
Tony Barbour1fa09702017-03-16 12:09:08 -060023054 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023055 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23056
23057 VkVertexInputBindingDescription input_binding;
23058 memset(&input_binding, 0, sizeof(input_binding));
23059
23060 VkVertexInputAttributeDescription input_attribs[2];
23061 memset(input_attribs, 0, sizeof(input_attribs));
23062
23063 for (int i = 0; i < 2; i++) {
23064 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23065 input_attribs[i].location = i;
23066 }
23067
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023068 char const *vsSource =
23069 "#version 450\n"
23070 "\n"
23071 "layout(location=0) in mat2x4 x;\n"
23072 "out gl_PerVertex {\n"
23073 " vec4 gl_Position;\n"
23074 "};\n"
23075 "void main(){\n"
23076 " gl_Position = x[0] + x[1];\n"
23077 "}\n";
23078 char const *fsSource =
23079 "#version 450\n"
23080 "\n"
23081 "layout(location=0) out vec4 color;\n"
23082 "void main(){\n"
23083 " color = vec4(1);\n"
23084 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023085
23086 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23087 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23088
23089 VkPipelineObj pipe(m_device);
23090 pipe.AddColorAttachment();
23091 pipe.AddShader(&vs);
23092 pipe.AddShader(&fs);
23093
23094 pipe.AddVertexInputBindings(&input_binding, 1);
23095 pipe.AddVertexInputAttribs(input_attribs, 2);
23096
23097 VkDescriptorSetObj descriptorSet(m_device);
23098 descriptorSet.AppendDummy();
23099 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23100
23101 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23102
23103 /* expect success */
23104 m_errorMonitor->VerifyNotFound();
23105}
23106
23107TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
23108 m_errorMonitor->ExpectSuccess();
23109
Tony Barbour1fa09702017-03-16 12:09:08 -060023110 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23112
23113 VkVertexInputBindingDescription input_binding;
23114 memset(&input_binding, 0, sizeof(input_binding));
23115
23116 VkVertexInputAttributeDescription input_attribs[2];
23117 memset(input_attribs, 0, sizeof(input_attribs));
23118
23119 for (int i = 0; i < 2; i++) {
23120 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23121 input_attribs[i].location = i;
23122 }
23123
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023124 char const *vsSource =
23125 "#version 450\n"
23126 "\n"
23127 "layout(location=0) in vec4 x[2];\n"
23128 "out gl_PerVertex {\n"
23129 " vec4 gl_Position;\n"
23130 "};\n"
23131 "void main(){\n"
23132 " gl_Position = x[0] + x[1];\n"
23133 "}\n";
23134 char const *fsSource =
23135 "#version 450\n"
23136 "\n"
23137 "layout(location=0) out vec4 color;\n"
23138 "void main(){\n"
23139 " color = vec4(1);\n"
23140 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023141
23142 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23143 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23144
23145 VkPipelineObj pipe(m_device);
23146 pipe.AddColorAttachment();
23147 pipe.AddShader(&vs);
23148 pipe.AddShader(&fs);
23149
23150 pipe.AddVertexInputBindings(&input_binding, 1);
23151 pipe.AddVertexInputAttribs(input_attribs, 2);
23152
23153 VkDescriptorSetObj descriptorSet(m_device);
23154 descriptorSet.AppendDummy();
23155 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23156
23157 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23158
23159 m_errorMonitor->VerifyNotFound();
23160}
23161
23162TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023163 TEST_DESCRIPTION(
23164 "Test that pipeline validation accepts consuming a vertex attribute "
23165 "through multiple vertex shader inputs, each consuming a different "
23166 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023167 m_errorMonitor->ExpectSuccess();
23168
Tony Barbour1fa09702017-03-16 12:09:08 -060023169 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023170 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23171
23172 VkVertexInputBindingDescription input_binding;
23173 memset(&input_binding, 0, sizeof(input_binding));
23174
23175 VkVertexInputAttributeDescription input_attribs[3];
23176 memset(input_attribs, 0, sizeof(input_attribs));
23177
23178 for (int i = 0; i < 3; i++) {
23179 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23180 input_attribs[i].location = i;
23181 }
23182
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023183 char const *vsSource =
23184 "#version 450\n"
23185 "\n"
23186 "layout(location=0) in vec4 x;\n"
23187 "layout(location=1) in vec3 y1;\n"
23188 "layout(location=1, component=3) in float y2;\n"
23189 "layout(location=2) in vec4 z;\n"
23190 "out gl_PerVertex {\n"
23191 " vec4 gl_Position;\n"
23192 "};\n"
23193 "void main(){\n"
23194 " gl_Position = x + vec4(y1, y2) + z;\n"
23195 "}\n";
23196 char const *fsSource =
23197 "#version 450\n"
23198 "\n"
23199 "layout(location=0) out vec4 color;\n"
23200 "void main(){\n"
23201 " color = vec4(1);\n"
23202 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023203
23204 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23205 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23206
23207 VkPipelineObj pipe(m_device);
23208 pipe.AddColorAttachment();
23209 pipe.AddShader(&vs);
23210 pipe.AddShader(&fs);
23211
23212 pipe.AddVertexInputBindings(&input_binding, 1);
23213 pipe.AddVertexInputAttribs(input_attribs, 3);
23214
23215 VkDescriptorSetObj descriptorSet(m_device);
23216 descriptorSet.AppendDummy();
23217 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23218
23219 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23220
23221 m_errorMonitor->VerifyNotFound();
23222}
23223
23224TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
23225 m_errorMonitor->ExpectSuccess();
23226
Tony Barbour1fa09702017-03-16 12:09:08 -060023227 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23229
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023230 char const *vsSource =
23231 "#version 450\n"
23232 "out gl_PerVertex {\n"
23233 " vec4 gl_Position;\n"
23234 "};\n"
23235 "void main(){\n"
23236 " gl_Position = vec4(0);\n"
23237 "}\n";
23238 char const *fsSource =
23239 "#version 450\n"
23240 "\n"
23241 "layout(location=0) out vec4 color;\n"
23242 "void main(){\n"
23243 " color = vec4(1);\n"
23244 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023245
23246 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23247 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23248
23249 VkPipelineObj pipe(m_device);
23250 pipe.AddColorAttachment();
23251 pipe.AddShader(&vs);
23252 pipe.AddShader(&fs);
23253
23254 VkDescriptorSetObj descriptorSet(m_device);
23255 descriptorSet.AppendDummy();
23256 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23257
23258 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23259
23260 m_errorMonitor->VerifyNotFound();
23261}
23262
23263TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023264 TEST_DESCRIPTION(
23265 "Test that pipeline validation accepts the relaxed type matching rules "
23266 "set out in 14.1.3: fundamental type must match, and producer side must "
23267 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023268 m_errorMonitor->ExpectSuccess();
23269
23270 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
23271
Tony Barbour1fa09702017-03-16 12:09:08 -060023272 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023273 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23274
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023275 char const *vsSource =
23276 "#version 450\n"
23277 "out gl_PerVertex {\n"
23278 " vec4 gl_Position;\n"
23279 "};\n"
23280 "layout(location=0) out vec3 x;\n"
23281 "layout(location=1) out ivec3 y;\n"
23282 "layout(location=2) out vec3 z;\n"
23283 "void main(){\n"
23284 " gl_Position = vec4(0);\n"
23285 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
23286 "}\n";
23287 char const *fsSource =
23288 "#version 450\n"
23289 "\n"
23290 "layout(location=0) out vec4 color;\n"
23291 "layout(location=0) in float x;\n"
23292 "layout(location=1) flat in int y;\n"
23293 "layout(location=2) in vec2 z;\n"
23294 "void main(){\n"
23295 " color = vec4(1 + x + y + z.x);\n"
23296 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023297
23298 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23299 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23300
23301 VkPipelineObj pipe(m_device);
23302 pipe.AddColorAttachment();
23303 pipe.AddShader(&vs);
23304 pipe.AddShader(&fs);
23305
23306 VkDescriptorSetObj descriptorSet(m_device);
23307 descriptorSet.AppendDummy();
23308 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23309
23310 VkResult err = VK_SUCCESS;
23311 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23312 ASSERT_VK_SUCCESS(err);
23313
23314 m_errorMonitor->VerifyNotFound();
23315}
23316
23317TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023318 TEST_DESCRIPTION(
23319 "Test that pipeline validation accepts per-vertex variables "
23320 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023321 m_errorMonitor->ExpectSuccess();
23322
Tony Barbour1fa09702017-03-16 12:09:08 -060023323 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23325
23326 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023327 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023328 return;
23329 }
23330
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023331 char const *vsSource =
23332 "#version 450\n"
23333 "void main(){}\n";
23334 char const *tcsSource =
23335 "#version 450\n"
23336 "layout(location=0) out int x[];\n"
23337 "layout(vertices=3) out;\n"
23338 "void main(){\n"
23339 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
23340 " gl_TessLevelInner[0] = 1;\n"
23341 " x[gl_InvocationID] = gl_InvocationID;\n"
23342 "}\n";
23343 char const *tesSource =
23344 "#version 450\n"
23345 "layout(triangles, equal_spacing, cw) in;\n"
23346 "layout(location=0) in int x[];\n"
23347 "out gl_PerVertex { vec4 gl_Position; };\n"
23348 "void main(){\n"
23349 " gl_Position.xyz = gl_TessCoord;\n"
23350 " gl_Position.w = x[0] + x[1] + x[2];\n"
23351 "}\n";
23352 char const *fsSource =
23353 "#version 450\n"
23354 "layout(location=0) out vec4 color;\n"
23355 "void main(){\n"
23356 " color = vec4(1);\n"
23357 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023358
23359 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23360 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
23361 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
23362 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23363
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023364 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
23365 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023366
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023367 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023368
23369 VkPipelineObj pipe(m_device);
23370 pipe.SetInputAssembly(&iasci);
23371 pipe.SetTessellation(&tsci);
23372 pipe.AddColorAttachment();
23373 pipe.AddShader(&vs);
23374 pipe.AddShader(&tcs);
23375 pipe.AddShader(&tes);
23376 pipe.AddShader(&fs);
23377
23378 VkDescriptorSetObj descriptorSet(m_device);
23379 descriptorSet.AppendDummy();
23380 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23381
23382 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23383
23384 m_errorMonitor->VerifyNotFound();
23385}
23386
23387TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023388 TEST_DESCRIPTION(
23389 "Test that pipeline validation accepts a user-defined "
23390 "interface block passed into the geometry shader. This "
23391 "is interesting because the 'extra' array level is not "
23392 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023393 m_errorMonitor->ExpectSuccess();
23394
Tony Barbour1fa09702017-03-16 12:09:08 -060023395 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23397
23398 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023399 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023400 return;
23401 }
23402
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023403 char const *vsSource =
23404 "#version 450\n"
23405 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
23406 "void main(){\n"
23407 " vs_out.x = vec4(1);\n"
23408 "}\n";
23409 char const *gsSource =
23410 "#version 450\n"
23411 "layout(triangles) in;\n"
23412 "layout(triangle_strip, max_vertices=3) out;\n"
23413 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
23414 "out gl_PerVertex { vec4 gl_Position; };\n"
23415 "void main() {\n"
23416 " gl_Position = gs_in[0].x;\n"
23417 " EmitVertex();\n"
23418 "}\n";
23419 char const *fsSource =
23420 "#version 450\n"
23421 "layout(location=0) out vec4 color;\n"
23422 "void main(){\n"
23423 " color = vec4(1);\n"
23424 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023425
23426 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23427 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
23428 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23429
23430 VkPipelineObj pipe(m_device);
23431 pipe.AddColorAttachment();
23432 pipe.AddShader(&vs);
23433 pipe.AddShader(&gs);
23434 pipe.AddShader(&fs);
23435
23436 VkDescriptorSetObj descriptorSet(m_device);
23437 descriptorSet.AppendDummy();
23438 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23439
23440 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23441
23442 m_errorMonitor->VerifyNotFound();
23443}
23444
23445TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023446 TEST_DESCRIPTION(
23447 "Test that pipeline validation accepts basic use of 64bit vertex "
23448 "attributes. This is interesting because they consume multiple "
23449 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023450 m_errorMonitor->ExpectSuccess();
23451
Tony Barbour1fa09702017-03-16 12:09:08 -060023452 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23454
23455 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023456 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023457 return;
23458 }
23459
23460 VkVertexInputBindingDescription input_bindings[1];
23461 memset(input_bindings, 0, sizeof(input_bindings));
23462
23463 VkVertexInputAttributeDescription input_attribs[4];
23464 memset(input_attribs, 0, sizeof(input_attribs));
23465 input_attribs[0].location = 0;
23466 input_attribs[0].offset = 0;
23467 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23468 input_attribs[1].location = 2;
23469 input_attribs[1].offset = 32;
23470 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23471 input_attribs[2].location = 4;
23472 input_attribs[2].offset = 64;
23473 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23474 input_attribs[3].location = 6;
23475 input_attribs[3].offset = 96;
23476 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23477
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023478 char const *vsSource =
23479 "#version 450\n"
23480 "\n"
23481 "layout(location=0) in dmat4 x;\n"
23482 "out gl_PerVertex {\n"
23483 " vec4 gl_Position;\n"
23484 "};\n"
23485 "void main(){\n"
23486 " gl_Position = vec4(x[0][0]);\n"
23487 "}\n";
23488 char const *fsSource =
23489 "#version 450\n"
23490 "\n"
23491 "layout(location=0) out vec4 color;\n"
23492 "void main(){\n"
23493 " color = vec4(1);\n"
23494 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023495
23496 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23497 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23498
23499 VkPipelineObj pipe(m_device);
23500 pipe.AddColorAttachment();
23501 pipe.AddShader(&vs);
23502 pipe.AddShader(&fs);
23503
23504 pipe.AddVertexInputBindings(input_bindings, 1);
23505 pipe.AddVertexInputAttribs(input_attribs, 4);
23506
23507 VkDescriptorSetObj descriptorSet(m_device);
23508 descriptorSet.AppendDummy();
23509 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23510
23511 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23512
23513 m_errorMonitor->VerifyNotFound();
23514}
23515
23516TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
23517 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
23518 m_errorMonitor->ExpectSuccess();
23519
Tony Barbour1fa09702017-03-16 12:09:08 -060023520 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023521
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023522 char const *vsSource =
23523 "#version 450\n"
23524 "\n"
23525 "out gl_PerVertex {\n"
23526 " vec4 gl_Position;\n"
23527 "};\n"
23528 "void main(){\n"
23529 " gl_Position = vec4(1);\n"
23530 "}\n";
23531 char const *fsSource =
23532 "#version 450\n"
23533 "\n"
23534 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
23535 "layout(location=0) out vec4 color;\n"
23536 "void main() {\n"
23537 " color = subpassLoad(x);\n"
23538 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023539
23540 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23541 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23542
23543 VkPipelineObj pipe(m_device);
23544 pipe.AddShader(&vs);
23545 pipe.AddShader(&fs);
23546 pipe.AddColorAttachment();
23547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23548
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023549 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
23550 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023551 VkDescriptorSetLayout dsl;
23552 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23553 ASSERT_VK_SUCCESS(err);
23554
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023555 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023556 VkPipelineLayout pl;
23557 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23558 ASSERT_VK_SUCCESS(err);
23559
23560 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023561 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23562 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23563 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
23564 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23565 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 -060023566 };
23567 VkAttachmentReference color = {
23568 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23569 };
23570 VkAttachmentReference input = {
23571 1, VK_IMAGE_LAYOUT_GENERAL,
23572 };
23573
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023574 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023575
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023576 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023577 VkRenderPass rp;
23578 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23579 ASSERT_VK_SUCCESS(err);
23580
23581 // should be OK. would go wrong here if it's going to...
23582 pipe.CreateVKPipeline(pl, rp);
23583
23584 m_errorMonitor->VerifyNotFound();
23585
23586 vkDestroyRenderPass(m_device->device(), rp, nullptr);
23587 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23588 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23589}
23590
23591TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023592 TEST_DESCRIPTION(
23593 "Test that pipeline validation accepts a compute pipeline which declares a "
23594 "descriptor-backed resource which is not provided, but the shader does not "
23595 "statically use it. This is interesting because it requires compute pipelines "
23596 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023597 m_errorMonitor->ExpectSuccess();
23598
Tony Barbour1fa09702017-03-16 12:09:08 -060023599 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023600
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023601 char const *csSource =
23602 "#version 450\n"
23603 "\n"
23604 "layout(local_size_x=1) in;\n"
23605 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
23606 "void main(){\n"
23607 " // x is not used.\n"
23608 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023609
23610 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23611
23612 VkDescriptorSetObj descriptorSet(m_device);
23613 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23614
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023615 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23616 nullptr,
23617 0,
23618 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23619 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23620 descriptorSet.GetPipelineLayout(),
23621 VK_NULL_HANDLE,
23622 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023623
23624 VkPipeline pipe;
23625 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23626
23627 m_errorMonitor->VerifyNotFound();
23628
23629 if (err == VK_SUCCESS) {
23630 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23631 }
23632}
23633
23634TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023635 TEST_DESCRIPTION(
23636 "Test that pipeline validation accepts a shader consuming only the "
23637 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023638 m_errorMonitor->ExpectSuccess();
23639
Tony Barbour1fa09702017-03-16 12:09:08 -060023640 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023641
23642 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023643 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23644 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23645 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023646 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023647 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023648 VkDescriptorSetLayout dsl;
23649 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23650 ASSERT_VK_SUCCESS(err);
23651
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023652 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023653 VkPipelineLayout pl;
23654 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23655 ASSERT_VK_SUCCESS(err);
23656
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023657 char const *csSource =
23658 "#version 450\n"
23659 "\n"
23660 "layout(local_size_x=1) in;\n"
23661 "layout(set=0, binding=0) uniform sampler s;\n"
23662 "layout(set=0, binding=1) uniform texture2D t;\n"
23663 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23664 "void main() {\n"
23665 " x = texture(sampler2D(t, s), vec2(0));\n"
23666 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023667 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23668
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023669 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23670 nullptr,
23671 0,
23672 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23673 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23674 pl,
23675 VK_NULL_HANDLE,
23676 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023677
23678 VkPipeline pipe;
23679 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23680
23681 m_errorMonitor->VerifyNotFound();
23682
23683 if (err == VK_SUCCESS) {
23684 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23685 }
23686
23687 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23688 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23689}
23690
23691TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023692 TEST_DESCRIPTION(
23693 "Test that pipeline validation accepts a shader consuming only the "
23694 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023695 m_errorMonitor->ExpectSuccess();
23696
Tony Barbour1fa09702017-03-16 12:09:08 -060023697 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023698
23699 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023700 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23701 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23702 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023703 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023704 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023705 VkDescriptorSetLayout dsl;
23706 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23707 ASSERT_VK_SUCCESS(err);
23708
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023709 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023710 VkPipelineLayout pl;
23711 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23712 ASSERT_VK_SUCCESS(err);
23713
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023714 char const *csSource =
23715 "#version 450\n"
23716 "\n"
23717 "layout(local_size_x=1) in;\n"
23718 "layout(set=0, binding=0) uniform texture2D t;\n"
23719 "layout(set=0, binding=1) uniform sampler s;\n"
23720 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23721 "void main() {\n"
23722 " x = texture(sampler2D(t, s), vec2(0));\n"
23723 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023724 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23725
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023726 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23727 nullptr,
23728 0,
23729 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23730 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23731 pl,
23732 VK_NULL_HANDLE,
23733 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023734
23735 VkPipeline pipe;
23736 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23737
23738 m_errorMonitor->VerifyNotFound();
23739
23740 if (err == VK_SUCCESS) {
23741 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23742 }
23743
23744 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23745 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23746}
23747
23748TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023749 TEST_DESCRIPTION(
23750 "Test that pipeline validation accepts a shader consuming "
23751 "both the sampler and the image of a combined image+sampler "
23752 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023753 m_errorMonitor->ExpectSuccess();
23754
Tony Barbour1fa09702017-03-16 12:09:08 -060023755 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023756
23757 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023758 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23759 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023760 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023761 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023762 VkDescriptorSetLayout dsl;
23763 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23764 ASSERT_VK_SUCCESS(err);
23765
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023766 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023767 VkPipelineLayout pl;
23768 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23769 ASSERT_VK_SUCCESS(err);
23770
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023771 char const *csSource =
23772 "#version 450\n"
23773 "\n"
23774 "layout(local_size_x=1) in;\n"
23775 "layout(set=0, binding=0) uniform texture2D t;\n"
23776 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23777 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23778 "void main() {\n"
23779 " x = texture(sampler2D(t, s), vec2(0));\n"
23780 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023781 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23782
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023783 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23784 nullptr,
23785 0,
23786 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23787 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23788 pl,
23789 VK_NULL_HANDLE,
23790 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023791
23792 VkPipeline pipe;
23793 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23794
23795 m_errorMonitor->VerifyNotFound();
23796
23797 if (err == VK_SUCCESS) {
23798 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23799 }
23800
23801 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23802 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23803}
23804
Tony Barbour3ed87a02017-03-15 16:19:02 -060023805TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023806 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23807
Tony Barbour3ed87a02017-03-15 16:19:02 -060023808 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023809 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023810
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023811 // Ensure that extension is available and enabled.
23812 uint32_t extension_count = 0;
23813 bool supports_maintenance1_extension = false;
23814 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23815 ASSERT_VK_SUCCESS(err);
23816 if (extension_count > 0) {
23817 std::vector<VkExtensionProperties> available_extensions(extension_count);
23818
23819 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23820 ASSERT_VK_SUCCESS(err);
23821 for (const auto &extension_props : available_extensions) {
23822 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23823 supports_maintenance1_extension = true;
23824 }
23825 }
23826 }
23827
23828 // Proceed if extension is supported by hardware
23829 if (!supports_maintenance1_extension) {
23830 printf(" Maintenance1 Extension not supported, skipping tests\n");
23831 return;
23832 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023833
23834 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023835 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023836 VkCommandBuffer cmd_buf;
23837 VkCommandBufferAllocateInfo alloc_info;
23838 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23839 alloc_info.pNext = NULL;
23840 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023841 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023842 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23843 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23844
23845 VkCommandBufferBeginInfo cb_binfo;
23846 cb_binfo.pNext = NULL;
23847 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23848 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23849 cb_binfo.flags = 0;
23850 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23851 // Set Negative height, should give error if Maintenance 1 is not enabled
23852 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23853 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23854 vkEndCommandBuffer(cmd_buf);
23855
23856 m_errorMonitor->VerifyNotFound();
23857}
23858
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023859TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23860 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23861
23862 ASSERT_NO_FATAL_FAILURE(Init());
23863
23864 uint32_t extension_count = 0;
23865 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23866 ASSERT_VK_SUCCESS(err);
23867
23868 if (extension_count > 0) {
23869 std::vector<VkExtensionProperties> available_extensions(extension_count);
23870 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23871 ASSERT_VK_SUCCESS(err);
23872
23873 for (const auto &extension_props : available_extensions) {
23874 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23875 // Create two pNext structures which by themselves would be valid
23876 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23877 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23878 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23879 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23880 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23881
23882 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23883 dedicated_buffer_create_info_2.pNext = nullptr;
23884 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23885
23886 uint32_t queue_family_index = 0;
23887 VkBufferCreateInfo buffer_create_info = {};
23888 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23889 buffer_create_info.pNext = &dedicated_buffer_create_info;
23890 buffer_create_info.size = 1024;
23891 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23892 buffer_create_info.queueFamilyIndexCount = 1;
23893 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23894
23895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23896 VkBuffer buffer;
23897 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23898 m_errorMonitor->VerifyFound();
23899 }
23900 }
23901 }
23902}
23903
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023904TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23905 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23906
Tony Barbour1fa09702017-03-16 12:09:08 -060023907 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023908
23909 // Positive test to check parameter_validation and unique_objects support
23910 // for NV_dedicated_allocation
23911 uint32_t extension_count = 0;
23912 bool supports_nv_dedicated_allocation = false;
23913 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23914 ASSERT_VK_SUCCESS(err);
23915
23916 if (extension_count > 0) {
23917 std::vector<VkExtensionProperties> available_extensions(extension_count);
23918
23919 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23920 ASSERT_VK_SUCCESS(err);
23921
23922 for (const auto &extension_props : available_extensions) {
23923 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23924 supports_nv_dedicated_allocation = true;
23925 }
23926 }
23927 }
23928
23929 if (supports_nv_dedicated_allocation) {
23930 m_errorMonitor->ExpectSuccess();
23931
23932 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23933 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23934 dedicated_buffer_create_info.pNext = nullptr;
23935 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23936
23937 uint32_t queue_family_index = 0;
23938 VkBufferCreateInfo buffer_create_info = {};
23939 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23940 buffer_create_info.pNext = &dedicated_buffer_create_info;
23941 buffer_create_info.size = 1024;
23942 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23943 buffer_create_info.queueFamilyIndexCount = 1;
23944 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23945
23946 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023947 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023948 ASSERT_VK_SUCCESS(err);
23949
23950 VkMemoryRequirements memory_reqs;
23951 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23952
23953 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23954 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23955 dedicated_memory_info.pNext = nullptr;
23956 dedicated_memory_info.buffer = buffer;
23957 dedicated_memory_info.image = VK_NULL_HANDLE;
23958
23959 VkMemoryAllocateInfo memory_info = {};
23960 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23961 memory_info.pNext = &dedicated_memory_info;
23962 memory_info.allocationSize = memory_reqs.size;
23963
23964 bool pass;
23965 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23966 ASSERT_TRUE(pass);
23967
23968 VkDeviceMemory buffer_memory;
23969 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23970 ASSERT_VK_SUCCESS(err);
23971
23972 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
23973 ASSERT_VK_SUCCESS(err);
23974
23975 vkDestroyBuffer(m_device->device(), buffer, NULL);
23976 vkFreeMemory(m_device->device(), buffer_memory, NULL);
23977
23978 m_errorMonitor->VerifyNotFound();
23979 }
23980}
23981
23982TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23983 VkResult err;
23984
23985 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23986
Tony Barbour1fa09702017-03-16 12:09:08 -060023987 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23989
23990 std::vector<const char *> device_extension_names;
23991 auto features = m_device->phy().features();
23992 // Artificially disable support for non-solid fill modes
23993 features.fillModeNonSolid = false;
23994 // The sacrificial device object
23995 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23996
23997 VkRenderpassObj render_pass(&test_device);
23998
23999 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
24000 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
24001 pipeline_layout_ci.setLayoutCount = 0;
24002 pipeline_layout_ci.pSetLayouts = NULL;
24003
24004 VkPipelineLayout pipeline_layout;
24005 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
24006 ASSERT_VK_SUCCESS(err);
24007
24008 VkPipelineRasterizationStateCreateInfo rs_ci = {};
24009 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
24010 rs_ci.pNext = nullptr;
24011 rs_ci.lineWidth = 1.0f;
24012 rs_ci.rasterizerDiscardEnable = true;
24013
24014 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
24015 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
24016
24017 // Set polygonMode=FILL. No error is expected
24018 m_errorMonitor->ExpectSuccess();
24019 {
24020 VkPipelineObj pipe(&test_device);
24021 pipe.AddShader(&vs);
24022 pipe.AddShader(&fs);
24023 pipe.AddColorAttachment();
24024 // Set polygonMode to a good value
24025 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
24026 pipe.SetRasterization(&rs_ci);
24027 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
24028 }
24029 m_errorMonitor->VerifyNotFound();
24030
24031 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
24032}
24033
Dave Houlton1150cf52017-04-27 14:38:11 -060024034TEST_F(VkPositiveLayerTest, LongSemaphoreChain) {
Chris Forbes94196952017-04-06 16:30:59 -070024035 m_errorMonitor->ExpectSuccess();
24036
24037 ASSERT_NO_FATAL_FAILURE(Init());
24038 VkResult err;
24039
24040 std::vector<VkSemaphore> semaphores;
24041
24042 const int chainLength = 32768;
24043 VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
24044
24045 for (int i = 0; i < chainLength; i++) {
Dave Houlton1150cf52017-04-27 14:38:11 -060024046 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024047 VkSemaphore semaphore;
24048 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &semaphore);
24049 ASSERT_VK_SUCCESS(err);
24050
24051 semaphores.push_back(semaphore);
24052
Chris Forbesfc50aaa2017-05-01 10:20:17 -070024053 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO,
24054 nullptr,
24055 semaphores.size() > 1 ? 1u : 0u,
24056 semaphores.size() > 1 ? &semaphores[semaphores.size() - 2] : nullptr,
24057 &flags,
24058 0,
24059 nullptr,
24060 1,
24061 &semaphores[semaphores.size() - 1]};
Chris Forbes94196952017-04-06 16:30:59 -070024062 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
24063 ASSERT_VK_SUCCESS(err);
24064 }
24065
Dave Houlton1150cf52017-04-27 14:38:11 -060024066 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024067 VkFence fence;
24068 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24069 ASSERT_VK_SUCCESS(err);
Dave Houlton1150cf52017-04-27 14:38:11 -060024070 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &semaphores.back(), &flags, 0, nullptr, 0, nullptr};
Chris Forbes94196952017-04-06 16:30:59 -070024071 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24072 ASSERT_VK_SUCCESS(err);
24073
24074 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
24075
Dave Houlton1150cf52017-04-27 14:38:11 -060024076 for (auto semaphore : semaphores) vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Chris Forbes94196952017-04-06 16:30:59 -070024077
24078 vkDestroyFence(m_device->device(), fence, nullptr);
24079
24080 m_errorMonitor->VerifyNotFound();
24081}
24082
Mike Stroyanca855662017-05-02 11:06:27 -060024083extern "C" void *ReleaseNullFence(void *arg) {
24084 struct thread_data_struct *data = (struct thread_data_struct *)arg;
24085
24086 for (int i = 0; i < 40000; i++) {
24087 vkDestroyFence(data->device, VK_NULL_HANDLE, NULL);
24088 if (data->bailout) {
24089 break;
24090 }
24091 }
24092 return NULL;
24093}
24094
24095TEST_F(VkPositiveLayerTest, ThreadNullFenceCollision) {
24096 test_platform_thread thread;
24097
24098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
24099
24100 ASSERT_NO_FATAL_FAILURE(Init());
24101
24102 struct thread_data_struct data;
24103 data.device = m_device->device();
24104 data.bailout = false;
24105 m_errorMonitor->SetBailout(&data.bailout);
24106
24107 // Call vkDestroyFence of VK_NULL_HANDLE repeatedly using multiple threads.
24108 // There should be no validation error from collision of that non-object.
24109 test_platform_thread_create(&thread, ReleaseNullFence, (void *)&data);
24110 for (int i = 0; i < 40000; i++) {
24111 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
24112 }
24113 test_platform_thread_join(thread, NULL);
24114
24115 m_errorMonitor->SetBailout(NULL);
24116
24117 m_errorMonitor->VerifyNotFound();
24118}
24119
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024120#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024121TEST_F(VkPositiveLayerTest, LongFenceChain)
24122{
24123 m_errorMonitor->ExpectSuccess();
24124
Tony Barbour1fa09702017-03-16 12:09:08 -060024125 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024126 VkResult err;
24127
24128 std::vector<VkFence> fences;
24129
24130 const int chainLength = 32768;
24131
24132 for (int i = 0; i < chainLength; i++) {
24133 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
24134 VkFence fence;
24135 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24136 ASSERT_VK_SUCCESS(err);
24137
24138 fences.push_back(fence);
24139
24140 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
24141 0, nullptr, 0, nullptr };
24142 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24143 ASSERT_VK_SUCCESS(err);
24144
24145 }
24146
24147 // BOOM, stack overflow.
24148 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
24149
24150 for (auto fence : fences)
24151 vkDestroyFence(m_device->device(), fence, nullptr);
24152
24153 m_errorMonitor->VerifyNotFound();
24154}
24155#endif
24156
Cody Northrop1242dfd2016-07-13 17:24:59 -060024157#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060024158const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060024159static bool initialized = false;
24160static bool active = false;
24161
24162// Convert Intents to argv
24163// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024164std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024165 std::vector<std::string> args;
24166 JavaVM &vm = *app.activity->vm;
24167 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024168 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024169
24170 JNIEnv &env = *p_env;
24171 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024172 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024173 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024174 jmethodID get_string_extra_method =
24175 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024176 jvalue get_string_extra_args;
24177 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024178 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060024179
24180 std::string args_str;
24181 if (extra_str) {
24182 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
24183 args_str = extra_utf;
24184 env.ReleaseStringUTFChars(extra_str, extra_utf);
24185 env.DeleteLocalRef(extra_str);
24186 }
24187
24188 env.DeleteLocalRef(get_string_extra_args.l);
24189 env.DeleteLocalRef(intent);
24190 vm.DetachCurrentThread();
24191
24192 // split args_str
24193 std::stringstream ss(args_str);
24194 std::string arg;
24195 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024196 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024197 }
24198
24199 return args;
24200}
24201
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024202void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
24203 const char *const type_param = test_info.type_param();
24204 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060024205
24206 if (type_param != NULL || value_param != NULL) {
24207 error_message.append(", where ");
24208 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024209 error_message.append("TypeParam = ").append(type_param);
24210 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060024211 }
24212 if (value_param != NULL) {
24213 error_message.append("GetParam() = ").append(value_param);
24214 }
24215 }
24216}
24217
24218// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
24219class LogcatPrinter : public ::testing::EmptyTestEventListener {
24220 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024221 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024222 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
24223 }
24224
24225 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024226 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060024227 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024228 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060024229
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024230 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
24231 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060024232 }
24233
24234 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024235 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024236 std::string result;
24237 if (info.result()->Passed()) {
24238 result.append("[ OK ]");
24239 } else {
24240 result.append("[ FAILED ]");
24241 }
24242 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024243 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060024244
24245 if (::testing::GTEST_FLAG(print_time)) {
24246 std::ostringstream os;
24247 os << info.result()->elapsed_time();
24248 result.append(" (").append(os.str()).append(" ms)");
24249 }
24250
24251 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
24252 };
24253};
24254
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024255static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024256
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024257static void processCommand(struct android_app *app, int32_t cmd) {
24258 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024259 case APP_CMD_INIT_WINDOW: {
24260 if (app->window) {
24261 initialized = true;
24262 }
24263 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024264 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024265 case APP_CMD_GAINED_FOCUS: {
24266 active = true;
24267 break;
24268 }
24269 case APP_CMD_LOST_FOCUS: {
24270 active = false;
24271 break;
24272 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024273 }
24274}
24275
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024276void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024277 app_dummy();
24278
Cody Northrop1242dfd2016-07-13 17:24:59 -060024279 int vulkanSupport = InitVulkan();
24280 if (vulkanSupport == 0) {
24281 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
24282 return;
24283 }
24284
24285 app->onAppCmd = processCommand;
24286 app->onInputEvent = processInput;
24287
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024288 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024289 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024290 struct android_poll_source *source;
24291 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024292 if (source) {
24293 source->process(app, source);
24294 }
24295
24296 if (app->destroyRequested != 0) {
24297 VkTestFramework::Finish();
24298 return;
24299 }
24300 }
24301
24302 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024303 // Use the following key to send arguments to gtest, i.e.
24304 // --es args "--gtest_filter=-VkLayerTest.foo"
24305 const char key[] = "args";
24306 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024307
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024308 std::string filter = "";
24309 if (args.size() > 0) {
24310 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
24311 filter += args[0];
24312 } else {
24313 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
24314 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024315
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024316 int argc = 2;
24317 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
24318 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024319
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024320 // Route output to files until we can override the gtest output
24321 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
24322 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024324 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060024325
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024326 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060024327 listeners.Append(new LogcatPrinter);
24328
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024329 VkTestFramework::InitArgs(&argc, argv);
24330 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024331
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024332 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024333
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024334 if (result != 0) {
24335 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
24336 } else {
24337 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
24338 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024339
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024340 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024341
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024342 fclose(stdout);
24343 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024345 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024346 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024347 }
24348 }
24349}
24350#endif
24351
Tony Barbour300a6082015-04-07 13:44:53 -060024352int main(int argc, char **argv) {
24353 int result;
24354
Cody Northrop8e54a402016-03-08 22:25:52 -070024355#ifdef ANDROID
24356 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024357 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070024358#endif
24359
Tony Barbour300a6082015-04-07 13:44:53 -060024360 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060024361 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060024362
24363 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
24364
24365 result = RUN_ALL_TESTS();
24366
Tony Barbour6918cd52015-04-09 12:58:51 -060024367 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060024368 return result;
24369}